剪藏#专业造轮子#剪藏

给 Hermes Agent 装上"万能模型适配器"——hermes-agent-acp-bridge

2026 年 8 月 18 日1 分钟
分享Twitter / XTelegram微博
给 Hermes Agent 装上"万能模型适配器"——hermes-agent-acp-bridge 封面

一句话讲清楚:让你的 CLI AI Agent 调用任何编程助手,就像调用 OpenAI 一样自然。

一、Hermes Agent 的"模型饥渴"

Hermes Agent 是一个运行在终端里的 AI 助手。它能在你的终端里读代码、写代码、跑命令——但它自己不会思考,每一步都要调用一个「大模型」来生成回答。

调用大模型需要一个标准接口。业界最通用的就是 OpenAI 兼容 HTTP API

JAVASCRIPT
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。办法很原始:

JAVASCRIPT
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,定义了一套标准消息:

JAVASCRIPT
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。

JAVASCRIPT
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

JAVASCRIPT
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 的工具都可以直接用它。

模型命名

JAVASCRIPT
ounter(lineounter(lineounter(line
acp/codebuddy                         → CodeBuddy 的默认模型
acp/codebuddy/Claude-Sonnet-4.6       → 指定模型
acp/copilot                           → Copilot 的默认模型

五、在 Hermes Agent 中配置使用

Hermes Agent 的 provider 配置很简单。假设 bridge 跑在本机 7800 端口:

JAVASCRIPT
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 一样选择模型:

JAVASCRIPT
ounter(line
hermes agent --model acp/codebuddy/Claude-Sonnet-4.6

Hermes Agent 发送给 bridge 的请求:

JAVASCRIPT
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 收到后:

  1. 解析出 agent: codebuddy,model: Claude-Sonnet-4.6

  2. 启动 codebuddy --acp 子进程

  3. 走 ACP initialize → newSession → setSessionConfigOption → prompt

  4. 把 AgentMessageChunk 实时转成 SSE chunk 发回 Hermes

  5. Hermes Agent 流式显示回复,跟用 GPT-4o 一模一样

流式输出的效果

JAVASCRIPT
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% 以内,够用了。

七、快速上手

安装

JAVASCRIPT
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

JAVASCRIPT
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"
      }
    }
  }
}

启动

JAVASCRIPT
ounter(lineounter(lineounter(line
hab
# 或后台运行
nohup hab &

输出:

JAVASCRIPT
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

验证

JAVASCRIPT
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……

九、总结

每次交互浪费 token 2000-4000 ~300(协议开销)
可靠性 靠运气 结构化协议,无歧义
性能 阻塞等待 流式输出,实时性好
多 agent 支持 改脚本 加一行配置
模型切换 手动 API 自动
Hermes 集成 需要适配 原生支持

如果你的工作流依赖 Hermes Agent,又想用 CodeBuddy/Copilot 的模型能力,hermes-agent-acp-bridge 几乎是必选项。它把终端 AI Agent 和 IDE 编程助手之间的裂缝补上了,而且补得很干净。

项目地址:hermes-agent-acp-bridegehttps://github.com/xnzone/hermes-agent-acp-bridge)

二进制名:hab(Hermes Agent Bridge 的缩写,读音 /hæb/)

许可证: 开源,欢迎 PR。

  • END -

原文地址: https://mp.weixin.qq.com/s?__biz=MzI0OTg0NTk0MA==&mid=2247484181&idx=1&sn=3290aab2ccd036baa5673c43d46e057f&chksm=e8bc2abd9e7c5505e20a02c6962f7dbb98fde3c18217bd33f21c476d2aa17353ea29bd0d78b6&mpshare=1&scene=1&srcid=0512mVwxVtWlzS9AD16mNs5I&sharer_shareinfo=9a75ece31ec6cd62fc5d707d437f3b38&sharer_shareinfo_first=9a75ece31ec6cd62fc5d707d437f3b38#rd

相关文章