原文链接:ACP Internals sidebar position: 2 title: "ACP Internals" description: "How the ACP adapter works: lifecycle, sessions, event bridge, approvals, and tool re

> 原文链接:ACP Internals


sidebar_position: 2 title: "ACP Internals" description: "How the ACP adapter works: lifecycle, sessions, event bridge, approvals, and tool rendering"

ACP 内部机制

ACP(Agent Communication Protocol)适配器将 Hermes 的同步 AIAgent 包装在异步 JSON-RPC stdio 服务器中。

关键实现文件:

  • acp_adapter/entry.py
  • acp_adapter/server.py
  • acp_adapter/session.py
  • acp_adapter/events.py
  • acp_adapter/permissions.py
  • acp_adapter/tools.py
  • acp_adapter/auth.py
  • acp_registry/agent.json

启动流程

hermes acp / hermes-acp / python -m acp_adapter
  -> acp_adapter.entry.main()
  -> 加载 ~/.hermes/.env
  -> 配置 stderr 日志
  -> 构造 HermesACPAgent
  -> acp.run_agent(agent)

Stdout 保留给 ACP JSON-RPC 传输。人类可读的日志输出到 stderr。

主要组件

HermesACPAgent

acp_adapter/server.py 实现 ACP Agent 协议。

职责:

  • 初始化 / 认证
  • new/load/resume/fork/list/cancel 会话方法
  • Prompt 执行
  • 会话模型切换
  • 将同步 AIAgent 回调接入 ACP 异步通知

SessionManager

acp_adapter/session.py 跟踪活跃的 ACP 会话。

每个会话存储:

  • session_id
  • agent
  • cwd
  • model
  • history
  • cancel_event

管理器是线程安全的,支持:

  • create
  • get
  • remove
  • fork
  • list
  • cleanup
  • cwd 更新

事件桥接(Event Bridge)

acp_adapter/events.py 将 AIAgent 回调转换为 ACP session_update 事件。

桥接的回调:

  • tool_progress_callback
  • thinking_callback
  • step_callback
  • message_callback

因为 AIAgent 在工作线程中运行,而 ACP I/O 在主事件循环上,桥接使用:

asyncio.run_coroutine_threadsafe(...)

权限桥接

acp_adapter/permissions.py 将危险的终端审批提示适配为 ACP 权限请求。

映射:

  • allow_once -> Hermes once
  • allow_always -> Hermes always
  • 拒绝选项 -> Hermes deny

超时和桥接失败默认拒绝。

工具渲染辅助

acp_adapter/tools.py 将 Hermes 工具映射到 ACP 工具类型并构建面向编辑器的内容。

示例:

  • patch / write_file -> 文件差异
  • terminal -> Shell 命令文本
  • read_file / search_files -> 文本预览
  • 大结果 -> 为 UI 安全截断的文本块

会话生命周期

new_session(cwd)
  -> 创建 SessionState
  -> 创建 AIAgent(platform="acp", enabled_toolsets=["hermes-acp"])
  -> 绑定 task_id/session_id 到 cwd 覆盖

prompt(..., session_id)
  -> 从 ACP 内容块提取文本
  -> 重置取消事件
  -> 安装回调 + 审批桥接
  -> 在 ThreadPoolExecutor 中运行 AIAgent
  -> 更新会话历史
  -> 发出最终的 Agent 消息块

取消

cancel(session_id)

  • 设置会话取消事件
  • 可用时调用 agent.interrupt()
  • 导致 prompt 响应返回 stop_reason="cancelled"

分叉(Forking)

fork_session() 深拷贝消息历史到新的活跃会话中,保留对话状态,同时为分叉分配自己的会话 ID 和 cwd。

Provider/认证行为

ACP 不实现自己的认证存储。

它复用 Hermes 的运行时解析器:

  • acp_adapter/auth.py
  • hermes_cli/runtime_provider.py

因此 ACP 广告并使用当前配置的 Hermes Provider/凭据。

工作目录绑定

ACP 会话携带编辑器的 cwd。

会话管理器通过任务范围的终端/文件覆盖将该 cwd 绑定到 ACP 会话 ID,使文件和终端工具相对于编辑器工作区操作。

重复同名工具调用

事件桥接按工具名 FIFO 跟踪工具 ID,而不是每个名称只跟踪一个 ID。这对于以下情况很重要:

  • 并行同名调用
  • 单步中重复的同名调用

没有 FIFO 队列,完成事件会附加到错误的工具调用上。

审批回调恢复

ACP 在 prompt 执行期间临时在终端工具上安装审批回调,之后恢复之前的回调。这避免了将 ACP 会话特定的审批处理程序永久全局安装。

当前限制

  • ACP 会话从 ACP 服务器的角度来看是进程本地的
  • 非文本 prompt 块目前在请求文本提取时被忽略
  • 编辑器特定的用户体验因 ACP 客户端实现而异

相关文件

  • tests/acp/ — ACP 测试套件
  • toolsets.pyhermes-acp 工具集定义
  • hermes_cli/main.pyhermes acp CLI 子命令
  • pyproject.toml[acp] 可选依赖 + hermes-acp 脚本

Continue Exploring

继续探索

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

开发者指南

架构

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

开发者指南

贡献指南

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

开发者指南

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

Developer Guide

开发者指南

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

20 篇文档20 个节点

当前节点

ACP 内部机制

同主题继续探索

架构

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

贡献指南

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

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

贡献指南

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

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