Claude API 结构化输出(JSON)怎么写:output_config.format、strict 工具、Pydantic 与 Zod

想让 Claude 稳定返回符合 schema 的 JSON?用 output_config.format 的 json_schema,或给工具加 strict。本文给 Pydantic 和 Zod 示例,讲 schema 支持范围、refusal 与 max_tokens 造成的无效输出、首次编译延迟和复杂度限制。

NNathaniel bigo··原创首发·AI 辅助撰写
10 分钟读完
资料核对于 2026-11-05 · 依据官方文档与公开资料整理 其他 账号
本文根据 Claude 官方《Structured outputs》整理,资料核对于 2026-11-05。配图为本站整理的示意图,不是界面截图。代码里的模型名取自官方当天示例,请以官方模型页为准。本站(bigolab.com)不是 Anthropic 官方网站。API 是按用量计费的独立服务,与 Claude 订阅分开计算,Key 的获取见 /guides/claude-api-key-console。

适用于谁

  • 要把 Claude 的回答直接存进数据库、喂给下游程序的开发者:抽取字段、分类、打标签;
  • 以前靠“请只输出 JSON”加正则兜底,经常解析失败的人;
  • 在做工具调用,希望参数百分之百符合 schema 的人(工具基础见 /guides/claude-tool-use-basics)。

结论先说

  1. 两个功能:JSON 输出(output_config.format,类型 json_schema)约束回答文字;严格工具调用(strict: true)约束工具名和参数。可以单用,也可以同时用。
  2. 旧的 output_format 参数已弃用,改用 output_config.format,现在不再需要 beta 请求头。
  3. SDK 助手能省事:Python 用 Pydantic 加 messages.parse,TypeScript 用 Zod,结果直接是解析好的对象。
  4. 仍要处理两种异常:stop_reason 为 refusal(拒绝,输出可能不符合 schema)和 max_tokens(被截断,JSON 可能不完整)。
  5. schema 只支持一个子集,用了不支持的特性会返回 400。

结构化输出的两个功能

图:本站根据 Claude 官方《Structured outputs》 整理的示意图

一、直接写 JSON schema

Python:

python
import json
import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-5-5",  # 以官方模型页当天为准
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "提取信息:张三([email protected])想要企业版并预约演示。",
        }
    ],
    output_config={
        "format": {
            "type": "json_schema",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "email": {"type": "string"},
                    "plan_interest": {"type": "string"},
                    "demo_requested": {"type": "boolean"},
                },
                "required": ["name", "email", "plan_interest", "demo_requested"],
                "additionalProperties": False,
            },
        }
    },
)

text = next(b.text for b in response.content if b.type == "text")
data = json.loads(text)
print(data)

注意三点:

  • 回答在 type 为 text 的内容块里,是一段合法 JSON 字符串,自己 json.loads;
  • 每个对象必须写 additionalProperties: false;
  • 想要的字段都放进 required,下面讲的属性顺序问题也会因此更好处理。

二、用 SDK 助手:Pydantic 与 Zod

写类比写 schema 更顺手,SDK 会替你转换:

python
from pydantic import BaseModel
import anthropic

client = anthropic.Anthropic()


class ContactInfo(BaseModel):
    name: str
    email: str
    plan_interest: str
    demo_requested: bool


response = client.messages.parse(
    model="claude-opus-5-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "提取信息:张三([email protected])想要企业版并预约演示。"}],
    output_format=ContactInfo,
)
print(response.parsed_output)

注意:messages.parse 这个助手方法的参数仍叫 output_format,传的是类;你直接调用 messages.create 时才用 output_config.format。官方还提醒,Python SDK 1.0 及之后,在 client.beta.messages.create() 里传旧的 output_format={...} 字典会抛 TypeError。

TypeScript 用 Zod:

typescript
import Anthropic from "@anthropic-ai/sdk";
import { z } from "zod";
import { zodOutputFormat } from "@anthropic-ai/sdk/helpers/zod";

const client = new Anthropic();

const ContactInfo = z.object({
  name: z.string(),
  email: z.string(),
  plan_interest: z.string(),
  demo_requested: z.boolean(),
});

const response = await client.messages.parse({
  model: "claude-opus-5-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "提取信息:张三([email protected])想要企业版并预约演示。" }],
  output_config: { format: zodOutputFormat(ContactInfo) },
});
console.log(response.parsed_output);

不想用 Zod,可以用 @anthropic-ai/sdk/helpers/json-schema 的 jsonSchemaOutputFormat(),把 schema 声明为 as const 还能得到类型推断。

官方说明助手做的转换:去掉不支持的约束(比如 minimum、maxLength)并把它们写进字段说明里;给所有对象补 additionalProperties: false;过滤字符串格式;如果助手带校验,会按原始约束在本地再检查一次返回值。

三、schema 支持什么、不支持什么

schema 的支持范围

图:本站根据 Claude 官方《Structured outputs》 整理的示意图

支持:object、array、string、integer、number、boolean、null;enum(只能是标量);const;anyOf、allOf(allOf 不能和 $ref 一起用);内部的 $ref、$defs、definitions;required;字符串的一批 format(如 date-time、date、email、uri、uuid 等);数组的 minItems,但只能是 0 或 1。

不支持:递归 schema;复杂类型的 enum;外部 $ref;minimum、maximum、multipleOf;minLength、maxLength;additionalProperties 取 false 以外的值。简单的正则 pattern 可用,但后向引用、环视、\b 不行。用了不支持的特性会返回 400。

四、无效输出的两种情况

即使有 schema 约束,下面两种情况的输出也可能不是你想要的:

  • stop_reason: "refusal":Claude 出于安全原因拒绝。返回仍是 200,也照常计费,但输出可能不符合 schema。官方还提醒:如果在 schema 里要求“逐步推理”的字段,可能触发 reasoning_extraction 类的拒绝,改成要“简短解释”更稳;
  • stop_reason: "max_tokens":输出被截断,JSON 可能不完整,把 max_tokens 调大再试。

另外两个官方提到的细节:枚举值有时只有大小写不同(例如返回 “Conversation Topic 3” 而不是 “Conversation topic 3”),比较时忽略大小写,并避免设计只靠大小写区分的枚举;属性顺序是先必填、后可选,各自按 schema 顺序,如果顺序重要就都设为必填。

五、延迟、缓存与复杂度

  • 第一次用一个新 schema 会有编译延迟;编译结果自最后一次使用起缓存 24 小时。改变 schema 结构(或和工具搭配时改变工具集合)会使缓存失效,只改工具的名称或描述则不会;
  • 系统会注入一段描述输出格式的提示,多占一些输入 token;
  • 更改 output_config.format 会使该对话的提示词缓存失效(缓存见 /guides/claude-prompt-caching);
  • 复杂度限制:每个请求最多 20 个严格工具;所有严格工具和 JSON schema 合计最多 24 个可选参数;最多 16 个联合类型(anyOf 或类型数组)参数。超限会返回 400,信息类似 “Schema is too complex for compilation”,编译超时是 180 秒。降低复杂度的办法:只给关键工具加 strict,参数尽量设为必填,把嵌套对象摊平,把任务拆成多次请求。

六、和别的功能的关系

  • 官方 Errors 页写明,Claude 4.6 及之后的模型不支持预填助手消息,会返回 400,官方建议用结构化输出、系统提示或 output_config.format 代替;
  • 批处理可以和结构化输出一起用,官方写明仍享受批量折扣,批量写法见 /guides/claude-api-message-batches;
  • token 计数接口也支持,见 /guides/claude-api-count-tokens;
  • 和流式、引用等其他功能能不能同时用,官方这一页的兼容性清单我们没读到,请到官方页面核对。

常见问题

Q:为什么返回 400,说 schema 不支持?

对照第三节:多半是用了 minimum、maxLength、递归、外部 $ref,或对象缺了 additionalProperties: false。用 SDK 助手能自动处理一部分。

Q:JSON 还是解析失败?

先看 stop_reason:是 max_tokens 就加大额度,是 refusal 就要处理拒绝的情况。

Q:计费有变化吗?

官方这一页没有单独列出结构化输出的费用,但格式提示会增加输入 token,价格以官方价格页当天为准。

参考资料

  • Claude 官方:Structured outputs — https://platform.claude.com/docs/en/build-with-claude/structured-outputs
  • Claude 官方:Claude API errors — https://platform.claude.com/docs/en/api/errors

Nathaniel 的更多内容

  1. 01

    Claude Code 处理大仓库:怎么让它只看需要的目录(子目录 CLAUDE.md、claudeMdExcludes、deny 规则)

    仓库太大,Claude Code 总在读无关文件、读进别的包的规则?本文按官方大仓库指南讲:从哪个目录启动、子目录 CLAUDE.md、claudeMdExcludes、Read 的 deny 规则、worktree.sparsePaths、additionalDirectories,以及一份合并后的配置示例。

    Claude0
  2. 02

    Claude Code 在 CI 里跑:从本机 claude -p 到 GitHub Actions 的完整例子(自动审 PR、控成本)

    一条线走完 Claude Code 的 CI 用法:先在本机用 claude --bare -p 配 --json-schema 跑通,再写进 GitHub Actions 用 claude-code-action@v1 自动审 PR,最后加上 --max-turns、超时、并发限制来控成本,并附上常见故障的排查顺序。

    Claude0
  3. 03

    Claude Code 自定义 subagent 实例:测试员、调试员、只读调研员、只读数据库员怎么写

    四个可直接改的 subagent 实例:跑测试的 test-runner、找根因的 debugger、只读调研员、用 PreToolUse hook 限成只读 SQL 的 db-reader;讲 tools、disallowedTools、model、maxTurns 怎么配,怎么点名调用。

    Claude0
  4. 04

    Claude Code 的 CLAUDE.md 模板:前端、后端、数据分析各一份,附拆分与自检方法

    直接拿去改的三份 CLAUDE.md 模板(前端、后端、数据分析),每份都控制在官方建议的 200 行以内;再讲怎么用 .claude/rules 的 paths 拆出专属规则、用 @ 导入长文档,以及用 /context all 和 /doctor prompt-audit 检查是否生效。

    Claude0
  5. 05

    Claude Code 自己写一个插件并发布到 marketplace:plugin.json、marketplace.json、validate 到团队安装的完整流程

    想把自己写的 Skill、Hook 打包给团队用?按 Claude Code 官方 Plugins 文档,从目录结构、plugin.json、claude plugin validate,到写 marketplace.json、推到 Git、让同事一条命令安装,再到版本更新,走完一遍完整流程。

    Claude0
  6. 06

    Claude Code 写一个会自动触发的 Skill:从需求到触发,用 description、when_to_use 和 paths 控制它什么时候出场

    写好的 Skill 总是不触发,或者什么都触发?本文按 Claude Code 官方「Extend Claude with skills」走一遍完整实例:把「改数据库迁移前先检查」写成一个会自动出场的 Skill,包含 description、when_to_use、paths、附带脚本、触发测试和评估。

    Claude0

同产品的其他教程

  1. 01

    Claude Code 配 Sentry MCP 排查线上报错:添加命令、浏览器授权、贴 issue 链接修 bug 和插件子智能体

    线上报错只能手动复制堆栈给 Claude Code?Sentry 官方提供 MCP 服务,可以让它直接读 issue、堆栈和 trace。本文按 Claude Code 官方 MCP 文档和 Sentry MCP 官方说明,讲添加命令、/mcp 授权、典型排查流程、插件方式和自托管注意事项。

    Claude0
  2. 02

    Claude Code 配 Context7 MCP 查最新文档:两种安装方式、use context7 怎么写、指定库和版本

    Claude Code 写出来的代码用了旧版 API?Context7 是一个把库的最新文档喂给编程助手的 MCP 服务。本文按 Context7 官方仓库和文档,讲两种安装方式、在 Claude Code 里的添加命令、use context7 与 library ID 的写法,以及使用时的注意事项。

    Claude0
  3. 03

    Claude API 用量层级与速率限制:Evaluation / Start / Build / Scale 怎么分、月度花费上限、自设上限和怎么申请提额

    Claude API 的限额到底按什么算?按官方《Rate limits》讲清用量层级、RPM / ITPM / OTPM、缓存读取为何不占 ITPM、各层级月度花费上限、自设花费上限的 400、工作区限额、响应头,以及在 Console 里 Request tier increase 提额。

    Claude0
  4. 04

    Claude API 模型 ID 怎么写、怎么查可用模型:dateless 命名、别名区别、Models API 的 lifecycle 和 capabilities

    model 参数该填什么?按官方《Models overview》《Model IDs and versioning》《List Models》讲清 Claude 模型 ID 的格式、4.6 之前带日期与之后不带日期的区别、别名是什么,以及用 GET /v1/models 查可用模型、生命周期和能力字段。

    Claude0
  5. 05

    Claude API 代码执行工具(code execution)怎么用:tools 写法、上传文件分析、取回生成文件、容器限制和计费

    想让 Claude API 真的跑代码做数据分析、生成图表和文件?按官方《Code execution tool》讲清三个工具版本、最小请求、上传 CSV 分析、$OUTPUT_DIR 取回文件、容器内存与联网限制、错误码、容器复用和计费规则。

    Claude0
  6. 06

    Claude API 联网搜索工具(web search tool)怎么用:tools 写法、max_uses、域名过滤、引用字段和计费

    想让 Claude API 回答带最新信息?按官方《Web search tool》讲清 web_search 工具的三个版本、请求写法、max_uses、域名过滤、引用字段、错误码和计费,附排查表。

    Claude0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~