跳转到内容

Codex 接 Kimi 报 HTTP 400 tool schema 校验失败

Quick fix

升级 cc-switch 到 v3.18.0+;若仍报错需等待 MFJS schema 清洗功能上线。

报错原文
CC Switch local proxy failed while handling Codex endpoint /responses. Provider: Kimi For Coding; model: kimi-for-coding; upstream_status: HTTP 400; cause: tools.function.parameters.type is required and must be "object"

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

该问题存在多个变体报错:早期版本(3.16.x)报 tools.function.parameters.type is required;3.17.0 版本报 $ref 兄弟关键字违规(如 $defs.__schema20: when using $ref, type should be defined...);部分场景还报 required 悬空引用或 anyOf.properties.type 未定义。v3.18.0 已修复 type 缺失问题(补根级 type:object),但 $ref 兄弟关键字清洗和 required 悬空引用剪除尚未在发布版中实现,3.20.0 仍必现。

  1. 升级 cc-switch 到 v3.18.0 或更高版本。v3.18.0 已修复 tools.function.parameters.type 缺失导致的 400 错误,会将工具 parameters 归一为 object 类型。

  2. 如果升级后仍报错(如 $ref 兄弟关键字或 required 悬空引用),这是已知未修复问题。临时方案:在 cc-switch 本地代理与 Moonshot 之间挂一个本地清洗代理(如 Python 脚本),递归遍历 tools[].function.parameters,将 $ref 同层的 type/description 合并进 $defs 引用目标,剪除 required 中不存在于 properties 的条目,并将根级 oneOf/anyOf 包装为 type:object。

ToolCodex
Version3.16.3 - 3.20.0(3.18.0 修复 type 缺失,$ref 清洗未修复)
PlatformsmacOSWindows
为什么新会话正常,但特定会话持续报 400?
Codex Desktop 支持 tool_search 动态加载工具,tool_search_output 会作为历史 item 永久留在后续请求的 input 中。如果历史中包含不兼容 Moonshot schema 的工具定义,该会话后续每一轮请求都会失败。
为什么我升级到最新版还是报错?
v3.18.0 仅修复了 tools.function.parameters.type 缺失的问题。如果报错信息涉及 $ref 兄弟关键字(如 $defs.__schema20: when using $ref, type should be defined...)或 required 悬空引用,这是尚未在发布版修复的已知问题,需要等待 MFJS schema 清洗功能上线。
有没有临时解决方案?
可以在 cc-switch 本地代理与 Moonshot 之间挂一个本地清洗代理(约 100 行 Python 脚本),递归清洗工具 schema:合并 $ref 兄弟关键字到引用目标、剪除 required 悬空引用、包装根级 oneOf/anyOf 为 type:object。已有用户在 macOS 和 Windows 上验证通过。
Codex CLI 也会触发这个问题吗?
Codex CLI 自身的 17 个内置工具不触发此问题(它们的 schema 均无 $defs)。问题主要由 Codex App(桌面版)注入的 automation_update 等动态工具引起,这些工具的 schema 由 Zod 4 或 Rust schemars 生成,包含大量 $defs 和 $ref 兄弟关键字。
火山引擎/百炼等国产供应商也会遇到类似问题吗?
早期版本中火山 AgentPlan 等供应商因预设硬编码和本地路由映射开关,会强制覆盖 apiFormat 为 openai_chat,导致无法走原生 Responses API。v3.16.4 已解耦此问题,上游格式选择器独立可见。但若供应商同样使用严格 schema 校验,可能存在类似 Moonshot 的 400 问题。

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