结构化输出限制 Claude 的响应遵循特定的模式,确保有效的、可解析的输出用于下游处理。使用 JSON 输出(output_format)获取结构化数据响应,或使用严格工具使用(strict: true)确保对工具名称和输入进行模式验证。
结构化输出目前在 Claude API 中作为公开测试版功能提供,支持 Claude Sonnet 4.5 和 Claude Opus 4.1。
要使用该功能,请设置 beta 标头 structured-outputs-2025-11-13。
使用此表单分享反馈。
如果没有结构化输出,Claude 可能会生成格式错误的 JSON 响应或无效的工具输入,从而破坏您的应用程序。即使进行仔细的提示,您也可能会遇到:
结构化输出通过约束解码保证模式兼容的响应:
JSON.parse() 错误为您的用例选择正确的模式:
| 何时使用 JSON 输出 | 何时使用严格工具使用 |
|---|---|
| 您需要 Claude 的响应采用特定格式 | 您需要为工具调用验证参数和工具名称 |
| 从图像或文本中提取数据 | 构建代理工作流 |
| 生成结构化报告 | 确保类型安全的函数调用 |
| 格式化 API 响应 | 具有许多和/或嵌套属性的复杂工具 |
构建可靠的代理系统需要保证模式一致性。无效的工具参数会破坏您的函数和工作流。Claude 可能会返回不兼容的类型("2" 而不是 2)或缺少字段,导致运行时错误。
严格工具使用保证类型安全的参数:
例如,假设预订系统需要 passengers: int。在没有严格模式的情况下,Claude 可能会提供 passengers: "two" 或 passengers: "2"。使用 strict: true,您可以保证 passengers: 2。
Python 和 TypeScript SDK 提供了帮助程序,使使用 JSON 输出变得更容易,包括模式转换、自动验证和与流行模式库的集成。
对于 Python 和 TypeScript 开发人员,您可以使用熟悉的模式定义工具(如 Pydantic 和 Zod),而不是编写原始 JSON 模式。
仅限 JSON 输出
SDK 帮助程序(Pydantic、Zod、parse())仅适用于 JSON 输出(output_format)。
这些帮助程序转换和验证 Claude 对您的输出。严格工具使用验证 Claude 对您的工具的输入,这些工具使用工具定义中现有的 input_schema 字段。
对于严格工具使用,在工具定义中直接定义您的 input_schema,使用 strict: true。
from pydantic import BaseModel
from anthropic import Anthropic, transform_schema
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
demo_requested: bool
client = Anthropic()
# With .create() - requires transform_schema()
response = client.beta.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
betas=["structured-outputs-2025-11-13"],
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm."
}
],
output_format={
"type": "json_schema",
"schema": transform_schema(ContactInfo),
}
)
print(response.content[0].text)
# With .parse() - can pass Pydantic model directly
response = client.beta.messages.parse(
model="claude-sonnet-4-5",
max_tokens=1024,
betas=["structured-outputs-2025-11-13"],
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm."
}
],
output_format=ContactInfo,
)
print(response.parsed_output)Python:client.beta.messages.parse()(推荐)
parse() 方法自动转换您的 Pydantic 模型,验证响应,并返回 parsed_output 属性。
parse() 方法在 client.beta.messages 上可用,而不是在 client.messages 上。
Python:transform_schema() 帮助程序
用于在发送前手动转换模式,或当您想修改 Pydantic 生成的模式时。与 client.beta.messages.parse() 不同,后者自动转换提供的模式,这给了您转换后的模式,以便您可以进一步自定义它。
Python 和 TypeScript SDK 都自动转换具有不支持功能的模式:
minimum、maximum、minLength、maxLength)additionalProperties: false这意味着 Claude 接收一个简化的模式,但您的代码仍然通过验证强制执行所有约束。
示例: 具有 minimum: 100 的 Pydantic 字段在发送的模式中变成普通整数,但描述更新为"必须至少 100",SDK 根据原始约束验证响应。
结构化输出使用带有编译语法工件的约束采样。这引入了一些需要注意的性能特征:
name 或 description 字段不会使缓存失效使用结构化输出时,Claude 自动接收一个额外的系统提示,解释预期的输出格式。这意味着:
output_format 参数将使该对话线程的任何 prompt cache 失效结构化输出支持标准 JSON Schema,但有一些限制。JSON 输出和严格工具使用都共享这些限制。
Python 和 TypeScript SDK 可以通过删除不支持的功能并将约束添加到字段描述来自动转换模式。有关详细信息,请参阅 SDK 特定方法。
虽然结构化输出在大多数情况下保证模式合规性,但在某些情况下输出可能不匹配您的模式:
拒绝(stop_reason: "refusal")
Claude 即使在使用结构化输出时也保持其安全性和有用性属性。如果 Claude 出于安全原因拒绝请求:
stop_reason: "refusal"达到令牌限制(stop_reason: "max_tokens")
如果响应因达到 max_tokens 限制而被截断:
stop_reason: "max_tokens"max_tokens 值重试以获得完整的结构化输出如果您的模式使用不支持的功能或过于复杂,您将收到 400 错误:
"模式中的递归定义过多"
"模式过于复杂"
strict: true 的工具数量对于有效模式的持续问题,请 联系支持 并提供您的模式定义。
适用于:
output_format)和严格工具使用(strict: true)不兼容:
语法范围:语法仅适用于 Claude 的直接输出,不适用于工具使用调用、工具结果或思考标签(使用 Extended Thinking 时)。语法状态在各部分之间重置,允许 Claude 自由思考,同时仍在最终响应中生成结构化输出。