Anatomía de una solicitud de API
model, max_tokens, system, messages, tools y tool_choice.
Anatomía de una solicitud de API es una lección gratuita de Claude Architect en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Claude Architect, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Claude Architect incluye 4 lecciones en total.
El endpoint único
Cada llamada a Claude es una solicitud a la Messages API. Como arquitecto, no necesita memorizar la sintaxis; debe razonar sobre seis campos que determinan toda la interacción: model, max_tokens, system, messages, tools y tool_choice.
Si configura correctamente estos campos, todo lo demás —agentes, bucles de herramientas y salidas estructuradas— encaja. En esta lección se explica cada campo y la decisión que representa.
from anthropic import Anthropic
client = Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system="You are a concise assistant.",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.content[0].text)model — Qué cerebro utilizar
El campo model selecciona qué Claude realizará el trabajo. Es una sola cadena y la elección implica un equilibrio arquitectónico real entre capacidad, latencia y coste.
- Opus: el más capaz, ideal para agentes con horizontes prolongados y razonamientos complejos.
- Sonnet: equilibrio sólido entre velocidad e inteligencia.
- Haiku: el más rápido y económico para tareas sencillas y de gran volumen.
Puede cambiar el modelo en cada solicitud, de modo que puede dirigir las tareas sencillas a un modelo más económico y las difíciles a uno más potente.
# Same request shape, different routing decision
response = client.messages.create(
model="claude-opus-4-8", # swap to a cheaper model for simple tasks
max_tokens=1024,
messages=[{"role": "user", "content": "Summarize this ticket."}],
)max_tokens — El límite de salida
max_tokens es un límite estricto para la cantidad de tokens que Claude puede generar en esta respuesta. El modelo no recibe este número; es un límite impuesto, no una sugerencia.
Si la generación alcanza el límite, la respuesta se corta y stop_reason devuelve "max_tokens". Esto significa que la respuesta está truncada, no completa. Establezca un valor suficientemente alto para terminar el trabajo; en salidas muy largas, use streaming para no alcanzar los tiempos de espera de la solicitud.
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=4096, # generous ceiling so the answer isn't cut off
messages=[{"role": "user", "content": "Write a detailed migration plan."}],
)
if response.stop_reason == "max_tokens":
print("Truncated — raise max_tokens or stream.")system — Personalidad y reglas
El prompt system define el rol, el tono y las reglas permanentes de Claude: las instrucciones que se aplican a toda la conversación, no solo a un turno del usuario.
Coloque aquí el comportamiento duradero: "Usted es un agente de soporte. Verifique la identidad del cliente antes de realizar cualquier acción en su cuenta." Manténgalo estable entre solicitudes; un prompt del sistema fijo también se almacena bien en caché, lo que reduce el coste y la latencia de las llamadas repetidas.
SYSTEM = (
"You are a customer-support agent for an online store. "
"Always verify the customer's identity before discussing an order. "
"Be warm, concise, and never invent order details."
)
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system=SYSTEM,
messages=[{"role": "user", "content": "Where is my order?"}],
)messages — Todo el historial
Este es el campo que los arquitectos configuran mal con mayor frecuencia. La Messages API es sin estado: el modelo NO conserva memoria entre solicitudes. En cada turno debe volver a enviar el historial completo de la conversación: todos los turnos anteriores del usuario y del asistente, además de los resultados de las herramientas.
Si solo envía el último mensaje del usuario, Claude sufrirá amnesia. El estado de la conversación vive en su aplicación; debe reproducirlo en cada llamada. Los mensajes alternan los roles y el primero debe ser user.
messages = [
{"role": "user", "content": "My name is Alice."},
{"role": "assistant", "content": "Hi Alice!"},
{"role": "user", "content": "What's my name?"}, # only works because history is resent
]
response = client.messages.create(
model="claude-opus-4-8", max_tokens=256, messages=messages,
)tools — Darle manos a Claude
El campo tools es una lista de acciones que Claude puede invocar; cada una incluye un name, un input_schema (JSON Schema) y, sobre todo, una description.
La description es la forma principal en que Claude decide qué herramienta utilizar, no el nombre. Una buena descripción indica el propósito de la herramienta, sus valores de retorno, los formatos de entrada con ejemplos y cuándo NO debe utilizarse. Las descripciones vagas o superpuestas provocan un enrutamiento incorrecto. Mantenga el conjunto reducido: lo óptimo son aproximadamente 4–5 herramientas por agente; añadir más de 18 perjudica la fiabilidad de la selección.
tools = [{
"name": "get_customer",
"description": (
"Look up a customer by verified email or account ID. "
"Returns name, tier, and a verified customer_id. "
"Call this FIRST before any account action; do not guess IDs."
),
"input_schema": {
"type": "object",
"properties": {"email": {"type": "string"}},
"required": ["email"],
},
}]tool_choice — Quién decide
tool_choice controla si Claude llama a una herramienta y cómo lo hace:
{"type": "auto"}: Claude decide si responde con texto o llama a una herramienta (valor predeterminado).{"type": "any"}: Claude DEBE llamar a alguna herramienta. Así se garantiza una salida estructurada.{"type": "tool", "name": "X"}: obliga a utilizar una herramienta específica.
Use any o una herramienta obligatoria cuando necesite un resultado legible por máquinas en cada ocasión; use auto en conversaciones abiertas en las que a veces sea correcta una respuesta sencilla.
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
tools=tools,
tool_choice={"type": "any"}, # force SOME tool -> structured result guaranteed
messages=[{"role": "user", "content": "Find the customer alice@shop.com"}],
)stop_reason — Interpretar el resultado
Cada respuesta incluye un stop_reason que indica qué debe hacer a continuación. Los arquitectos toman decisiones basándose en él; nunca analizan el texto en busca de palabras como "hecho".
"end_turn": Claude ha terminado de forma natural; el turno está completo."tool_use": Claude quiere ejecutar una herramienta; ejecútela, añada el resultado y continúe."max_tokens": la salida se ha truncado por alcanzar el límite."stop_sequence": se ha encontrado una cadena de detención configurada.
Este único campo es la señal de control de todo el bucle agéntico.
response = client.messages.create(
model="claude-opus-4-8", max_tokens=1024,
tools=tools, messages=messages,
)
if response.stop_reason == "tool_use":
pass # run the tool, append result, call again
elif response.stop_reason == "end_turn":
pass # complete
elif response.stop_reason == "max_tokens":
pass # truncated -> raise max_tokensEl bucle agéntico
Las herramientas, messages y stop_reason se combinan en el patrón principal: solicitud → inspeccionar stop_reason → si es tool_use, ejecutar las herramientas y añadir los resultados al historial → repetir hasta end_turn.
Como la API no tiene estado, debe añadir la solicitud de herramienta del asistente Y el resultado de la herramienta de nuevo a messages antes de la siguiente llamada. La terminación depende de stop_reason; las decisiones las toma el modelo. Cualquier límite de iteraciones que añada es una red de seguridad, nunca el mecanismo de detención principal.
while True:
resp = client.messages.create(
model="claude-opus-4-8", max_tokens=1024,
tools=tools, messages=messages,
)
messages.append({"role": "assistant", "content": resp.content})
if resp.stop_reason != "tool_use":
break # terminate on stop_reason, NOT on text
results = run_tools(resp.content) # execute each tool_use block
messages.append({"role": "user", "content": results})Por qué importa la ausencia de estado
La ausencia de estado no es una limitación que deba evitarse, sino el diseño que hace que Claude sea predecible y escalable. Como el modelo no conserva ningún estado oculto, la solicitud es la verdad completa: los mismos seis campos y el mismo historial producen el mismo comportamiento.
Por eso la gestión del contexto es una disciplina propia. A medida que crece el historial, reduzca las salidas detalladas de las herramientas a los campos relevantes, resuma los turnos antiguos y conserve sin cambios los datos transaccionales críticos (identificadores, importes y fechas) en un bloque específico, porque el modelo solo conoce lo que vuelve a incluir en messages.
Integrarlo todo
Una solicitud de producción rara vez consta únicamente de un modelo y un prompt. Un turno de un agente de soporte combina los seis campos: un model seleccionado mediante enrutamiento, un max_tokens seguro, un system con las reglas, el historial completo de messages, un conjunto reducido de tools y un tool_choice adecuado para la tarea.
Si observa estos seis campos en cualquier solicitud, podrá predecir exactamente cómo se comportará; esa es la perspectiva del arquitecto.
response = client.messages.create(
model="claude-opus-4-8", # routed by task difficulty
max_tokens=2048, # room to finish
system="You are a support agent. Verify identity first.",
messages=conversation_history, # full replay, stateless
tools=support_tools, # 4-5 well-described tools
tool_choice={"type": "auto"}, # text or tool, model decides
)Comprobación rápida
Compruebe su comprensión de cómo los campos de la solicitud determinan el comportamiento.
Ideas clave
Ahora tiene el modelo mental de arquitecto para una solicitud a Claude:
- model — capacidad frente a coste frente a latencia; seleccione la ruta según la tarea.
- max_tokens — límite máximo de salida aplicado;
stop_reason: "max_tokens"significa que la salida se truncó. - system — persona y reglas persistentes; manténgalas estables.
- messages — el historial COMPLETO, reenviado en cada turno, porque el modelo no conserva ningún estado.
- tools — las descripciones determinan la selección; mantenga unas 4 o 5 herramientas bien delimitadas.
- tool_choice —
auto/any/ forzada; useanypara garantizar una salida estructurada.
Y el bucle que las conecta: condúzcalo mediante stop_reason (end_turn frente a tool_use), nunca analizando el texto. Si domina estos conceptos, el resto de la certificación se asentará sobre una base sólida.
Aprende Python con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 26
- Lecciones
- 104
Preguntas frecuentes
¿La lección «Anatomía de una solicitud de API» es gratis?
Sí — el texto completo de «Anatomía de una solicitud de API» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Claude Architect, actualiza a CoddyKit PRO. El curso de Claude Architect incluye 4 lecciones en total.
¿Qué aprenderé en «Anatomía de una solicitud de API»?
model, max_tokens, system, messages, tools y tool_choice. Practicas Claude Architect con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Claude Architect?
No se requiere experiencia previa. Claude Architect en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Anatomía de una solicitud de API»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Claude Architect?
Sí. Cada lección de Claude Architect incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- La familia de modelos Claude
- Anatomía de una solicitud de API
- Explicación de los motivos de detención
- Tokens, ventanas de contexto y coste