第25篇:ACP——Agent 间的通信协议
Hermes 功能详解第25篇:ACP。Agent Client Protocol 主机集成。
这篇讲的是:如何让 Hermes Agent 通过一种叫 ACP 的“通用插头”,接入你常用的编辑器或聊天平台,让 AI 直接在你手边工作。
想象一下:ACP 就像 USB-C 接口。以前每个设备都要专属充电线,现在只要都支持 USB-C,一根线全搞定。ACP 就是 AI 智能体世界的 USB-C,让 Hermes 能“插”进 VS Code、Zed、JetBrains,甚至去 Buzz 频道里当“数字员工”。
第1步:安装 ACP 扩展包
先正常安装 Hermes,然后打开终端,执行:
cd ~/.hermes/hermes-agent && python -c "import pm; pm.sync_venv(['acp'], explicit=True)"
本页的 Python 依赖命令都基于 PM 准备好的源码检出(见包管理文档的“开发者工作流”)。依赖有变动后,重新激活检出并重启 Hermes。
装好后,你就多了三个启动命令,任选其一即可:
hermes acp
hermes-acp
python -m acp_adapter
注意: Hermes 会把日志写到 stderr,把 stdout 留给 ACP 数据流——就像机场广播和旅客通道分开,互不干扰。
先做个快速体检:
hermes acp --check
第2步:让 Hermes 学会“看网页”(可选)
如果你想让 AI 能操作浏览器(比如自动点击、填表),需要额外装浏览器工具(browser_exec 以及 CDP 系列工具 browser_cdp、browser_dialog、browser_vault):
hermes acp --setup-browser --yes
它会通过包管理器安装 Hermes 固定版本的 Chromium(chromium 包),全程不涉及 Node.js 或 npm。 当 browser_exec 第一次需要浏览器时,Hermes 会自己启动这个 Chromium。装过一次后,再跑会秒过(幂等设计)。
顺带一提,如果你走的是 hermes acp --setup 那条首次配置流程,选完模型后它也会顺口问你要不要装浏览器工具,所以大多数人其实不用单独跑 --setup-browser。
第3步:接入你的编辑器
VS Code 用户: 安装“ACP Client”扩展,然后在设置里添加:
{
"acp.agents": {
"Hermes Agent": {
"command": "hermes",
"args": ["acp"]
}
}
}
Zed 用户: 在设置中添加自定义 agent 服务器:
{
"agent_servers": {
"hermes-agent": {
"type": "custom",
"command": "hermes",
"args": ["acp"]
}
}
}
JetBrains 用户: 找个支持 ACP 的插件,指向 hermes acp 即可。
第4步:让 Hermes 去 Buzz 频道“上班”(进阶)
Buzz 是一个人和 AI 都能用的协作平台。你可以搭一座桥,让 Hermes 自动响应频道里的消息:
export BUZZ_RELAY_URL="wss://community.example.com"
export BUZZ_PRIVATE_KEY="你的私钥"
export BUZZ_API_TOKEN="令牌(可选)"
export BUZZ_ACP_AGENT_COMMAND="hermes"
export BUZZ_ACP_AGENT_ARGS="acp"
buzz-acp
重要提醒: 每个 AI 智能体都要有独立的 Nostr 身份密钥,千万别用你人类的密钥。而且默认设置下,Buzz 里的 Hermes 可以不经确认直接执行终端命令——我测试让它对临时目录执行 rm -rf,它真删了,全程无提示。所以务必保持“仅限所有者”权限,别改成“任何人”。
另外,如果你想让 Hermes 在 Buzz 里的活动显示在主人的 Buzz Desktop 上,可以再加一句:
export BUZZ_ACP_RELAY_OBSERVER="true"
这样就能在智能体的 Activity log 里看到实时流程、工具调用和回复了。
自定义 ACP 会话能用哪些工具
ACP 会话里的工具集和消息网关走的是同一套解析规则:默认的 hermes-acp 列表之外,还会带上网关额外加的那些,比如你启用的插件工具集。想改的话,用 platform_toolsets.acp 覆盖默认列表,用 agent.disabled_toolsets 从每个 ACP 会话里移除工具集。mcp_servers 里的 MCP 服务器也遵循同样的规则——默认全部启用,如果你在 platform_toolsets.acp 里列了服务器名,就只有这些会被包含,写 no_mcp 则全部丢掉。注意 hermes tools 里没有 ACP 这一项,只能直接改 config.yaml:
platform_toolsets:
acp: [file, web, skills, github] # only the github MCP server
agent:
disabled_toolsets: [code_execution]
编辑器通过 session/new 发过来的 MCP 服务器是另一回事:客户端按会话请求,它们总是会被加上。
在声明支持 acp-session-mcp-v1 的网关上,编辑器发来的 mcpServers 归属于规范会话,而不是 ACP 查看器进程;即使两个编辑器提供了同名服务器,网关也会用不同的注册表命名空间区分。关闭一个编辑器不会取消另一个会话的 MCP 执行。
发现过程在第一个模型回合前完成,有界且是急切的;选中的工具 schema 在整段对话中保持冻结,服务器工具列表变化需要新开会话。每次执行后 MCP 传输会被释放,但不会停掉兄弟会话或共享的 MCP 循环。
网关只在内存里保留编辑器的传输规格(包括命令参数、环境变量和 HTTP 头)。持久化的会话策略只存指纹和选中的 schema,不存这些凭据的副本。网关重启后,编辑器必须在加载/恢复时重新提供相同的 mcpServers。凭据缺失会拒绝执行;规格或密钥变化会拒绝重新挂接,而不是悄悄改变会话。改服务器配置时请新开会话。命令和路径在网关主机上运行。
关于审批超时
编辑器里的危险命令审批弹窗,如果一直没人点,或者中途出错,Hermes 会默认拒绝。等待时长由 config.yaml 里的 approvals.timeout 控制,默认 300 秒——跟 CLI 和网关用的是同一个参数。如果你的编辑器习惯把审批卡片挂很久,可以把这个值调大一点。
注意: 在 Buzz 这类自动批准的宿主里,把 approvals.mode 设成 manual 也没用——Hermes 确实会发出权限请求,但 Buzz 会自动批准,命令照样执行。想真正拿掉 shell 权限,得从工具集下手:把 platform_toolsets.acp 设成一个不含 terminal 和 code_execution 的列表,或者把它们加进 agent.disabled_toolsets。即使写成空的 platform_toolsets.acp: [],启用的插件工具集还是会被加进来,所以想干掉哪个插件工具集,就在 agent.disabled_toolsets 里点名。
小总结
ACP 让 Hermes 变成“即插即用”的 AI 助手:编辑器里聊聊天、看代码 diff、批准命令,或者去 Buzz 频道当数字员工。核心心法是:身份归 Hermes,界面归宿主应用。下篇预告:我们聊聊 Hermes 的“记忆宫殿”——如何让 AI 跨会话记住你的偏好和项目上下文。
📖 官方文档
本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/features/acp