response_format 参数约束聊天补全的输出格式。它支持两种模式:
| 模式 | type 值 | 说明 | 适用场景 |
|---|---|---|---|
| JSON Mode | json_object | 保证输出为合法 JSON Object,但不约束具体字段 | 简单 JSON 输出、字段灵活的场景 |
| Structured Output | json_schema | 通过 JSON Schema 精确定义字段名、类型、嵌套结构 | 需要严格结构、对接下游系统的场景 |
response_format 的 json_schema 模式(即 Structured Output),包括参数用法、模型差异、常见问题与错误处理。JSON Mode 的基础用法可参考 JSON Mode。
response_format 基本结构
type为json_object时,不需要json_schema字段。type为json_schema时,必须提供json_schema.name和json_schema.schema。
Structured Output 的优势
与 JSON Mode 相比,Structured Output 的优势在于:- 结构严格受控:模型输出必须完全遵循你定义的 JSON Schema,字段名、类型、嵌套层级都一一对应。
- 无需在 prompt 中反复描述格式:将格式要求从 schema 中剥离,降低 prompt 工程的复杂度。
- 下游系统对接更可靠:输出可直接被
json.loads解析为强类型对象,无需额外的容错处理。
模型差异提示:不同模型对 JSON Schema 的支持程度存在差异。
kimi-k2.7-code对 Structured Output 的支持最稳,包括嵌套对象、数组、anyOf/oneOf/$ref/additionalProperties: true等都能正常处理。kimi-k2.6在复杂 schema 下偶有不稳定表现,例如$ref可能返回 Markdown 代码块、oneOf可能被忽略、partial=true可能输出 schema 外字段。使用kimi-k2.6时建议优先使用简单 schema,并在业务层做二次校验。
快速开始
基本用法
在response_format 中将 type 设为 "json_schema",并传入 json_schema 对象:
输出示例
关于 reasoning_content
kimi-k2.7-code 等思考模型在返回 content 的同时,可能还会返回 reasoning_content。请只解析 choices[0].message.content 作为最终 JSON,不要直接用 json.loads 处理整个响应对象。
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
type | "json_schema" | "json_object" | 必须设置,二选一 |
json_schema.name | string | Schema 的标识名称,用于日志和调试 |
json_schema.strict | boolean | 是否严格按 schema 约束输出。建议显式设置为 true |
json_schema.schema | object | JSON Schema 对象,定义输出结构 |
注意:实测中strict为true、false或省略时,kimi-k2.7-code对 schema 的遵守程度都较高;kimi-k2.6在strict=false或省略时更容易输出 schema 外字段。因此建议始终显式设置strict: true。
strict 模式说明
json_schema.strict 建议设置为 true,表示强制模型输出必须完全匹配 schema 定义。此时你的 schema 需要符合 MFJS(Moonshot Flavored JSON Schema) 规范。
MFJS 的模型差异:如果
kimi-k2.7-code对anyOf/oneOf/$ref/additionalProperties: true等特性的支持已比较完善,通常不会触发 MFJS 报错。kimi-k2.6在复杂 schema 下更可能触碰 MFJS 限制,建议保持 schema 简单。
strict 设为 false,API 仅保证输出为合法 JSON 对象,但不强制约束内部字段结构。这在 schema 较复杂或你希望给予模型更大灵活性时可以使用。
如何校验 schema 是否符合 MFJS
可以使用walle CLI 工具快速自检 schema 的兼容性:
实测中,即使 schema 包含anyOf/oneOf/$ref,API 也常能正常返回200,且响应中未出现warning字段。因此walle更适合作为静态检查入口,实际兼容性请以目标模型的在线调用结果为准。
嵌套对象与数组示例
Structured Output 支持任意深度的嵌套对象和数组,这在kimi-k2.7-code 上表现稳定:
JSON Mode 与 Structured Output 的对比
| 特性 | json_object | json_schema |
|---|---|---|
| 输出合法性 | 保证合法 JSON Object | 保证合法 JSON Object |
| 结构约束 | 无(需在 prompt 中描述) | 有(由 schema 严格定义) |
| 字段类型 | 不强制 | 强制匹配 |
| 字段缺失 | 可能缺失字段 | required 字段必现 |
| 使用场景 | 简单 JSON 输出 | 需要精确结构的下游系统对接 |
| strict 校验 | 无 | 有(MFJS 规范) |
注意事项
-
Schema 需符合 MFJS 规范:
strict=true时,建议使用walleCLI 工具预先校验 schema。常见的 MFJS 约束在kimi-k2.7-code上已大幅放宽,但在kimi-k2.6上仍可能触发。 - 提示词仍需提供上下文:虽然格式由 schema 约束,但模型仍需理解业务内容。请在 system prompt 或 user prompt 中清晰描述任务目标和数据来源。
-
additionalProperties:- 设置为
false时,模型不会输出 schema 中未定义的字段。 - 设置为
true或不指定时,kimi-k2.7-code允许输出额外字段;kimi-k2.6也可能输出额外字段,但稳定性不如kimi-k2.7-code。
- 设置为
-
空值处理:当
required字段在 prompt 中找不到对应信息时,模型可能返回空字符串(如"employee_id": "")。建议在业务层再做一层空值校验。 -
错误处理:当 schema 过于复杂或 prompt 与 schema 矛盾时,模型可能输出不完整的 JSON(
finish_reason="length")。建议检查finish_reason并适当增大max_tokens。 -
与 Partial Mode 的兼容性:
kimi-k2.7-code在简单 schema 下与partial=true混用通常正常,但复杂 schema 仍可能破坏结构约束。kimi-k2.6在partial=true下更容易输出 schema 外字段,因此不建议在该模型上混用。
常见错误
invalid_request_error
Schema 格式本身不合法(例如 json_schema.schema 不是 object)时,API 会返回 400,错误类型为 invalid_request_error:
输出被截断(finish_reason="length")
模型在输出完整 JSON 之前达到了 max_tokens 限制。建议:
- 增大
max_tokens(例如 4096 或更高) - 简化 schema 的嵌套层级
- 缩短输入文本长度
字段类型不匹配 / 输出 Markdown 代码块
在kimi-k2.6 等旧模型上,可能出现以下情况:
- 返回的
content包含 Markdown 代码块(如json ...),导致json.loads失败。 oneOf/$ref等复杂 schema 未被严格遵守。
- 使用
kimi-k2.7-code进行 Structured Output 调用。 - 如果必须使用
kimi-k2.6,在业务层先 stripping Markdown 标记,再对解析结果做 schema 字段校验。