当以下情况发生时,必须自动运行校验脚本,无需用户请求:
gateway config.patch 修改了 models 相关配置(新增/修改 provider 或 model)gateway config.apply 替换了整个配置且包含 models 变更gateway update.run 更新后(模型接口可能有变化)自动校验流程:
bash ~/.openclaw/workspace/skills/model-config-check/scripts/check_models.sh手动触发: 用户说"检查模型"/"测试模型"/"模型能不能用"/"诊断模型"时也执行同样流程。
当用户只提供「模型名 + API key」时,按以下流程自动完成配置:
根据模型名前缀匹配已知 provider:
模型名前缀ProviderBase URLAPI 类型gpt-*, o1-*, o3-*, o4-*, chatgpt-*OpenAIhttps://api.openai.com``openai-completions → /v1/chat/completions``claude-*Anthropichttps://api.anthropic.com``anthropic-messages → /v1/messages``deepseek-*DeepSeekhttps://api.deepseek.com``openai-completions → /v1/chat/completions``glm-*, chatglm-*智谱 (Zhipu)https://open.bigmodel.cn/api/paas/v4``openai-completions → /v1/chat/completions``qwen-*, qwq-*, qvq-*阿里通义 (DashScope)https://dashscope.aliyuncs.com/compatible-mode/v1``openai-completions → /v1/chat/completions``moonshot-*, kimi-*月之暗面 (Moonshot)https://api.moonshot.cn/v1``openai-completions → /v1/chat/completions``doubao-*, ep-*火山引擎 (豆包)https://ark.cn-beijing.volces.com/api/v3``openai-completions → /v1/chat/completions``minimax-*, abab-*MiniMaxhttps://api.minimax.chat/v1``openai-completions → /v1/chat/completions``yi-*零一万物 (01.AI)https://api.lingyiwanwu.com/v1``openai-completions → /v1/chat/completions``ernie-*, baidu-*百度文心https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop``openai-completions``grok-*xAI (Grok)https://api.x.ai/v1``openai-completions → /v1/chat/completions``gemini-*Google Geminihttps://generativelanguage.googleapis.com/v1beta特殊接口,需单独处理mistral-*, codestral-*Mistralhttps://api.mistral.ai/v1``openai-completions → /v1/chat/completions``mimo-*小米 (MiMo)https://api.xiaomimimo.com/anthropic``anthropic-messages → /v1/messages
未匹配时: 自动搜索 "[model_name] API documentation base_url" 确认配置。
根据匹配结果生成 config.patch 格式的配置,包含:
使用 gateway config.patch 写入配置并重启。
重启完成后执行校验脚本,汇报结果。
常见模型的 contextWindow 和 maxTokens 参考值:
模型contextWindowmaxTokensgpt-4o12800016384gpt-4-turbo1280004096o1/o1-mini128000100000claude-3.5-sonnet2000008192claude-3-opus2000004096deepseek-chat640008192deepseek-reasoner640008192glm-41280004096qwen-max320008192qwen-long100000065536kimi-latest1280004096doubao-pro4096 (volcengine)4096minimax-abab6.52457604096mimo-v2-pro2621448192
未知模型: contextWindow 默认 128000,maxTokens 默认 4096。搜文档确认后更新。
按以下顺序逐项检查,每项给出 ✅/❌ 结果:
使用 read 工具读取 ~/.openclaw/openclaw.json,提取所有 models.providers 下的模型配置。
对每个 provider 检查:
baseUrl 是否存在且格式正确(http/https 开头)apiKey 是否存在且非空api 类型是否正确( openai-completions / anthropic-messages / anthropic-completions)id 是否存在contextWindow 和 maxTokens 是否设置使用 exec 执行 curl 测试每个 provider 的 baseUrl 是否可达:
bash
curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "<baseUrl>"
对每个 provider,使用 exec 执行实际 API 调用测试:
OpenAI 兼容接口 ( openai-completions):
bash
curl -s -X POST "<baseUrl>" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <apiKey>" \
-d '{"model":"<modelId>","messages":[{"role":"user","content":"reply 1"}],"max_tokens":10}' \
--connect-timeout 10 --max-time 30
Anthropic 兼容接口 ( anthropic-messages):
bash
curl -s -X POST "<baseUrl>/v1/messages" \
-H "Content-Type: application/json" \
-H "x-api-key: <apiKey>" \
-H "anthropic-version: 2023-06-01" \
-d '{"model":"<modelId>","max_tokens":10,"messages":[{"role":"user","content":"reply 1"}]}' \
--connect-timeout 10 --max-time 30
注意:对于 anthropic-messages,baseUrl 通常不带 /v1/messages,需要拼接。有些 baseUrl 已经包含路径,则直接用。
检查返回结果:
choices[0].message.content 是否非空content[0].text 是否非空汇总输出格式:
text
## 模型配置校验报告
### Provider: <name>
- 配置完整性: ✅/❌
- 网络连通: ✅/❌ (HTTP <code>)
- API 认证: ✅/❌
- 模型返回: ✅/❌
- 模型: <modelId> → 状态: ✅/❌ [备注]
### 总结
- 可用模型: X/Y
- 不可用模型: [列表]
- 建议: [修复建议]
不同 provider 的 baseUrl 结构不同,脚本自动处理:
API 类型处理规则anthropic-messages自动追加 /v1/messages(除非 URL 已包含)openai-completions自动追加 /chat/completions(除非 URL 已以 /chat/completions 或 /completions 结尾)
问题原因修复方式HTTP 401/403API Key 无效或过期更新 apiKeyHTTP 500服务端错误/账户耗尽检查账户余额或联系服务商连接超时baseUrl 不可达检查网络或更换 baseUrlcontent 为空接口类型不匹配检查 api 字段是否正确(openai vs anthropic)content 为空但 reasoning 有值模型输出到了思考字段增加 max_tokens 或切换接口类型Relay service error中转服务异常检查中转服务状态和账户THINKING_ONLY推理模型思考未完成正常现象,模型可用,增加 max_tokens 可获取完整输出