给 Hermes Agent 装上"万能模型适配器"——hermes-agent-acp-bridge
给 Hermes Agent 装上”万能模型适配器”,让你的 CLI AI Agent 调用任何编程助手,就像调用 OpenAI 一样自然。
一句话讲清楚:让你的 CLI AI Agent 调用任何编程助手,就像调用 OpenAI 一样自然。
一、Hermes Agent 的”模型饥渴”
Hermes Agent 是一个运行在终端里的 AI 助手。它能在你的终端里读代码、写代码、跑命令——但它自己不会思考,每一步都要调用一个「大模型」来生成回答。
调用大模型需要一个标准接口。业界最通用的就是 OpenAI 兼容 HTTP API:
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(line``POST /v1/chat/completions``{``"model": "gpt-4o",``"messages": [{"role": "user", "content": "帮我写个 Python 脚本"}]``}` |
Hermes Agent 可以配置任意 OpenAI 兼容的 API provider。所以理论上,它可以调用 OpenAI、DeepSeek、Ollama 本地模型……任何提供这个接口的服务。
但问题来了: 我们每天在 IDE 里用的编程助手——Cursor、Copilot、CodeBuddy——它们用的不是 OpenAI HTTP API,而是一个叫 ACP(Agent Client Protocol) 的协议,由zed提出的一种agent之间的通信协议 acp。
如果你想在 Hermes Agent 里用 CodeBuddy 的模型,怎么办?
二、旧方案:tmux 刮屏——每一次对话都在烧钱
在 hermes-agent-acp-bridge 之前,也有办法让 Hermes Agent 调用 CodeBuddy。办法很原始:
-
-
-
-
1 | `ounter(lineounter(lineounter(line``tmux send-keys → 往 CodeBuddy 的终端窗口里敲字``sleep 3s → 等它反应``tmux capture-pane → 截取整个终端画面` |
然后从截下来的画面里抠出 CodeBuddy 的回复。
每次交互,截下来的画面里挤满了:
- 之前的对话历史
- ANSI 颜色转义码
- 光标和提示符
- 各种 UI 装饰
结果是:一次简单提问就要把 2000-4000 个 token 的屏幕垃圾塞进 model context,其中真正有用的回复可能只有 200 个 token。按 DeepSeek-V3 的价格(约 $0.27/百万 token),看起来不多——但如果你每天和 Hermes Agent 交互 100 轮,一天就浪费掉 30 万 token 的屏幕垃圾,一个月近 1000 万 token。
而且 tmux 方案完全不可靠:ANSI 颜色码会乱、输出截断要看运气、新行刷新不及时导致回复不完整。每次调试都像在猜谜。
三、ACP 协议:结构化的救星
ACP(Agent Client Protocol) 是 CodeBuddy、Copilot 等 IDE 编程助手内部使用的通信协议。它走 JSON-RPC over stdio,定义了一套标准消息:
-
-
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``Client → Agent:``initialize → 握手,协商协议版本``new_session → 开启一个新对话``prompt → 发送用户消息``set_session_config_option → 切换模型````Agent → Client:``AgentMessageChunk → 文本流式输出``RequestPermission → 请求危险操作授权` |
ACP 的好处是结构化。你收到的就是干净的文本,没有 ANSI 转义码、没有 UI 装饰、没有屏幕垃圾。一条 AgentMessageChunk 只包含模型输出的纯文本。
四、hermes-agent-acp-bridge:架一座桥
这个项目做的事用一句话概括:
把 ACP 协议包装成 OpenAI 兼容 HTTP API,让任何 OpenAI 客户端(包括 Hermes Agent)都能无缝调用 ACP agent。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``┌──────────────────────────────┐``│ Hermes Agent │``│ POST /v1/chat/completions │``└──────────┬───────────────────┘``│ HTTP (OpenAI format)``▼``┌──────────────────────────────┐``│ hab (hermes-agent-acp │``│ -bridge) │``│ http://127.0.0.1:7800 │``└──────────┬───────────────────┘``│ ACP (JSON-RPC over stdio)``▼``┌──────────────────────────────┐``│ CodeBuddy / Copilot │``│ (子进程) │``└──────────────────────────────┘` |
它提供的 API
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``GET /health 健康检查``GET /v1/models 列出所有可用模型``POST /v1/chat/completions 流式对话 (SSE)``POST /v1/completions 非流式对话``POST /v1/sessions 创建持久 session``GET /v1/sessions 列出所有活跃 session``DELETE /v1/sessions/{id} 关闭 session` |
完全是标准 OpenAI 接口。任何支持自定义 API endpoint 的工具都可以直接用它。
模型命名
-
-
-
-
1 | `ounter(lineounter(lineounter(line``acp/codebuddy → CodeBuddy 的默认模型``acp/codebuddy/Claude-Sonnet-4.6 → 指定模型``acp/copilot → Copilot 的默认模型` |
五、在 Hermes Agent 中配置使用
Hermes Agent 的 provider 配置很简单。假设 bridge 跑在本机 7800 端口:
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``# ~/.hermes/config.yaml``providers:``- id: "acp"``name: "ACP Bridge"``api_base: "http://127.0.0.1:7800/v1"``api_key: "not-needed" # bridge 不需要密钥``protocol: "openai"` |
然后就可以像用 OpenAI 一样选择模型:
-
-
1 | `ounter(line``hermes agent --model acp/codebuddy/Claude-Sonnet-4.6` |
Hermes Agent 发送给 bridge 的请求:
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``POST /v1/chat/completions``{``"model": "acp/codebuddy/Claude-Sonnet-4.6",``"messages": [``{"role": "user", "content": "帮我重构这段 Rust 代码"}``]``}` |
Bridge 收到后:
- 解析出 agent:
codebuddy,model:Claude-Sonnet-4.6 - 启动
codebuddy --acp子进程 - 走 ACP initialize → newSession → setSessionConfigOption → prompt
- 把 AgentMessageChunk 实时转成 SSE chunk 发回 Hermes
- Hermes Agent 流式显示回复,跟用 GPT-4o 一模一样
流式输出的效果
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(line``assistant: 我来分析一下这段代码的问题...````1. 第 23 行的 unwrap() 在 Err 分支会 panic``2. 第 45 行的循环可以用 iterator 改写成更 Rust 的风格``3. ...(逐字流式输出,打字机效果)` |
完全不需要等全部输出完成才看到结果,体验和原生 ChatGPT 一样。
六、Rust 技术亮点
关键设计决策
1. spawn_blocking + LocalSet
ACP SDK 的 Client trait 是 ?Send 的(内部有 Rc/RefCell),不能跨线程。所以每个 ACP 调用都跑在 tokio::task::spawn_blocking 新建的独立线程里,线程内部再开一个单线程 runtime + LocalSet。这保证了并发性和 SDK 的兼容性。
2. DashMap 无锁 session 存储
Session 读写是高频操作(每次 chat 都要查 session)。用 std::sync::Mutex 包装 HashMap 会串行化所有请求。DashMap 是无锁并发 HashMap(类似 Java ConcurrentHashMap),支持真正的并行读写。
3. 并发模型查询
GET /v1/models 需要启动所有 agent 子进程来探查模型列表。Rust 版用 futures::future::join_all 真正并发等待所有 agent,比原版的 async serial 快一个数量级。
4. 零拷贝 SSE 流
用 async-stream + Body::from_stream 构建 SSE 响应,不在内存里缓存完整输出,chunk 到达后即时推送给客户端。
5. Token 估算
与其引入重量级的 tiktoken 库,直接用 ceil(text_len / 4) 估算。大多数中英文混合场景下误差在 10% 以内,够用了。
七、快速上手
安装
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``# 确保已安装 Rust toolchain``cd /path/to/hermes-agent-acp-bridge``cargo build --release````# 二进制文件在 target/release/hab``# 建议放到 PATH 里``cp target/release/hab ~/.local/bin/` |
配置
创建 ~/.config/hermes-agent-acp-bridge/config.json:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``{``"port": 7800,``"agents": {``"codebuddy": {``"command": "codebuddy",``"args": ["--acp"]``},``"copilot": {``"command": "copilot",``"args": ["--acp", "--stdio"],``"env": {``"HTTPS_PROXY": "http://127.0.0.1:1087",``"HTTP_PROXY": "http://127.0.0.1:1087"``}``}``}``}` |
启动
-
-
-
-
1 | `ounter(lineounter(lineounter(line``hab``# 或后台运行``nohup hab &` |
输出:
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``╔══════════════════════════════════════╗``║ hermes-agent-acp-bridge v0.1.0 ║``║ ACP → OpenAI Protocol Gateway ║``╚══════════════════════════════════════╝````Listening: http://127.0.0.1:7800``Agents: codebuddy, copilot, continue` |
验证
-
-
-
-
-
-
-
-
1 | `ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line``# 列出模型``curl http://127.0.0.1:7800/v1/models````# 直接对话``curl -N http://127.0.0.1:7800/v1/chat/completions \``-H "Content-Type: application/json" \``-d '{"model":"acp/codebuddy","messages":[{"role":"user","content":"hello"}]}'` |
八、不只是 Hermes Agent
虽然这篇文章主要讲 Hermes Agent 的用法,但 hermes-agent-acp-bridge 是一个标准 OpenAI API 网关。它可以用在任何地方:
- Continue.dev — 配置为 custom provider,直接在 VS Code/JetBrains 里用 CodeBuddy 的模型
- Aider — AI 结对编程工具,
--openai-api-base http://127.0.0.1:7800/v1 - Open Interpreter — 自然语言终端
- 任何支持 OpenAI API 的工具 — ChatBox、NextChat、LangChain……
九、总结
对比维度
tmux 刮屏
hermes-agent-acp-bridge
每次交互浪费 token
2000-4000
~300(协议开销)
可靠性
靠运气
结构化协议,无歧义
性能
阻塞等待
流式输出,实时性好
多 agent 支持
改脚本
加一行配置
模型切换
手动
API 自动
Hermes 集成
需要适配
原生支持
如果你的工作流依赖 Hermes Agent,又想用 CodeBuddy/Copilot 的模型能力,hermes-agent-acp-bridge 几乎是必选项。它把终端 AI Agent 和 IDE 编程助手之间的裂缝补上了,而且补得很干净。
项目地址:hermes-agent-acp-bridege(https://github.com/xnzone/hermes-agent-acp-bridge)
二进制名:hab(Hermes Agent Bridge 的缩写,读音 /hæb/)
许可证: 开源,欢迎 PR。
- END -
💬 本文评论区已开启,但暂无读者留言。
本文转载自微信公众号,如有侵权请联系删除。
- 标题: 给 Hermes Agent 装上"万能模型适配器"——hermes-agent-acp-bridge
- 作者: lxiol
- 创建于 : 2026-05-08 21:45:20
- 更新于 : 2026-05-12 16:32:44
- 链接: https://blog.lxiol.cn/2026/05/08/给-Hermes-Agent-装上万能模型适配器hermes-agent-acp-bridge/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。