El SDK propio de Anthropic es excelente, pero todo el ecosistema de IA se ha estandarizado en la estructura de cliente de OpenAI: cada ejemplo, cada adaptador de framework y cada tutorial de «hola mundo» asume que tiene a mano una instancia OpenAI(...). Migrar el código para llamar directamente al SDK de Anthropic es una refactorización importante.
No tiene por qué ser así. Esta publicación muestra cómo llamar a Claude Opus 4.7, Sonnet 4.6 y Haiku 4.5 mediante el SDK de OpenAI sin cambios, enrutando las llamadas a través de Kunavo. Mismo SDK, mismos tipos, mismo streaming y mismo uso de herramientas. La única línea que cambia es base_url.
El cambio mínimo
Con el paquete openai de Python ya instalado, la migración completa queda así.
from openai import OpenAI
client = OpenAI(
api_key="sk-kn-...",
base_url="https://api.kunavo.com/v1", # the only line that changes
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6", # a Claude slug, not gpt-4o
messages=[
{"role": "system", "content": "You are a senior platform engineer."},
{"role": "user", "content": "Critique this SQL migration..."},
],
)
print(resp.choices[0].message.content)api_key se convierte en su clave de Kunavo (creada en /app/keys). base_url apunta a nuestra puerta de enlace. El id del modelo cambia de gpt-4o a un slug de Claude: claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5. El cuerpo de la solicitud, la forma de la respuesta y todos los auxiliares del SDK se comportan exactamente igual que frente a OpenAI.
Streaming
El streaming funciona de forma idéntica. Kunavo reenvía los fragmentos SSE de Anthropic en el formato chat.completion.chunk de OpenAI, por lo que el patrón existente de iteración asíncrona funciona sin modificaciones.
for chunk in client.chat.completions.create(
model="claude-opus-4-7",
messages=[{"role": "user", "content": "Explain Raft in 200 words."}],
stream=True,
):
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)Uso de herramientas / llamadas a funciones
El protocolo de uso de herramientas de Anthropic es semánticamente igual al de llamadas a funciones de OpenAI; solo difieren en el nivel de cable. Kunavo traduce la matriz tools, la respuesta tool_calls y los mensajes de seguimiento tool en ambas direcciones. Use tool_choice="auto", "none" o una herramienta con nombre: todas se asignan correctamente.
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather in a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["city"],
},
},
}
]
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
tools=tools,
tool_choice="auto",
)
print(resp.choices[0].message.tool_calls)Visión
Claude es multimodal desde la versión 3.5; pasar una imagen utiliza la matriz estándar de OpenAI content: [{ type: 'text' }, { type: 'image_url' }]. image_url.url puede ser una URL https o un URI base64 data:.
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image_url",
"image_url": {"url": "https://example.com/cat.jpg"}},
],
}],
)Cuándo sí conviene usar el SDK nativo de Anthropic
Algunas funciones exclusivas de Anthropic no pueden expresarse con la estructura de OpenAI, sobre todo la directiva cache_control para el almacenamiento en caché de prompts y los tokens de thinking ampliados. Si necesita alguna de ellas, cambie de SDK, pero conserve la misma clave: Kunavo también expone el endpoint nativo /v1/messages, por lo que el SDK de Anthropic funciona con un único cambio de base_url.
from anthropic import Anthropic
client = Anthropic(
api_key="sk-kn-...",
base_url="https://api.kunavo.com", # SDK appends /v1/messages
)
resp = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
system="You are a senior platform engineer.",
messages=[{"role": "user", "content": "What is a hot standby?"}],
)
print(resp.content[0].text)Consulte la documentación de la API de Messages nativa para ver la lista completa de parámetros reenviados, y /docs/caching para saber cómo la caché de prompts ahorra hasta un 90 % del coste de entrada en prompts repetidos.
El almacenamiento en caché de prompts no requiere por sí solo cambiar de SDK. En un prompt largo, Kunavo establece por usted los puntos de ruptura de la caché en la ruta con estructura de OpenAI: en el prompt del sistema, en las definiciones de herramientas y en el último mensaje de una conversación que ya contiene un turno del asistente. Un cache_control que usted mismo añada a un mensaje del sistema, a un mensaje del usuario o a una definición de herramienta se reenvía a Claude.
Lo que pierde y lo que gana
La ruta con estructura de OpenAI es una traducción, no el protocolo nativo. Dos elementos pequeños no atraviesan el límite:
- Controles de razonamiento:
thinkingyreasoning_effortno se reenvían a Claude en esta ruta. Para activar el razonamiento extendido o ajustarlo, use la API de Messages nativa. - Salida del razonamiento: cuando el modelo razona, la respuesta no incluye ese razonamiento y el objeto de uso no ofrece un recuento aparte para él; los tokens de razonamiento se cuentan dentro de
completion_tokens.
La ganancia es considerable: un SDK para Claude, GPT, GPT-Image, Veo y el resto del catálogo; por debajo de los precios oficiales del proveedor ascendente según el modelo; facturación nativa de Stripe en su moneda local; sin cambios silenciosos de modelo: la conmutación por error cambia el proveedor, nunca el modelo, y el panel desglosa el modelo, los tokens y el coste de cada llamada.
Dos minutos para confirmarlo
Regístrese en kunavo.com/app/signup; una recarga de $10 cubre varios miles de llamadas de Claude, con pago por uso, y su saldo nunca caduca. Introduzca su base_url, cambie el id del modelo por un slug de Claude y ejecute su suite de pruebas existente. Si algo no funciona correctamente, escriba a contact@kunavo.com; leemos todos los mensajes.