跳转到内容

Codex Kimi 报 HTTP 400 moonshot flavored json schema - CC Switch

Quick fix

升级 CC Switch 到最新版,代理已自动清洗 Kimi 不兼容的 $ref 兄弟关键字和根级缺失 type 的工具 schema。

报错原文
CC Switch local proxy failed while handling Codex endpoint /responses. Provider: Kimi For Coding; model: k3; upstream_status: HTTP 400; cause: tools.function.parameters is not a valid moonshot flavored json schema, details: <At path '$defs.__schema20': when using $ref, type should be defined in the referenced schema instead of the parent schema>

Codex 内置工具(如 automation_update)的参数 schema 由 Zod 或 Rust schemars 自动生成,遵循 JSON Schema 2020-12 规范,允许 `$ref` 与 `type`、`description` 等兄弟关键字并列,也允许根级使用 `oneOf` 而不带 `type` 字段。但 Moonshot (Kimi) 服务端使用旧式校验(draft-07 语义),`$ref` 节点不允许任何兄弟关键字,且强制要求 `tools[].function.parameters.type` 必须等于 `"object"`。CC Switch 在 Responses → Chat Completions 转换时原样转发 `tools`,导致 Kimi 对每个带工具的请求都返回 400。

部分用户还遇到第二种变体:`required` 中的字段未在 `properties` 中定义(悬空引用),同样触发 400。此外,早期版本(3.16.3)中火山 AgentPlan 等供应商的预设硬编码将 `apiFormat` 强制覆盖为 `openai_chat`,与「本地路由映射」开关耦合,导致无法走原生 Responses API 也会引起 HTTP 400。

  1. 升级 CC Switch 到最新版本。v3.16.4 解耦了上游格式选择器与本地路由映射开关;v3.18.0 修复了根级缺失 type 的问题(#4706 / #5315);最新 main 分支(#6863, commit db41d7018)在检测到上游为 Moonshot/Kimi 时,自动将带兄弟关键字的 `$ref` 移入 `allOf`,并处理 `required` 悬空引用。

  2. 如果升级后仍报错,尝试删除该 Kimi 供应商配置,重新申请 API key 并重新添加。

  3. 如果使用火山 AgentPlan 等支持原生 Responses API 的供应商,确保不要开启「本地路由映射」开关(或在新版中直接选择 Responses 协议),避免被强制覆盖为 openai_chat。

  4. 如果特定会话持续报错(会话卡死),新建一个会话即可临时绕过——因为包含不兼容 schema 的 tool_search_output 会永久留在旧会话历史中。

ToolCodex
Version3.16.3 - 3.20.1(受影响版本;3.16.4 起逐步修复,最新版已完全修复)
PlatformsmacOSWindows
升级到最新版后还是报同样的 400 错误怎么办?
维护者已在 main 分支通过 #6863 修复并验证端到端通过(HTTP 400 → 200),该修复随下一个发布版本上线。如果当前最新发布版本仍不含此提交,可参考 #6867 的思路自行合并分支编译,或等待下一个正式版本发布。
不只是 k3 模型,kimi-k2.7-code 和 kimi-k2.7-high-speed 也报 400,是同一个问题吗?
是的,所有 Kimi/Moonshot 模型都使用同一套严格 JSON Schema 校验,与具体模型无关。
为什么新会话正常,但某个特定会话每轮请求都失败?
Codex Desktop 的 tool_search 动态加载工具后,tool_search_output(含完整工具定义)会作为历史 item 永久留在后续请求的 input 中。如果该工具 schema 不兼容 Kimi 校验规则,该会话后续每一轮都会 400。新建会话即可绕过。
有没有临时解决方案,不想等新版发布?
有用户用 Python 写了约 100 行的本地清洗代理挂在 CC Switch 上游,递归遍历工具 schema,将 $ref 兄弟关键字合并进 $defs 克隆体、提升 anyOf/oneOf object 分支为根、剪除 required 中的悬空引用。详见 issue #6867 中的方案描述。
Codex CLI 也会遇到这个问题吗?
Codex CLI 自身的 17 个内置工具 schema 均无 $defs,不触发此问题。该问题仅由 Codex App(桌面端)注入的 automation_update 等动态工具引起。

这是一个非官方社区 wiki,与 cc-switch 作者及项目本身无隶属关系。内容整理自项目公开的 GitHub issues。本站不分发任何软件。