# Hermes智能体Claude代码调用问题

36.137.183.20是我服务器的地址，你通过我给你的密钥连过来帮我解决这个问题：我电脑上有一个Hermes智能体叫实例1他有一个子技能叫Claude code，你另一个号和我说可以正常调用了，但是我叫Hermes去调用他一直说调用不了，你去帮我彻底去解决这个问题。

## 连接密钥

ZIP

36.137.183.20登入密钥.zip

Archive

我来先解压你上传的密钥文件，然后连接到你的服务器进行排查。

### 服务器连接

```bash
密钥文件格式正确。现在尝试连接到你的服务器。
```

```bash
已成功连接到你的服务器。现在来排查 Hermes 智能体和 Claude Code 子技能的问题。先看看服务器上的相关服务和配置。
```

### 检查服务

```bash
看起来没有 Docker 容器在运行。让我进一步排查服务器上的 Hermes 相关服务。
```

```bash
没有 Docker 容器。让我更广泛地查找 Hermes 和 Claude Code 相关的文件和配置。
```

### 查找相关文件

```bash
找到了。Hermes 相关文件在 `/opt/hermes-agent`。让我深入查看。
```

```bash
找到了 Hermes 智能体目录。让我查看实例配置和 Claude Code 技能相关内容。
```

```bash
找到配置文件了。让我查看主配置和相关日志。
```

```bash
Gateway 正在运行，Telegram 已连接。让我查看实例配置和 Claude Code 子技能的定义。
```

### 检查 Claude Code 错误日志

```bash
让我查看 Claude Code 相关的技能定义和最近的错误日志。
```

### 识别关键问题

```bash
现在我理解了架构。Hermes 通过 `delegate_task` 使用 ACP 协议来调用 Claude Code。让我检查 Claude Code 的实际运行状况。
```

```bash
这是一个关键发现。Claude Code CLI 本身在调用 API 时就报错了：`headers.forEach is not a function`。这说明 Claude Code 的 API 认证/请求头配置有问题。让我深入排查。
```

### 查找问题根源

```bash
找到问题根源了。`detectGateway` 函数中的 `headers.forEach` 假设 `headers` 是一个 `Headers` 对象（有 `forEach` 方法），但讯飞 API 返回的响应头可能是普通对象，没有 `forEach` 方法。
```

### 函数修复

```bash
问题非常清晰了。`detectGateway` 函数期望 `headers` 是 `Headers` 对象（Web API），有 `forEach` 方法，但讯飞的第三方 API 返回的 headers 可能是普通对象或 undefined。我需要修复这个函数，让它兼容各种 headers 类型。
```

### 继续修复

```bash
补丁已应用。现在测试 Claude Code 是否能正常工作。
```

### API 路径匹配问题

```bash
Headers 问题修复了，但现在有模型名称的问题。让我检查讯飞 API 需要什么模型名格式。
```

```bash
API 本身是正常工作的。问题在于讯飞 API 使用 `/v2` 路径，而 Claude Code 默认使用 `/v1`。让我看看 Claude Code 怎么配置 base URL。
```

```bash
确认了，`/v1` 路径不行，只有 `/v2` 能用。Claude Code SDK 会硬编码拼接 `/v1/messages`，所以需要让 base URL 末尾使 SDK 最终发到 `/v2/messages`。
```

### 环境变量设置

```bash
方案：将 `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`，这也不对。需要一个更巧妙的方案。
```

### 配置检测

```bash
现在检查 SDK 是否会去掉 `/v1` 前缀：
```

### 最后确认

```bash
Claude Code 通过 `launch.mjs` 正常工作了。现在需要确认 Hermes 通过 ACP 方式调用 Claude Code 的完整链路。让我检查 Hermes 调用 Claude Code 的具体方式：
```

### 问题总结与修复内容

你可以在 Telegram 上让 Hermes 实例1 调用 Claude Code 子技能了，它应该能正常响应。

#### 主要问题及对应修复：

1. **符号链接跳过了 .env 加载**  
   - `claude` 命令直接链接到 `dist/cli.mjs`，跳过了 `launch.mjs`（负责加载 `.env` 环境变量），已修复。

2. **headers.forEach 崩溃（代码兼容性 bug）**  
   -  Claude Code SDK 的 `detectGateway` 函数假设 `headers` 是标准 `Headers` 对象，已修复。

3. **API 路径不匹配（/v1 vs /v2）**  
   - Claude Code SDK 硬编码的路径不匹配，已修复。

4. **缺少自定义模型白名单变量**  
   - 在 `.env` 中添加 `ANTHROPIC_CUSTOM_MODEL_OPTION`，使自定义模型通过验证。

所有问题都已修复，测试时 Hermes 正常工作。
