OpenCode 配置第三方中转 API 排查手记:为什么只有部分模型能正常工作?

问题简述:配置了第三方中转 API(fe8.cn),多个模型中只有 gpt-5.4 有正常响应,其他模型(glm-5.1、deepseek-v3.2、qwen3.6-plus、gemini-3.1-pro-preview)执行几秒但无任何输出。


一、问题现象

配置了 agi-cto provider 后,在 OpenCode 中测试多个模型,发现:

  • gpt-5.4 - 正常响应,约 4 秒返回内容
  • claude-opus-4-7 - 能工作但响应较慢(约 30 秒)
  • glm-5.1 - 执行 5-7 秒,无任何输出
  • deepseek-v3.2 - 执行 4-5 秒,无任何输出
  • qwen3.6-plus - 执行 5 秒,无任何输出
  • gemini-3.1-pro-preview - 执行 8 秒,无任何输出

初始配置如下:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "agi-cto": {
      "name": "AGICTO",
      "options": {
        "apiKey": "{env:AGICTO_API_KEY}",
        "baseURL": "https://api.fe8.cn/v1"
      },
      "models": {
        "gpt-5.4": { "id": "gpt-5.4", "name": "gpt-5.4" },
        "claude-opus-4-7": { "id": "claude-opus-4-7", "name": "claude-opus-4-7" },
        "gemini-3.1-pro-preview": { "id": "gemini-3.1-pro-preview", "name": "gemini-3.1-pro-preview" },
        "glm-5.1": { "id": "glm-5.1", "name": "glm-5.1" },
        "deepseek-v3.2": { "id": "deepseek-v3.2", "name": "deepseek-v3.2" },
        "qwen3.6-plus": { "id": "qwen3.6-plus", "name": "qwen3.6-plus" }
      }
    }
  },
  "model": "agi-cto/gpt-5.4"
}

二、初步分析:兼容但不完全对等

虽然中转平台声称使用 OpenAI 兼容 API,但"兼容"有不同层次:

兼容层次 说明 状态
HTTP API 层 /v1/chat/completions 端点、请求头格式 ✅ 所有模型都兼容
请求格式层 messages, model, stream 参数结构 ✅ 所有模型都兼容
响应格式层 SSE chunk 的 JSON 结构、字段命名 ⚠️ 问题可能在这里
流式行为层 chunk 发送频率、空 chunk 处理、finish_reason 值 ⚠️ 可能也有差异

日志分析

启动 OpenCode 调试模式:

opencode --log-level DEBUG --print-logs -m agi-cto/glm-5.1 run "Hello"

正常工作的模型日志(gpt-5.4):

service=bus type=message.part.delta publishing  ← 有内容增量事件
service=bus type=message.part.delta publishing
Hello. How can I help?

不工作的模型日志(glm-5.1):

service=bus type=message.part.updated publishing  ← 只有状态更新
service=bus type=message.part.updated publishing  ← 没有 delta 事件
(无内容输出)

这说明:响应被接收了,但内容解析器没有提取到有效文本


三、深入排查:使用 curl 抓取原始响应

配置层面可能的问题:

  • 尝试添加 "type": "openai" 显式指定 provider 类型
  • 尝试移除 type 字段使用自动推断

但这些都不是根本原因。我们需要直接查看 API 返回的原始 SSE 数据。

curl 测试命令

curl -s "https://api.fe8.cn/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGICTO_API_KEY" \
  -d '{
    "model": "模型名称",
    "messages": [{"role": "user", "content": "hi"}],
    "stream": true
  }'

测试结果汇总

1. gpt-5.4 ✅
data: {"choices":[{"delta":{"content":"","refusal":null,"role":"assistant"},...}]}
data: {"choices":[{"delta":{"content":"Hi"},"finish_reason":null,...}]}
data: {"choices":[{"delta":{"content":"!"},"finish_reason":null,...}]}
...
data: {"choices":[{"delta":{},"finish_reason":"stop",...}]}

完全标准的 OpenAI SSE 格式,工作正常。

2. claude-opus-4-7 ⚠️
{"error":{"message":"invalid model or Service load is too high, please try again later",...}}

服务负载过高或临时限流,之前测试时能正常工作。

3. glm-5.1 ❌
{"error":{"code":"","message":"所有令牌分组 openai 下对于模型 glm-5.1 均无可用渠道,请更换分组尝试",...}}
4. deepseek-v3.2 ❌
{"error":{"code":"","message":"所有令牌分组 openai 下对于模型 deepseek-v3.2 均无可用渠道,请更换分组尝试",...}}
5. qwen3.6-plus ❌
{"error":{"code":"","message":"所有令牌分组 openai 下对于模型 qwen3.6-plus 均无可用渠道,请更换分组尝试",...}}
6. gemini-3.1-pro-preview ❌
{"error":{"code":"","message":"Invalid Token",...}}

四、根因确认

这不是 OpenCode 配置问题,也不是响应格式解析问题,而是 fe8.cn 后台权限配置问题:

模型 状态 原因
gpt-5.4 ✅ 正常 已配置渠道权限
claude-opus-4-7 ⚠️ 暂时不可用 服务负载过高/限流
glm-5.1 ❌ 无权限 openai 分组下无可用渠道
deepseek-v3.2 ❌ 无权限 openai 分组下无可用渠道
qwen3.6-plus ❌ 无权限 openai 分组下无可用渠道
gemini-3.1-pro-preview ❌ Token 无效 API Key 配置错误或过期

为什么 OpenCode 不报错?

OpenCode 使用的 @ai-sdk/openai-compatible 包可能静默处理了错误响应

  • API 返回了错误 JSON
  • SDK 尝试解析但没有抛出异常
  • 只触发了 message.part.updated 事件
  • 没有解析出有效内容,所以没有 message.part.delta 事件

五、解决方案

方案 1:在 fe8.cn 后台添加模型渠道(推荐)

  1. 登录 fe8.cn 控制台
  2. 进入 API Key / 令牌管理
  3. 找到你使用的 API Key
  4. 在对应的令牌分组(如 openai 分组)下,添加以下模型的渠道:
    • glm-5.1
    • deepseek-v3.2
    • qwen3.6-plus
    • gemini-3.1-pro-preview
  5. 保存后重新测试

方案 2:尝试其他令牌分组

有些中转平台有多个分组(如 openaiazuredefault 等):

  • 可能这些模型在其他分组下已配置
  • 尝试在 provider 配置中指定不同的分组(如果支持)

方案 3:更换模型 ID

有时中转平台使用不同的模型 ID 映射:

  • deepseek-chat 代替 deepseek-v3.2
  • glm-4glm-4-air 代替 glm-5.1
  • qwen-maxqwen-plus 代替 qwen3.6-plus

六、验证方法

配置完成后,再次运行 curl 测试:

curl -s "https://api.fe8.cn/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGICTO_API_KEY" \
  -d '{"model": "deepseek-v3.2", "messages": [{"role": "user", "content": "hi"}], "stream": true}'

如果返回的是 data: {"choices":[...]} 格式的数据而不是错误 JSON,就说明配置成功了。


七、总结与经验

关键排查步骤

  1. 启用调试日志--log-level DEBUG --print-logs
  2. 对比日志差异:正常 vs 异常模型的日志事件区别
  3. 使用 curl 抓包:直接查看 API 原始响应,绕过客户端解析逻辑
  4. 分析错误信息:中转平台的错误消息通常直接指明问题

经验教训

  1. “OpenAI 兼容” ≠ “完全一致”:不同模型的后端响应可能有细微差异
  2. 权限配置优先级:在怀疑客户端配置之前,先确认 API 层面的权限和渠道配置
  3. curl 是最好的调试工具:直接暴露原始响应,避免客户端 SDK 的"智能"处理干扰
  4. 静默失败最隐蔽:不报错但无内容,往往比明确的错误更难排查

附录:OpenCode 调试命令速查

# 启用调试模式运行
opencode --log-level DEBUG --print-logs

# 指定模型运行
opencode -m agi-cto/glm-5.1 run "Hello"

# 查看 provider 配置
opencode providers list

# 测试模型响应(curl)
curl -s "https://api.fe8.cn/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGICTO_API_KEY" \
  -d '{"model": "模型名称", "messages": [{"role": "user", "content": "hi"}], "stream": true}'

参考资料

  • OpenCode 官方文档:https://opencode.ai/docs
  • @ai-sdk/openai-compatible 文档
  • SSE (Server-Sent Events) 规范:https://html.spec.whatwg.org/multipage/server-sent-events.html
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐