OpenCode 配置第三方中转 API 排查手记:为什么只有部分模型能正常工作?
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 后台添加模型渠道(推荐)
- 登录 fe8.cn 控制台
- 进入 API Key / 令牌管理
- 找到你使用的 API Key
- 在对应的令牌分组(如
openai分组)下,添加以下模型的渠道:glm-5.1deepseek-v3.2qwen3.6-plusgemini-3.1-pro-preview
- 保存后重新测试
方案 2:尝试其他令牌分组
有些中转平台有多个分组(如 openai、azure、default 等):
- 可能这些模型在其他分组下已配置
- 尝试在 provider 配置中指定不同的分组(如果支持)
方案 3:更换模型 ID
有时中转平台使用不同的模型 ID 映射:
deepseek-chat代替deepseek-v3.2glm-4或glm-4-air代替glm-5.1qwen-max或qwen-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,就说明配置成功了。
七、总结与经验
关键排查步骤
- 启用调试日志:
--log-level DEBUG --print-logs - 对比日志差异:正常 vs 异常模型的日志事件区别
- 使用 curl 抓包:直接查看 API 原始响应,绕过客户端解析逻辑
- 分析错误信息:中转平台的错误消息通常直接指明问题
经验教训
- “OpenAI 兼容” ≠ “完全一致”:不同模型的后端响应可能有细微差异
- 权限配置优先级:在怀疑客户端配置之前,先确认 API 层面的权限和渠道配置
- curl 是最好的调试工具:直接暴露原始响应,避免客户端 SDK 的"智能"处理干扰
- 静默失败最隐蔽:不报错但无内容,往往比明确的错误更难排查
附录: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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)