Esta guía está diseñada para proporcionar a Claude los conceptos básicos del uso de la API de Claude. Ofrece explicaciones y ejemplos de los IDs de modelos/la API básica de mensajes, uso de herramientas, streaming, pensamiento extendido, y nada más.
Smartest model: Claude Opus 4.8: claude-opus-4-8
Smart model: Claude Sonnet 4.6: claude-sonnet-4-6
For fast, cost-effective tasks: Claude Haiku 4.5: claude-haiku-4-5-20251001import anthropic
import os
message = anthropic.Anthropic(
api_key=os.environ.get("ANTHROPIC_API_KEY")
).messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message){
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello!"
}
],
"model": "claude-opus-4-8",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 12,
"output_tokens": 6
}
}La API de Messages no tiene estado, lo que significa que siempre envías el historial conversacional completo a la API. Puedes usar este patrón para construir una conversación a lo largo del tiempo. Los turnos conversacionales anteriores no necesariamente tienen que originarse realmente de Claude. Puedes usar mensajes assistant sintéticos.
import anthropic
message = anthropic.Anthropic().messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, Claude"},
{"role": "assistant", "content": "Hello!"},
{"role": "user", "content": "Can you describe LLMs to me?"},
],
)
print(message)Puedes rellenar previamente parte de la respuesta de Claude en la última posición de la lista de mensajes de entrada. Esto se puede usar para dar forma a la respuesta de Claude. El ejemplo a continuación usa "max_tokens": 1 para obtener una única respuesta de opción múltiple de Claude.
message = anthropic.Anthropic().messages.create(
model="claude-sonnet-4-5",
max_tokens=1,
messages=[
{
"role": "user",
"content": "What is latin for Ant? (A) Apoidea, (B) Rhopalocera, (C) Formicidae",
},
{"role": "assistant", "content": "The answer is ("},
],
)
print(message.content[0].text)Claude puede leer tanto texto como imágenes en las solicitudes. Se admiten los tipos de fuente base64 y url para imágenes, junto con los tipos de medios image/jpeg, image/png, image/gif y image/webp.
import anthropic
import base64
import httpx
# Opción 1: Imagen codificada en Base64
image_url = "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
image_media_type = "image/jpeg"
image_data = base64.standard_b64encode(httpx.get(image_url).content).decode("utf-8")
message = anthropic.Anthropic().messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": image_media_type,
"data": image_data,
},
},
{"type": "text", "text": "What is in the above image?"},
],
}
],
)
print(message.content[0].text)
# Opción 2: Imagen referenciada por URL
message_from_url = anthropic.Anthropic().messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg",
},
},
{"type": "text", "text": "What is in the above image?"},
],
}
],
)
print(message_from_url.content[0].text)El "extended thinking" (pensamiento extendido) a veces puede ayudar a Claude con tareas muy difíciles. En modelos anteriores a Claude Opus 4.7, la temperatura debe establecerse en 1 cuando el pensamiento extendido está habilitado.
El pensamiento extendido es compatible con los siguientes modelos:
claude-opus-4-7)claude-opus-4-6)claude-opus-4-5-20251101)claude-sonnet-4-6)claude-sonnet-4-5-20250929)claude-haiku-4-5-20251001)En Claude Opus 4.8 y Claude Opus 4.7, el pensamiento extendido manual (type: enabled con un valor de budget_tokens) no es compatible y devuelve un error 400. Usa pensamiento adaptativo (type: adaptive) en su lugar.
Cuando el pensamiento extendido está activado, Claude crea bloques de contenido thinking donde genera su razonamiento interno. La respuesta de la API incluirá bloques de contenido thinking, seguidos de bloques de contenido text.
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
thinking={"type": "adaptive", "display": "summarized"},
messages=[
{
"role": "user",
"content": "Are there an infinite number of prime numbers such that n mod 4 == 3?",
}
],
)
# La respuesta contendrá bloques de pensamiento resumidos y bloques de texto
for block in response.content:
if block.type == "thinking":
print(f"\nThinking summary: {block.thinking}")
elif block.type == "text":
print(f"\nResponse: {block.text}")Al usar el pensamiento extendido manual (type: enabled), el parámetro budget_tokens determina el número máximo de tokens que Claude puede usar para su proceso de razonamiento interno. En los modelos Claude 4 y posteriores, este límite se aplica a los tokens de pensamiento completos, y no a la salida resumida. Presupuestos más grandes pueden mejorar la calidad de la respuesta al permitir un análisis más exhaustivo para problemas complejos. A menos que estés usando pensamiento intercalado, budget_tokens debe ser menor que max_tokens para que Claude tenga espacio para escribir su respuesta después de que el pensamiento esté completo.
El pensamiento extendido se puede usar junto con el uso de herramientas, lo que permite a Claude razonar sobre la selección de herramientas y el procesamiento de resultados.
Limitaciones importantes:
tool_choice: {"type": "auto"} (predeterminado) o tool_choice: {"type": "none"}.thinking de vuelta a la API para el último mensaje del asistente.import anthropic
client = anthropic.Anthropic()
weather_tool = {
"name": "get_weather",
"description": "Get the current weather for a location.",
"input_schema": {
"type": "object",
"properties": {"location": {"type": "string", "description": "The city name."}},
"required": ["location"],
},
}
weather_data = {"temperature": 72}
# Primera solicitud: Claude responde con pensamiento y solicitud de herramienta
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
thinking={"type": "adaptive", "display": "summarized"},
tools=[weather_tool],
messages=[{"role": "user", "content": "What's the weather in Paris?"}],
)
# Extrae el bloque de pensamiento y el bloque de uso de herramientas
thinking_block = next(
(block for block in response.content if block.type == "thinking"), None
)
tool_use_block = next(
(block for block in response.content if block.type == "tool_use"), None
)
# Segunda solicitud: incluye el bloque de pensamiento y el resultado de la herramienta
continuation = client.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
thinking={"type": "adaptive", "display": "summarized"},
tools=[weather_tool],
messages=[
{"role": "user", "content": "What's the weather in Paris?"},
# Observa que se pasa el thinking_block además del tool_use_block
{"role": "assistant", "content": [thinking_block, tool_use_block]},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": tool_use_block.id,
"content": f"Current temperature: {weather_data['temperature']}°F",
}
],
},
],
)
for block in continuation.content:
if block.type == "text":
print(block.text)El pensamiento extendido con uso de herramientas en los modelos Claude 4 admite "interleaved thinking" (pensamiento intercalado), que permite a Claude pensar entre llamadas a herramientas. Para habilitarlo en los modelos Claude 4, 4.5 y Sonnet 4.6, agrega el encabezado beta interleaved-thinking-2025-05-14 a tu solicitud de API.
import anthropic
client = anthropic.Anthropic()
calculator_tool = {
"name": "calculator",
"description": "Perform arithmetic calculations.",
"input_schema": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "The math expression to evaluate.",
}
},
"required": ["expression"],
},
}
database_tool = {
"name": "database_query",
"description": "Query the product database.",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "The database query."}
},
"required": ["query"],
},
}
response = client.beta.messages.create(
model="claude-sonnet-4-6",
max_tokens=16000,
thinking={"type": "enabled", "budget_tokens": 10000},
tools=[calculator_tool, database_tool],
messages=[
{
"role": "user",
"content": "What's the total revenue if we sold 150 units of product A at $50 each?",
}
],
betas=["interleaved-thinking-2025-05-14"],
)
for block in response.content:
if block.type == "thinking":
print(f"Thinking: {block.thinking}")
elif block.type == "tool_use":
print(f"Tool call: {block.name}({block.input})")
elif block.type == "text":
print(f"Response: {block.text}")Con el pensamiento intercalado y SOLO con el pensamiento intercalado (no con el pensamiento extendido regular), el budget_tokens puede exceder el parámetro max_tokens, ya que budget_tokens en este caso representa el presupuesto total en todos los bloques de pensamiento dentro de un turno del asistente.
Para Claude Opus 4.8, Claude Opus 4.7 y Claude Opus 4.6, el pensamiento intercalado se habilita automáticamente al usar pensamiento adaptativo (thinking: {type: "adaptive"}). No se necesita ningún encabezado beta. Sonnet 4.6 admite tanto el encabezado beta interleaved-thinking-2025-05-14 con pensamiento extendido manual como el pensamiento adaptativo.
Las herramientas del cliente se especifican en el parámetro de nivel superior tools de la solicitud de API. Cada definición de herramienta incluye:
| Parámetro | Descripción |
|---|---|
name | El nombre de la herramienta. Debe coincidir con la expresión regular ^[a-zA-Z0-9_-]{1,64}$. |
description | Una descripción detallada en texto plano de lo que hace la herramienta, cuándo debe usarse y cómo se comporta. |
input_schema | Un objeto JSON Schema que define los parámetros esperados para la herramienta. |
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "The unit of temperature, either 'celsius' or 'fahrenheit'"
}
},
"required": ["location"]
}
}Proporciona descripciones extremadamente detalladas. Este es, con diferencia, el factor más importante en el rendimiento de las herramientas. Tus descripciones deben explicar cada detalle sobre la herramienta, incluyendo:
Considera usar input_examples para herramientas complejas. Para herramientas con objetos anidados, parámetros opcionales o entradas sensibles al formato, puedes proporcionar ejemplos concretos usando el campo input_examples (beta). Esto ayuda a Claude a comprender los patrones de entrada esperados. Consulta Proporcionar ejemplos de uso de herramientas para obtener más detalles.
Ejemplo de una buena descripción de herramienta:
{
"name": "get_stock_price",
"description": "Retrieves the current stock price for a given ticker symbol. The ticker symbol must be a valid symbol for a publicly traded company on a major US stock exchange like NYSE or NASDAQ. The tool will return the latest trade price in USD. It should be used when the user asks about the current or most recent price of a specific stock. It will not provide any other information about the stock or company.",
"input_schema": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "The stock ticker symbol, e.g. AAPL for Apple Inc."
}
},
"required": ["ticker"]
}
}Puedes forzar a Claude a usar una herramienta específica especificando la herramienta en el campo tool_choice:
tool_choice = {"type": "tool", "name": "get_weather"}Al trabajar con el parámetro tool_choice, hay cuatro opciones posibles:
auto permite a Claude decidir si llamar o no a alguna de las herramientas proporcionadas (predeterminado).any le indica a Claude que debe usar una de las herramientas proporcionadas.tool fuerza a Claude a usar siempre una herramienta en particular.none impide que Claude use cualquier herramienta.Las herramientas no necesariamente tienen que ser funciones del cliente. Puedes usar herramientas siempre que quieras que el modelo devuelva una salida JSON que siga un esquema proporcionado.
Al usar herramientas, Claude a menudo mostrará su "chain of thought" (cadena de pensamiento), es decir, el razonamiento paso a paso que usa para descomponer el problema y decidir qué herramientas usar.
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "<thinking>To answer this question, I will: 1. Use the get_weather tool to get the current weather in San Francisco. 2. Use the get_time tool to get the current time in the America/Los_Angeles timezone, which covers San Francisco, CA.</thinking>"
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": { "location": "San Francisco, CA" }
}
]
}De forma predeterminada, Claude puede usar múltiples herramientas para responder a una consulta del usuario. Puedes deshabilitar este comportamiento estableciendo disable_parallel_tool_use=true.
La respuesta tendrá un stop_reason de tool_use y uno o más bloques de contenido tool_use que incluyen:
id: Un identificador único para este bloque de uso de herramienta en particular.name: El nombre de la herramienta que se está usando.input: Un objeto que contiene la entrada que se pasa a la herramienta.Cuando recibas una respuesta de uso de herramienta, debes:
name, id e input del bloque tool_use.tool_result:{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "15 degrees"
}
]
}max_tokensSi la respuesta de Claude se corta debido a que alcanza el límite de max_tokens durante el uso de herramientas, reintenta la solicitud con un valor de max_tokens más alto.
pause_turnAl usar herramientas del servidor como la búsqueda web, la API puede devolver un stop reason pause_turn. Continúa la conversación pasando la respuesta pausada tal cual en una solicitud posterior.
Si la herramienta misma lanza un error durante la ejecución, devuelve el mensaje de error con "is_error": true:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "ConnectionError: the weather service API is not available (HTTP 500)",
"is_error": true
}
]
}Si el intento de uso de una herramienta por parte de Claude no es válido (por ejemplo, faltan parámetros requeridos), intenta la solicitud nuevamente con valores de description más detallados en tus definiciones de herramientas.
Al crear un Message, puedes establecer "stream": true para transmitir incrementalmente la respuesta usando "server-sent events" (eventos enviados por el servidor), o SSE.
import anthropic
client = anthropic.Anthropic()
with client.messages.stream(
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
model="claude-opus-4-8",
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)Cada evento enviado por el servidor incluye un tipo de evento con nombre y datos JSON asociados. Cada stream usa el siguiente flujo de eventos:
message_start: contiene un objeto Message con content vacío.content_block_start, uno o más eventos content_block_delta y content_block_stop.message_delta, que indican cambios de nivel superior en el objeto Message final.message_stop.Advertencia: Los recuentos de tokens mostrados en el campo usage del evento message_delta son acumulativos.
{
"type": "content_block_delta",
"index": 0,
"delta": { "type": "text_delta", "text": "Hello frien" }
}Para bloques de contenido tool_use, los deltas son cadenas JSON parciales:
{"type": "content_block_delta","index": 1,"delta": {"type": "input_json_delta","partial_json": "{\"location\": \"San Fra"}}}Al usar pensamiento extendido con streaming:
{
"type": "content_block_delta",
"index": 0,
"delta": {
"type": "thinking_delta",
"thinking": "Let me solve this step by step..."
}
}event: message_start
data: {"type": "message_start", "message": {"id": "msg_1nZdL29xx5MUA1yADyHTEsnR8uuvGzszyY", "type": "message", "role": "assistant", "content": [], "model": "claude-opus-4-8", "stop_reason": null, "stop_sequence": null, "usage": {"input_tokens": 25, "output_tokens": 1}}}
event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Hello"}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "!"}}
event: content_block_stop
data: {"type": "content_block_stop", "index": 0}
event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence":null}, "usage": {"output_tokens": 15}}
event: message_stop
data: {"type": "message_stop"}Was this page helpful?