跳到主要内容

架构

本页是 Hermes Agent 内部结构的顶层导图。请先在此建立整体认知,再深入各子系统的专项文档。

系统概览

┌─────────────────────────────────────────────────────────────────────┐
│ Entry Points │
│ │
│ CLI (cli.py) Gateway (gateway/run.py) ACP (acp_adapter/) │
│ Batch Runner API Server Python Library │
└──────────┬──────────────┬───────────────────────┬───────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ AIAgent (run_agent.py) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Prompt │ │ Provider │ │ Tool │ │
│ │ Builder │ │ Resolution │ │ Dispatch │ │
│ │ (prompt_ │ │ (runtime_ │ │ (model_ │ │
│ │ builder.py) │ │ provider.py)│ │ tools.py) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ┌──────┴───────┐ ┌──────┴───────┐ ┌──────┴───────┐ │
│ │ Compression │ │ 3 API Modes │ │ Tool Registry│ │
│ │ & Caching │ │ chat_compl. │ │ (registry.py)│ │
│ │ │ │ codex_resp. │ │ 70+ tools │ │
│ │ │ │ anthropic │ │ ~28 toolsets │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────┴─────────────────┴─────────────────┴───────────────────────┘
│ │
▼ ▼
┌───────────────────┐ ┌──────────────────────┐
│ Session Storage │ │ Tool Backends │
│ (SQLite + FTS5) │ │ Terminal (7 backends) │
│ hermes_state.py │ │ Browser (5 backends) │
│ gateway/session.py│ │ Web (4 backends) │
└───────────────────┘ │ MCP (dynamic) │
│ File, Vision, etc. │
└──────────────────────┘

目录结构

hermes-agent/
├── run_agent.py # AIAgent — 核心对话循环(大文件)
├── cli.py # HermesCLI — 交互式终端 UI(大文件)
├── model_tools.py # 工具发现、Schema 收集、调度
├── toolsets.py # 工具集分组与平台预设
├── hermes_state.py # 带 FTS5 的 SQLite 会话/状态数据库
├── hermes_constants.py # HERMES_HOME、感知配置文件的路径
├── batch_runner.py # 批量轨迹生成

├── agent/ # Agent 内部模块
│ ├── prompt_builder.py # 系统提示词组装
│ ├── context_engine.py # ContextEngine ABC(可插拔)
│ ├── context_compressor.py # 默认引擎——有损摘要压缩
│ ├── prompt_caching.py # Anthropic 提示词缓存
│ ├── auxiliary_client.py # 辅助 LLM(视觉、摘要等旁路任务)
│ ├── model_metadata.py # 模型上下文长度、Token 估算
│ ├── models_dev.py # models.dev 注册表集成
│ ├── anthropic_adapter.py # Anthropic Messages API 格式转换
│ ├── display.py # KawaiiSpinner、工具预览格式化
│ ├── skill_commands.py # 技能斜杠命令
│ ├── memory_manager.py # 记忆管理器编排
│ ├── memory_provider.py # 记忆提供商 ABC
│ └── trajectory.py # 轨迹保存辅助函数

├── hermes_cli/ # CLI 子命令与安装设置
│ ├── main.py # 入口——所有 `hermes` 子命令(大文件)
│ ├── config.py # DEFAULT_CONFIG、OPTIONAL_ENV_VARS、迁移
│ ├── commands.py # COMMAND_REGISTRY——斜杠命令中央定义
│ ├── auth.py # PROVIDER_REGISTRY、凭证解析
│ ├── runtime_provider.py # 提供商 → api_mode + 凭证
│ ├── models.py # 模型目录、提供商模型列表
│ ├── model_switch.py # /model 命令逻辑(CLI + gateway 共用)
│ ├── setup.py # 交互式安装向导(大文件)
│ ├── skin_engine.py # CLI 主题引擎
│ ├── skills_config.py # hermes skills——按平台启用/禁用
│ ├── skills_hub.py # /skills 斜杠命令
│ ├── tools_config.py # hermes tools——按平台启用/禁用
│ ├── plugins.py # PluginManager——发现、加载、钩子
│ ├── callbacks.py # 终端回调(clarify、sudo、approval)
│ └── gateway.py # hermes gateway 启动/停止

├── tools/ # 工具实现(每个工具一个文件)
│ ├── registry.py # 中央工具注册表
│ ├── approval.py # 危险命令检测
│ ├── terminal_tool.py # 终端编排
│ ├── process_registry.py # 后台进程管理
│ ├── file_tools.py # read_file、write_file、patch、search_files
│ ├── web_tools.py # web_search、web_extract
│ ├── browser_tool.py # 10 个浏览器自动化工具
│ ├── code_execution_tool.py # execute_code 沙箱
│ ├── delegate_tool.py # 子 Agent 委派
│ ├── mcp_tool.py # MCP 客户端(大文件)
│ ├── credential_files.py # 基于文件的凭证透传
│ ├── env_passthrough.py # 沙箱环境变量透传
│ ├── ansi_strip.py # ANSI 转义序列剥除
│ └── environments/ # 终端后端(local、docker、ssh、modal、daytona、singularity)

├── gateway/ # 消息平台网关
│ ├── run.py # GatewayRunner——消息调度(大文件)
│ ├── session.py # SessionStore——对话持久化
│ ├── delivery.py # 出站消息投递
│ ├── pairing.py # DM 配对授权
│ ├── hooks.py # 钩子发现与生命周期事件
│ ├── mirror.py # 跨会话消息镜像
│ ├── status.py # Token 锁、配置文件级进程追踪
│ ├── builtin_hooks/ # 始终注册的钩子扩展点(当前未内置)
│ └── platforms/ # 20 个适配器:telegram、discord、slack、whatsapp、
│ # signal、matrix、mattermost、email、sms、
│ # dingtalk、feishu、wecom、wecom_callback、weixin、
│ # bluebubbles、qqbot、homeassistant、webhook、api_server、
│ # yuanbao

├── acp_adapter/ # ACP 服务器(VS Code / Zed / JetBrains)
├── cron/ # 调度器(jobs.py、scheduler.py)
├── plugins/memory/ # 记忆提供商插件
├── plugins/context_engine/ # 上下文引擎插件
├── skills/ # 内置技能(始终可用)
├── optional-skills/ # 官方可选技能(需显式安装)
├── website/ # Docusaurus 文档站
└── tests/ # Pytest 测试套件(3,000+ 个测试)

数据流

CLI 会话

用户输入 → HermesCLI.process_input()
→ AIAgent.run_conversation()
→ prompt_builder.build_system_prompt()
→ runtime_provider.resolve_runtime_provider()
→ API 调用(chat_completions / codex_responses / anthropic_messages)
→ tool_calls? → model_tools.handle_function_call() → 循环
→ 最终响应 → 展示 → 保存到 SessionDB

Gateway 消息

平台事件 → Adapter.on_message() → MessageEvent
→ GatewayRunner._handle_message()
→ 授权用户
→ 解析会话 key
→ 创建带历史的 AIAgent
→ AIAgent.run_conversation()
→ 通过适配器回传响应

定时任务

调度器 tick → 从 jobs.json 加载到期任务
→ 创建全新 AIAgent(无历史)
→ 注入关联技能作为上下文
→ 运行任务提示词
→ 投递响应到目标平台
→ 更新任务状态与 next_run

推荐阅读顺序

若你是第一次接触代码库:

  1. 本页 — 建立全局认知
  2. Agent 循环内部原理 — AIAgent 的工作机制
  3. 提示词组装 — 系统提示词的构建过程
  4. 提供商运行时解析 — 提供商的选择方式
  5. 添加提供商 — 新增提供商的实操指南
  6. 工具运行时 — 工具注册表、调度、环境
  7. 会话存储 — SQLite Schema、FTS5、会话血缘
  8. Gateway 内部原理 — 消息平台网关
  9. 上下文压缩与提示词缓存 — 压缩与缓存
  10. ACP 内部原理 — IDE 集成

主要子系统

Agent 循环

同步编排引擎(run_agent.py 中的 AIAgent)。负责提供商选择、提示词构建、工具执行、重试、故障转移、回调、压缩与持久化。支持三种 API 模式以适配不同提供商后端。

Agent 循环内部原理

提示词系统

跨对话生命周期的提示词构建与维护:

  • prompt_builder.py — 从以下来源组装系统提示词:个性(SOUL.md)、记忆(MEMORY.md、USER.md)、技能、上下文文件(AGENTS.md、.hermes.md)、工具使用指南、模型专属指令
  • prompt_caching.py — 为前缀缓存应用 Anthropic 缓存断点
  • context_compressor.py — 当上下文超过阈值时,对中间对话轮进行摘要

提示词组装上下文压缩与提示词缓存

提供商解析

CLI、gateway、cron、ACP 及辅助调用共用的运行时解析器。将 (provider, model) 元组映射为 (api_mode, api_key, base_url)。处理 18+ 个提供商、OAuth 流程、凭证池和别名解析。

提供商运行时解析

工具系统

中央工具注册表(tools/registry.py),包含 ~28 个工具集中的 70+ 个已注册工具。每个工具文件在导入时自我注册。注册表负责 Schema 收集、调度、可用性检查和错误包装。终端工具支持 7 种后端(local、Docker、SSH、Daytona、Modal、Singularity、Vercel Sandbox)。

工具运行时

会话持久化

基于 SQLite 的会话存储,支持 FTS5 全文检索。会话具有血缘追踪(跨压缩的父子关系)、按平台隔离和带争用处理的原子写入。

会话存储

消息 Gateway

长运行进程,内置 20 个平台适配器、统一会话路由、用户授权(允许列表 + DM 配对)、斜杠命令调度、钩子系统、cron 触发和后台维护任务。

Gateway 内部原理

插件系统

三个发现来源:~/.hermes/plugins/(用户级)、.hermes/plugins/(项目级)和 pip entry points。插件通过上下文 API 注册工具、钩子和 CLI 命令。存在两种特殊插件类型:记忆提供商(plugins/memory/)和上下文引擎(plugins/context_engine/)。两者均为单选模式——每次只能激活一个,通过 hermes pluginsconfig.yaml 配置。

插件指南记忆提供商插件

Cron

一等公民的 Agent 任务(而非 shell 任务)。任务以 JSON 存储,支持多种调度格式,可附加技能和脚本,并投递至任意平台。

Cron 内部原理

ACP 集成

通过 stdio/JSON-RPC 将 Hermes 作为编辑器原生 Agent 暴露给 VS Code、Zed 和 JetBrains。

ACP 内部原理

轨迹

从 Agent 会话中生成 ShareGPT 格式的轨迹,用于训练数据生成。

轨迹与训练格式

设计原则

原则在实践中的含义
提示词稳定性会话中途不更改系统提示词。除用户显式操作(/model)外,不产生破坏缓存的变动。
可观测执行每次工具调用都通过回调对用户可见。CLI(spinner)和 gateway(聊天消息)均有进度更新。
可中断API 调用和工具执行可被用户输入或信号在执行中途取消。
平台无关的核心一个 AIAgent 类服务于 CLI、gateway、ACP、批处理和 API 服务器。平台差异在入口点处理,不进入 Agent 内部。
松耦合可选子系统(MCP、插件、记忆提供商、RL 环境)使用注册表模式和 check_fn 门控,而非硬依赖。
配置文件隔离每个配置文件(hermes -p <name>)拥有独立的 HERMES_HOME、配置、记忆、会话和 gateway PID。多个配置文件可并发运行。

文件依赖链

tools/registry.py (无依赖——被所有工具文件导入)

tools/*.py (每个文件在导入时调用 registry.register())

model_tools.py (导入 tools/registry + 触发工具发现)

run_agent.py, cli.py, batch_runner.py, environments/

这条依赖链意味着工具注册发生在导入时,早于任何 Agent 实例的创建。任何包含顶层 registry.register() 调用的 tools/*.py 文件都会被自动发现——无需手动维护导入列表。