Hermes智能体Claude代码调用问题
36.137.183.20是我服务器的地址,你通过我给你的密钥连过来帮我解决这个问题:我电脑上有一个Hermes智能体叫实例1他有一个子技能叫Claude code,你另一个号和我说可以正常调用了,但是我叫Hermes去调用他一直说调用不了,你去帮我彻底去解决这个问题。
连接密钥
ZIP
36.137.183.20登入密钥.zip
Archive
我来先解压你上传的密钥文件,然后连接到你的服务器进行排查。
服务器连接
密钥文件格式正确。现在尝试连接到你的服务器。
已成功连接到你的服务器。现在来排查 Hermes 智能体和 Claude Code 子技能的问题。先看看服务器上的相关服务和配置。
检查服务
看起来没有 Docker 容器在运行。让我进一步排查服务器上的 Hermes 相关服务。
没有 Docker 容器。让我更广泛地查找 Hermes 和 Claude Code 相关的文件和配置。
查找相关文件
找到了。Hermes 相关文件在 `/opt/hermes-agent`。让我深入查看。
找到了 Hermes 智能体目录。让我查看实例配置和 Claude Code 技能相关内容。
找到配置文件了。让我查看主配置和相关日志。
Gateway 正在运行,Telegram 已连接。让我查看实例配置和 Claude Code 子技能的定义。
检查 Claude Code 错误日志
让我查看 Claude Code 相关的技能定义和最近的错误日志。
识别关键问题
现在我理解了架构。Hermes 通过 `delegate_task` 使用 ACP 协议来调用 Claude Code。让我检查 Claude Code 的实际运行状况。
这是一个关键发现。Claude Code CLI 本身在调用 API 时就报错了:`headers.forEach is not a function`。这说明 Claude Code 的 API 认证/请求头配置有问题。让我深入排查。
查找问题根源
找到问题根源了。`detectGateway` 函数中的 `headers.forEach` 假设 `headers` 是一个 `Headers` 对象(有 `forEach` 方法),但讯飞 API 返回的响应头可能是普通对象,没有 `forEach` 方法。
函数修复
问题非常清晰了。`detectGateway` 函数期望 `headers` 是 `Headers` 对象(Web API),有 `forEach` 方法,但讯飞的第三方 API 返回的 headers 可能是普通对象或 undefined。我需要修复这个函数,让它兼容各种 headers 类型。
继续修复
补丁已应用。现在测试 Claude Code 是否能正常工作。
API 路径匹配问题
Headers 问题修复了,但现在有模型名称的问题。让我检查讯飞 API 需要什么模型名格式。
API 本身是正常工作的。问题在于讯飞 API 使用 `/v2` 路径,而 Claude Code 默认使用 `/v1`。让我看看 Claude Code 怎么配置 base URL。
确认了,`/v1` 路径不行,只有 `/v2` 能用。Claude Code SDK 会硬编码拼接 `/v1/messages`,所以需要让 base URL 末尾使 SDK 最终发到 `/v2/messages`。
环境变量设置
方案:将 `ANTHROPIC_BASE_URL` 设为 `https://maas-coding-api.cn-huabei-1.xf-yun.com/v2`,然后 SDK 会拼成 `https://maas-coding-api.cn-huabei-1.xf-yun.com/v2/v1/messages`,这也不对。需要一个更巧妙的方案。
配置检测
现在检查 SDK 是否会去掉 `/v1` 前缀:
最后确认
Claude Code 通过 `launch.mjs` 正常工作了。现在需要确认 Hermes 通过 ACP 方式调用 Claude Code 的完整链路。让我检查 Hermes 调用 Claude Code 的具体方式:
问题总结与修复内容
你可以在 Telegram 上让 Hermes 实例1 调用 Claude Code 子技能了,它应该能正常响应。
主要问题及对应修复:
符号链接跳过了 .env 加载
claude命令直接链接到dist/cli.mjs,跳过了launch.mjs(负责加载.env环境变量),已修复。
headers.forEach 崩溃(代码兼容性 bug)
- Claude Code SDK 的
detectGateway函数假设headers是标准Headers对象,已修复。
- Claude Code SDK 的
API 路径不匹配(/v1 vs /v2)
- Claude Code SDK 硬编码的路径不匹配,已修复。
缺少自定义模型白名单变量
- 在
.env中添加ANTHROPIC_CUSTOM_MODEL_OPTION,使自定义模型通过验证。
- 在
所有问题都已修复,测试时 Hermes 正常工作。