Le SDK maison d’Anthropic est excellent, mais tout l’écosystème de l’IA s’est aligné sur la forme du client OpenAI — chaque exemple, chaque adaptateur de framework, chaque tutoriel « hello world » suppose que tu as une instance OpenAI(...) sous la main. Réécrire ton code pour appeler directement le SDK d’Anthropic, c’est un refactoring qui n’a rien d’anodin.
Ça n’est pas une fatalité. Cet article montre comment appeler Claude Opus 4.7, Sonnet 4.6 et Haiku 4.5 via le SDK OpenAI inchangé — en routant tes appels à travers Brievio. Même SDK, mêmes types, même streaming, même tool use, et le modèle authentique au bout du fil. La seule ligne qui change, c’est base_url.
Le changement minimal
Avec le paquet openai de Python déjà installé, la migration complète ressemble à ceci.
from openai import OpenAI
client = OpenAI(
api_key="sk-brievio-...",
base_url="https://api.brievio.com/v1", # la seule ligne qui change
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6", # un slug Claude, pas 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 devient ta clé Brievio (créée dans /app/keys). base_url pointe vers notre passerelle. L’identifiant de modèle passe de gpt-4o à un slug Claude — claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5. Le corps de la requête, la forme de la réponse et chaque utilitaire du SDK se comportent exactement comme face à OpenAI.
Streaming
Le streaming fonctionne à l’identique. Brievio transmet les chunks SSE d’Anthropic au format chat.completion.chunk d’OpenAI, si bien que ton motif d’itération asynchrone existant fonctionne sans la moindre modification.
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)Tool use / function calling
Le protocole de tool use d’Anthropic est sémantiquement identique au function calling d’OpenAI — ils ne diffèrent qu’au niveau du protocole réseau. Brievio traduit le tableau tools, les tool_calls de la réponse et les messages tool de suivi dans les deux sens. Utilise tool_choice="auto", "none" ou un outil nommé — tout est pris en charge.
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)Vision
Claude est multimodal depuis la 3.5 ; passer une image, c’est le tableau OpenAI standard content: [{ type: 'text' }, { type: 'image_url' }]. image_url.url peut être une URL https ou 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"}},
],
}],
)Quand tu veux quand même le SDK natif d’Anthropic
Certaines fonctionnalités propres à Anthropic ne s’expriment pas dans la forme OpenAI — au premier rang la directive cache_control pour le cache de prompt, et les tokens de thinking étendu. Si tu as besoin de l’une d’elles, change de SDK mais garde la même clé : Brievio expose aussi l’endpoint natif /v1/messages, donc le SDK d’Anthropic fonctionne lui aussi avec un seul changement de base_url.
from anthropic import Anthropic
client = Anthropic(
api_key="sk-brievio-...",
base_url="https://api.brievio.com", # le SDK ajoute /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 doc de l’API Messages native pour la liste complète des paramètres transmis tels quels, et /docs/caching pour voir comment le cache de prompt économise jusqu’à 90 % du coût d’entrée sur les prompts répétés.
Ce que tu perds — et ce que tu gagnes
La route en forme OpenAI est une traduction, pas le protocole natif. Deux petites choses ne franchissent pas la frontière :
- cache_control pour le cache de prompt — passe par le SDK Messages natif pour ça, ou transmets-le via l’échappatoire
input. - Les tokens de thinking étendu — accessibles dans l’objet usage de la réponse, mais pas comme paramètre direct de la requête ; bascule en natif si tu as besoin d’un contrôle fin.
Ce que tu gagnes est considérable : un seul SDK sur tout le catalogue Claude, Gemini, GPT-Image et Veo authentique ; environ 15 % sous le tarif officiel sur chaque modèle, facturé sur les vrais décomptes de tokens ; une facturation native Stripe ; et un routage transparent — le tableau de bord affiche toujours quel upstream a réellement servi chaque appel.
Deux minutes pour vérifier
Inscris-toi sur brievio.com/app/signup — le crédit gratuit de 2 $ couvre quelques milliers d’appels Claude. Mets ton base_url en place, remplace ton identifiant de modèle par un slug Claude, et lance ta suite de tests existante dessus. Si quelque chose ne passe pas proprement, écris à contact@brievio.com — on lit chaque message.