感谢你对 Hermes Agent 的贡献!本指南涵盖开发环境设置、理解代码库以及如何让你的 PR 被合并。 我们按以下顺序重视贡献: 1. Bug 修复 — 崩溃、不正确行为、数据丢失 2. 跨平台兼容性 — macOS、不同 Linux 发行版、WSL2 3. 安全加固 — Shell 注入、Prompt 注入、路

贡献指南

> 📖 本文档翻译自 Hermes Agent 官方文档 > 最后更新:2026-04-16


贡献指南

感谢你对 Hermes Agent 的贡献!本指南涵盖开发环境设置、理解代码库以及如何让你的 PR 被合并。

贡献优先级

我们按以下顺序重视贡献:

  1. Bug 修复 — 崩溃、不正确行为、数据丢失
  2. 跨平台兼容性 — macOS、不同 Linux 发行版、WSL2
  3. 安全加固 — Shell 注入、Prompt 注入、路径遍历
  4. 性能和健壮性 — 重试逻辑、错误处理、优雅降级
  5. 新技能 — 广泛有用的技能(参见创建技能
  6. 新工具 — 很少需要;大多数功能应该是技能
  7. 文档 — 修复、澄清、新示例

常见贡献路径

开发环境设置

前置条件

要求说明
Git需支持 --recurse-submodules
Python 3.11+缺失时 uv 会自动安装
uvFast Python package manager (install)
Node.js 18+可选——浏览器工具和 WhatsApp 桥接需要

克隆并安装

git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git
cd hermes-agent

# 使用 Python 3.11 创建虚拟环境
uv venv venv --python 3.11
export VIRTUAL_ENV="$(pwd)/venv"

# 安装所有扩展(消息、定时任务、CLI 菜单、开发工具)
uv pip install -e ".[all,dev]"
uv pip install -e "./tinker-atropos"

# 可选:浏览器工具
npm install

配置开发环境

mkdir -p ~/.hermes/{cron,sessions,logs,memories,skills}
cp cli-config.yaml.example ~/.hermes/config.yaml
touch ~/.hermes/.env

# 至少添加一个 LLM Provider 密钥:
echo 'OPENROUTER_API_KEY=*** >> ~/.hermes/.env

运行

# 创建全局访问的符号链接
mkdir -p ~/.local/bin
ln -sf "$(pwd)/venv/bin/hermes" ~/.local/bin/hermes

# 验证
hermes doctor
hermes chat -q "Hello"

运行测试

pytest tests/ -v

代码风格

  • PEP 8,但允许实际例外(不强制行长度限制)
  • 注释:仅在解释非显而易见的意图、权衡或 API 怪癖时使用
  • 错误处理:捕获特定异常。对意外错误使用 logger.warning()/logger.error() 并传入 exc_info=True
  • 跨平台:永远不要假设 Unix(见下文)
  • Profile 安全路径:永远不要硬编码 ~/.hermes——代码路径使用 hermes_constants 中的 get_hermes_home(),面向用户的消息使用 display_hermes_home()。完整规则参见 AGENTS.md

跨平台兼容性

Hermes 官方支持 Linux、macOS 和 WSL2。原生 Windows 不受支持,但代码库包含一些防御性编码模式以避免边缘情况下的硬崩溃。关键规则:

1. termiosfcntl 仅限 Unix

始终同时捕获 ImportErrorNotImplementedError

try:
    from simple_term_menu import TerminalMenu
    menu = TerminalMenu(options)
    idx = menu.show()
except (ImportError, NotImplementedError):
    # Fallback: numbered menu
    for i, opt in enumerate(options):
        print(f"  {i+1}. {opt}")
    idx = int(input("Choice: ")) - 1

2. 文件编码

某些环境可能以非 UTF-8 编码保存 .env 文件:

try:
    load_dotenv(env_path)
except UnicodeDecodeError:
    load_dotenv(env_path, encoding="latin-1")

3. 进程管理

os.setsid()os.killpg() 和信号处理在不同平台上行为不同:

import platform
if platform.system() != "Windows":
    kwargs["preexec_fn"] = os.setsid

4. 路径分隔符

使用 pathlib.Path 而不是用 / 进行字符串拼接。

安全注意事项

Hermes 拥有终端访问权限。安全很重要。

现有保护措施

层级实现方式
Sudo 密码管道使用 shlex.quote() 防止 Shell 注入
危险命令检测tools/approval.py 中的正则模式,带用户审批流程
Cron Prompt 注入扫描器阻止指令覆盖模式
写入拒绝列表受保护路径通过 os.path.realpath() 解析以防止符号链接绕过
技能防护Hub 安装技能的安全扫描器
代码执行沙盒子进程运行时剥离 API 密钥
容器加固Docker:丢弃所有能力,无特权升级,PID 限制

贡献安全敏感代码

  • 将用户输入插入 Shell 命令时始终使用 shlex.quote()
  • 访问控制检查前使用 os.path.realpath() 解析符号链接
  • 不要记录密钥
  • 在工具执行周围捕获宽泛异常
  • 如果你的更改涉及文件路径或进程,请在所有平台上测试

Pull Request 流程

分支命名

fix/description        # Bug fixes
feat/description       # New features
docs/description       # Documentation
test/description       # Tests
refactor/description   # Code restructuring

提交前

  1. 运行测试pytest tests/ -v
  2. 手动测试:运行 hermes 并执行你更改的代码路径
  3. 检查跨平台影响:考虑 macOS 和不同 Linux 发行版
  4. 保持 PR 聚焦:每个 PR 一个逻辑变更

PR 描述

包含:

  • 改了什么以及为什么改
  • 如何测试
  • 哪些平台上测试过
  • 引用任何相关的 issue

提交消息

我们使用 约定式提交

<type>(<scope>): <description>
类型用途
fixBug 修复
feat新功能
docs文档
test测试
refactor代码重构
chore构建、CI、依赖更新

范围:cligatewaytoolsskillsagentinstallwhatsappsecurity

示例:

fix(cli): prevent crash in save_config_value when model is a string
feat(gateway): add WhatsApp multi-user session isolation
fix(security): prevent shell injection in sudo password piping

报告问题

  • 使用 GitHub Issues
  • 包含:操作系统、Python 版本、Hermes 版本(hermes version)、完整错误堆栈
  • 包含复现步骤
  • 创建新 issue 前先检查是否已有重复
  • 安全漏洞请私下报告

社区

  • Discord: discord.gg/NousResearch
  • GitHub Discussions:用于设计提案和架构讨论
  • Skills Hub:上传专业技能并与社区分享

许可证

参与贡献即表示你同意你的贡献将在 MIT 许可证 下授权。

Continue Exploring

继续探索

这不是课程式的上一篇下一篇,而是从当前节点向外继续漫游。

开发者指南

创建技能(Skills)

原文链接:Creating Skills sidebar position: 3 title: "创建技能" description: "如何为 Hermes Agent 创建技能——SKILL.md 格式、指南和发布" 技能(Skills)是为 Hermes Agent 添加新功能的首选方式。它们比工具更容易创建,不

开发者指南

添加工具

sidebar position: 2 title: "添加工具" description: "如何向 Hermes Agent 添加新工具——Schema、处理器、注册和工具集" 在编写工具之前,先问自己: 这应该是一个 Skill(技能) 吗? 当能力可以用指令 + Shell 命令 + 现有工具表达时,将其作为

开发者指南

添加 Provider

sidebar position: 5 title: "添加 Provider" description: "如何向 Hermes Agent 添加新的推理 Provider——认证、运行时解析、CLI 流程、适配器、测试和文档" Hermes 已经可以通过自定义 Provider 路径与任何 OpenAI 兼容端点通

开发者指南

架构

本页面是 Hermes Agent 内部结构的顶层地图. 使用它来了解代码库的整体结构,然后深入子系统文档获取实现细节。 如果你是首次接触此代码库: 1. 本页面 — 了解整体结构 2. Agent 循环内部机制 — AIAgent 如何工作 3. 提示词组装 — 系统提示词构建

开发者指南

Agent 循环内部机制

sidebar position: 3 title: "Agent 循环内部机制" description: "AIAgent 执行、API 模式、工具、回调和回退行为的详细解析" 核心编排引擎是 run agent.py 中的 AIAgent 类——大约 10,700 行代码,负责从 Prompt(提示词)组装到工具

开发者指南

提示词组装

sidebar position: 5 title: "提示词组装" description: "Hermes 如何构建系统提示词、保持缓存稳定性和注入临时层" Hermes 刻意将以下两者分离: - 缓存的系统提示词状态 - 临时的 API 调用时添加内容 这是项目中最关键的设计决策之一,因为它影响:

Developer Guide

开发者指南

面向二次开发者,解释架构、运行时、上下文引擎、插件、工具与扩展机制。

20 篇文档20 个节点

当前节点

贡献指南

同主题继续探索

架构

本页面是 Hermes Agent 内部结构的顶层地图. 使用它来了解代码库的整体结构,然后深入子系统文档获取实现细节。 如果你是首次接触此代码库: 1. 本页面 — 了解整体结构 2. Agent 循环内部机制 — AIAgent 如何工作 3. 提示词组装 — 系统提示词构建

Agent 循环内部机制

sidebar position: 3 title: "Agent 循环内部机制" description: "AIAgent 执行、API 模式、工具、回调和回退行为的详细解析" 核心编排引擎是 run agent.py 中的 AIAgent 类——大约 10,700 行代码,负责从 Prompt(提示词)组装到工具

提示词组装

sidebar position: 5 title: "提示词组装" description: "Hermes 如何构建系统提示词、保持缓存稳定性和注入临时层" Hermes 刻意将以下两者分离: - 缓存的系统提示词状态 - 临时的 API 调用时添加内容 这是项目中最关键的设计决策之一,因为它影响:

上下文压缩与缓存

Hermes Agent 使用双重压缩系统和 Anthropic 提示词缓存,在长对话中高效管理上下文窗口的使用。 源文件:agent/context engine.py(ABC)、agent/context compressor.py(默认引擎)、agent/prompt caching.py、gateway/run

网关内部机制

sidebar position: 7 title: "网关内部机制" description: "消息网关如何启动、授权用户、路由会话和投递消息" 消息网关是一个长运行进程,通过统一架构将 Hermes 连接到 14+ 个外部消息平台。 当消息从任何平台到达时: 1. 平台适配器 接收原始事件,将其规范化为 Mess

会话存储

Hermes Agent 使用 SQLite 数据库( /.hermes/state.db)来持久化会话元数据、完整消息历史和模型配置,覆盖 CLI 和网关会话。这取代了早期基于每个会话 JSONL 文件的方式。 源文件:hermes state.py 关键设计决策: - WAL 模式 用于并发读取 + 单个写入器(网

相关节点

创建技能(Skills)

原文链接:Creating Skills sidebar position: 3 title: "创建技能" description: "如何为 Hermes Agent 创建技能——SKILL.md 格式、指南和发布" 技能(Skills)是为 Hermes Agent 添加新功能的首选方式。它们比工具更容易创建,不

添加工具

sidebar position: 2 title: "添加工具" description: "如何向 Hermes Agent 添加新工具——Schema、处理器、注册和工具集" 在编写工具之前,先问自己: 这应该是一个 Skill(技能) 吗? 当能力可以用指令 + Shell 命令 + 现有工具表达时,将其作为

添加 Provider

sidebar position: 5 title: "添加 Provider" description: "如何向 Hermes Agent 添加新的推理 Provider——认证、运行时解析、CLI 流程、适配器、测试和文档" Hermes 已经可以通过自定义 Provider 路径与任何 OpenAI 兼容端点通

架构

本页面是 Hermes Agent 内部结构的顶层地图. 使用它来了解代码库的整体结构,然后深入子系统文档获取实现细节。 如果你是首次接触此代码库: 1. 本页面 — 了解整体结构 2. Agent 循环内部机制 — AIAgent 如何工作 3. 提示词组装 — 系统提示词构建

Agent 循环内部机制

sidebar position: 3 title: "Agent 循环内部机制" description: "AIAgent 执行、API 模式、工具、回调和回退行为的详细解析" 核心编排引擎是 run agent.py 中的 AIAgent 类——大约 10,700 行代码,负责从 Prompt(提示词)组装到工具

提示词组装

sidebar position: 5 title: "提示词组装" description: "Hermes 如何构建系统提示词、保持缓存稳定性和注入临时层" Hermes 刻意将以下两者分离: - 缓存的系统提示词状态 - 临时的 API 调用时添加内容 这是项目中最关键的设计决策之一,因为它影响: