结构化输出导读
先把 JSON 契约做对,再谈自动化、工具调用和下游解析。
结构化输出的价值不在“看起来更像 JSON”,而在 下游系统能不能稳定解析。 对大多数生产场景,真正要分清的是:你需要的只是一个 object,还是一个严格的字段契约。
两种模式怎么选
{
"model": "openai/gpt-4.1",
"messages": [{ "role": "user", "content": "返回订单摘要 JSON。" }],
"response_format": { "type": "json_object" }
}什么时候该严格
- 你的结果会直接进数据库、自动化流程或财务系统。
- 你不能接受字段丢失、额外字段或类型漂移。
- 你希望 fallback 或模型替换后,下游代码基本不用改。
Claude 与 `json_object`
Claude 模型没有原生的 `json_object` 模式。在下列 Claude 模型上,TheRouter.ai 会追加一条“只返回一个 JSON 对象”的指令,并在返回前校验回复。这是指令加校验, 不是约束解码。
支持的模型(截至 2026-10-19):`anthropic/claude-fable-5`、`anthropic/claude-fable-5-1`、`anthropic/claude-haiku-4.5`、`anthropic/claude-haiku-5-5`、`anthropic/claude-opus-4.5`、`anthropic/claude-opus-4.6`、`anthropic/claude-opus-4.7`、`anthropic/claude-opus-4.8`、`anthropic/claude-opus-5`、`anthropic/claude-opus-5-5`、`anthropic/claude-sonnet-4.5`、`anthropic/claude-sonnet-4.6`、`anthropic/claude-sonnet-5`、`anthropic/claude-sonnet-5-5`。其他 Claude 模型(`anthropic/claude-opus-4`、`anthropic/claude-opus-4.1`、`anthropic/claude-opus-4.5-20251101`、`anthropic/claude-sonnet-3.7`、`anthropic/claude-sonnet-4`)上的 `json_object` 请求会返回 HTTP 400 `unsupported_feature`;请改用上面的模型,或在该模型支持时改用 `json_schema`。
- 非流式请求拿到的要么是一个 JSON 对象,要么是 HTTP 422、错误码 `json_object_output_invalid`。失败不计费,可以重试,或改用 `json_schema`。
- 如果整段回复被包在一个 Markdown 代码块里,代码块标记会被去掉,除此之外不改动模型输出。
- `stream: true` 时,对象会在生成结束时以一个内容 chunk 整体下发(此前只有 keepalive), 没有逐字输出。由于响应已经以 HTTP 200 开始,校验失败会以 SSE 错误事件下发 (
"object": "error",`error.code` 为 `json_object_output_invalid`),随后是 `data: [DONE]`,而不是 HTTP 422。同样不计费。 - 与校验失败不同的另一种情况:如果上游流在回复完成前提前结束且重试已用尽,缓存的内容一律不下发; 在 HTTP 200 之后会收到一个 SSE 错误事件,`error.code` 为
"502",随后是 `data: [DONE]`。 这次失败的请求不计费。如果重试成功,你会拿到校验通过的对象,请求按正常方式计费。 - 以工具调用结束(
finish_reason: "tool_calls")或被拒答(`content_filter`)的回合原样返回,不做校验。 - 因 token 上限被截断(
finish_reason: "length")的回复,只有在可见文本以{开头(可以先有一个代码块起始行)时才不经校验原样返回。如果上限在思考阶段就已耗尽、 没有可见文本,或模型先输出了一段文字,请求会以 `json_object_output_invalid` 失败。 请给推理和对象都留足 `max_tokens`。 - 校验失败不计费,因此按账号设有上限:同一 UTC 小时内在 Claude 模型上出现超过 20 次 `json_object_output_invalid` 后,之后发往 Claude 模型的 `json_object` 请求会返回 HTTP 429 (`rate_limit_error`,错误码 `json_object_invalid_rate_limited`),直到下一个 UTC 小时开始。 `json_schema` 请求和其他模型不受影响。计数包括因超过下面 2 MiB 流式上限而被拒的回复, 并且只要 `json_object` 请求最终由 Claude 模型处理(包括 `models` 列表中的回退)就会计入。
- `stream: true` 时回复会被暂存到完整为止,上限为可见文本、推理内容和工具调用参数合计 2 MiB。 超过上限的回复会以 `json_object_output_invalid` 失败(不计费),工具调用回合也一样。 非常大的结构化输出请用 `json_schema`。
- 需要有保证的结构时用 `json_schema`:在 Claude 上它由约束解码保证,并且正常流式输出。