Las salidas estructuradas restringen las respuestas de Claude para seguir un esquema específico, asegurando una salida válida y analizable para el procesamiento posterior. Hay dos características complementarias disponibles:
output_config.format): Obtén la respuesta de Claude en un formato JSON específicostrict: true): Garantiza validación de esquema en nombres de herramientas e entradasEl parámetro output_format se ha movido a output_config.format. El parámetro antiguo output_format aún funciona temporalmente pero está deprecado y se eliminará en una versión futura de la API. Actualiza tu código para usar output_config: {format: {...}} en su lugar.
Estas características se pueden usar de forma independiente o juntas en la misma solicitud.
Las salidas estructuradas están disponibles en general en la API de Claude y Amazon Bedrock para Claude Opus 4.6, Claude Sonnet 4.5, Claude Opus 4.5 y Claude Haiku 4.5. Las salidas estructuradas permanecen en beta pública en Microsoft Foundry.
¿Migrando desde beta? El parámetro output_format se ha movido a output_config.format, y los encabezados beta ya no son necesarios. El encabezado beta antiguo (structured-outputs-2025-11-13) y el parámetro output_format continuarán funcionando durante un período de transición. Consulta los ejemplos de código a continuación para la forma de API actualizada.
Sin salidas estructuradas, Claude puede generar respuestas JSON malformadas o entradas de herramientas inválidas que rompan tus aplicaciones. Incluso con indicaciones cuidadosas, puedes encontrar:
Las salidas estructuradas garantizan respuestas conformes al esquema mediante decodificación restringida:
JSON.parse()Las salidas JSON controlan el formato de respuesta de Claude, asegurando que Claude devuelva JSON válido que coincida con tu esquema. Usa salidas JSON cuando necesites:
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"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_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
}
}
}
}'Formato de respuesta: JSON válido que coincide con tu esquema en response.content[0].text
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Define tu esquema JSON
Crea un esquema JSON que describa la estructura que deseas que Claude siga. El esquema utiliza el formato estándar de JSON Schema con algunas limitaciones (consulta limitaciones de JSON Schema).
Añade el parámetro output_config.format
Incluye el parámetro output_config.format en tu solicitud de API con type: "json_schema" y tu definición de esquema.
Analiza la respuesta
La respuesta de Claude será JSON válido que coincida con tu esquema, devuelto en response.content[0].text.
Los SDKs de Python y TypeScript proporcionan ayudantes que facilitan el trabajo con salidas JSON, incluyendo transformación de esquema, validación automática e integración con bibliotecas de esquema populares.
Los métodos auxiliares del SDK (como .parse() e integración con Pydantic/Zod) aún aceptan output_format como parámetro de conveniencia. El SDK maneja la traducción a output_config.format internamente. Los ejemplos a continuación muestran la sintaxis del ayudante del SDK.
Para desarrolladores de Python y TypeScript, puedes usar herramientas familiares de definición de esquema como Pydantic y Zod en lugar de escribir esquemas JSON sin procesar.
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.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
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_config={
"format": {
"type": "json_schema",
"schema": transform_schema(ContactInfo),
}
}
)
print(response.content[0].text)
# With .parse() - can pass Pydantic model directly
response = client.messages.parse(
model="claude-opus-4-6",
max_tokens=1024,
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.messages.parse() (Recomendado)
El método parse() transforma automáticamente tu modelo Pydantic, valida la respuesta y devuelve un atributo parsed_output.
Python: ayudante transform_schema()
Para cuando necesites transformar manualmente esquemas antes de enviar, o cuando quieras modificar un esquema generado por Pydantic. A diferencia de client.messages.parse(), que transforma esquemas proporcionados automáticamente, esto te da el esquema transformado para que puedas personalizarlo aún más.
Tanto los SDKs de Python como de TypeScript transforman automáticamente esquemas con características no soportadas:
minimum, maximum, minLength, maxLength)additionalProperties: false a todos los objetosEsto significa que Claude recibe un esquema simplificado, pero tu código aún refuerza todas las restricciones mediante validación.
Ejemplo: Un campo Pydantic con minimum: 100 se convierte en un entero simple en el esquema enviado, pero la descripción se actualiza a "Debe ser al menos 100", y el SDK valida la respuesta contra la restricción original.
El uso estricto de herramientas valida parámetros de herramientas, asegurando que Claude llame a tus funciones con argumentos correctamente tipados. Usa uso estricto de herramientas cuando necesites:
Construir sistemas de agentes confiables requiere conformidad de esquema garantizada. Sin modo estricto, Claude podría devolver tipos incompatibles ("2" en lugar de 2) o campos requeridos faltantes, rompiendo tus funciones y causando errores en tiempo de ejecución.
El uso estricto de herramientas garantiza parámetros seguros de tipo:
Por ejemplo, supongamos que un sistema de reservas necesita passengers: int. Sin modo estricto, Claude podría proporcionar passengers: "two" o passengers: "2". Con strict: true, la respuesta siempre contendrá passengers: 2.
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "What is the weather in San Francisco?"}
],
"tools": [{
"name": "get_weather",
"description": "Get the current weather in a given location",
"strict": true,
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"],
"additionalProperties": false
}
}]
}'Formato de respuesta: Bloques de uso de herramientas con entradas validadas en response.content[x].input
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}Garantías:
input_schemaDefine tu esquema de herramienta
Crea un esquema JSON para el input_schema de tu herramienta. El esquema utiliza el formato estándar de JSON Schema con algunas limitaciones (consulta limitaciones de JSON Schema).
Añade strict: true
Establece "strict": true como una propiedad de nivel superior en tu definición de herramienta, junto a name, description e input_schema.
Maneja llamadas de herramientas
Cuando Claude usa la herramienta, el campo input en el bloque tool_use seguirá estrictamente tu input_schema, y el name siempre será válido.
Las salidas JSON y el uso estricto de herramientas resuelven problemas diferentes y se pueden usar juntas:
Cuando se combinan, Claude puede llamar a herramientas con parámetros garantizados válidos Y devolver respuestas JSON estructuradas. Esto es útil para flujos de trabajo de agentes donde necesitas tanto llamadas de herramientas confiables como salidas finales estructuradas.
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Help me plan a trip to Paris for next month"}],
# JSON outputs: structured response format
output_config={
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"summary": {"type": "string"},
"next_steps": {"type": "array", "items": {"type": "string"}}
},
"required": ["summary", "next_steps"],
"additionalProperties": False
}
}
},
# Strict tool use: guaranteed tool parameters
tools=[{
"name": "search_flights",
"strict": True,
"input_schema": {
"type": "object",
"properties": {
"destination": {"type": "string"},
"date": {"type": "string", "format": "date"}
},
"required": ["destination", "date"],
"additionalProperties": False
}
}]
)Las salidas estructuradas utilizan muestreo restringido con artefactos de gramática compilados. Esto introduce algunas características de rendimiento a tener en cuenta:
name o description no invalida el cachéCuando usas salidas estructuradas, Claude recibe automáticamente una indicación de sistema adicional explicando el formato de salida esperado. Esto significa:
output_config.format invalidará cualquier caché de indicaciones para ese hilo de conversaciónLas salidas estructuradas soportan JSON Schema estándar con algunas limitaciones. Tanto las salidas JSON como el uso estricto de herramientas comparten estas limitaciones.
Los SDKs de Python y TypeScript pueden transformar automáticamente esquemas con características no soportadas eliminándolas y añadiendo restricciones a descripciones de campos. Consulta métodos específicos del SDK para detalles.
Aunque las salidas estructuradas garantizan conformidad de esquema en la mayoría de los casos, hay escenarios donde la salida podría no coincidir con tu esquema:
Rechazos (stop_reason: "refusal")
Claude mantiene sus propiedades de seguridad y utilidad incluso cuando usa salidas estructuradas. Si Claude rechaza una solicitud por razones de seguridad:
stop_reason: "refusal"Límite de tokens alcanzado (stop_reason: "max_tokens")
Si la respuesta se corta debido a alcanzar el límite de max_tokens:
stop_reason: "max_tokens"max_tokens más alto para obtener la salida estructurada completaSi tu esquema usa características no soportadas o es demasiado complejo, recibirás un error 400:
"Too many recursive definitions in schema"
"Schema is too complex"
strict: truePara problemas persistentes con esquemas válidos, contacta con soporte con tu definición de esquema.
Funciona con:
output_config.format) y uso estricto de herramientas (strict: true) juntos en la misma solicitudIncompatible con:
output_config.format.Alcance de gramática: Las gramáticas se aplican solo a la salida directa de Claude, no a llamadas de uso de herramientas, resultados de herramientas o etiquetas de pensamiento (cuando se usa Pensamiento extendido). El estado de la gramática se reinicia entre secciones, permitiendo que Claude piense libremente mientras aún produce salida estructurada en la respuesta final.
Was this page helpful?