El SDK propio de Anthropic es estupendo, pero todo el ecosistema de IA se ha estandarizado en torno a la forma del cliente de OpenAI: cada ejemplo, cada adaptador de framework, cada tutorial de «hola mundo» da por hecho que tienes a mano una instancia de OpenAI(...). Migrar tu código para llamar directamente al SDK de Anthropic es una refactorización nada trivial.
No tiene por qué serlo. Este artículo muestra cómo llamar a Claude Opus 4.7, Sonnet 4.6 y Haiku 4.5 a través del SDK de OpenAI sin modificarlo, enrutando tus llamadas por Brievio. El mismo SDK, los mismos tipos, el mismo streaming, el mismo uso de herramientas y el modelo genuino al otro lado. 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 tiene este aspecto.
from openai import OpenAI
client = OpenAI(
api_key="sk-brievio-...",
base_url="https://api.brievio.com/v1", # la única línea que cambia
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6", # un slug de Claude, no 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 pasa a ser tu clave de Brievio (creada en /app/keys). base_url apunta a nuestro gateway. 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 petición, la forma de la respuesta y cada helper del SDK se comportan exactamente igual que contra OpenAI.
Streaming
El streaming funciona de forma idéntica. Brievio reenvía los fragmentos SSE de Anthropic en el formato chat.completion.chunk de OpenAI, de modo que tu patrón de iteración asíncrona ya existente funciona sin cambios.
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 / function calling
El protocolo de uso de herramientas de Anthropic es semánticamente igual que el function calling de OpenAI: solo difieren a nivel de protocolo. Brievio traduce el array tools, los tool_calls de la respuesta y los mensajes tool de seguimiento en ambos sentidos. Usa tool_choice="auto", "none" o una herramienta concreta por su nombre: todos se mapean.
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 es el array 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í quieres el SDK nativo de Anthropic
Algunas funciones exclusivas de Anthropic no se pueden expresar en la forma de OpenAI; sobre todo la directiva cache_control para el cacheo de prompts y los tokens de thinking extendido. Si necesitas alguna de ellas, cambia de SDK pero conserva la misma clave: Brievio también expone el endpoint nativo /v1/messages, así que el SDK de Anthropic también funciona con un único cambio de base_url.
from anthropic import Anthropic
client = Anthropic(
api_key="sk-brievio-...",
base_url="https://api.brievio.com", # el SDK añade /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)Consulta la documentación de la Messages API nativa para ver la lista completa de parámetros pass-through, y /docs/caching para saber cómo el cacheo de prompts ahorra hasta un 90% del coste de input en prompts repetidos.
A qué renuncias y qué ganas
La ruta con forma de OpenAI es una traducción, no el protocolo nativo. Dos pequeñas cosas no cruzan la frontera:
- cache_control para el cacheo de prompts: usa el SDK nativo de Messages para eso, o pásalo mediante el escape hatch
input. - Tokens de thinking extendido: accesibles en el objeto usage de la respuesta, pero no como parámetro directo de la petición; cambia a nativo si necesitas un control fino.
Lo que ganas es significativo: un único SDK para todo el catálogo de Claude, Gemini, GPT-Image y Veo genuinos; ~15% por debajo de la lista oficial en cada modelo, facturado sobre los conteos reales de tokens; facturación nativa con Stripe; y enrutamiento transparente — el panel siempre muestra qué upstream sirvió realmente cada llamada.
Dos minutos para confirmarlo
Regístrate en brievio.com/app/signup: el crédito gratuito de 2 $ cubre unos cuantos miles de llamadas a Claude. Pon tu base_url, cambia el id del modelo por un slug de Claude y ejecuta tu suite de pruebas actual contra él. Si algo no cruza limpiamente, escribe a contact@brievio.com: leemos todos los mensajes.