L'SDK ufficiale di Anthropic è eccellente, ma l'intero ecosistema IA si è standardizzato sulla struttura del client OpenAI: ogni esempio, ogni adattatore di framework, ogni tutorial "hello world" presume che tu abbia a portata di mano un'istanza OpenAI(...). Migrare il codice per chiamare direttamente l'SDK di Anthropic è un refactoring significativo.
Non è necessario. Questo articolo mostra come chiamare Claude Opus 4.7, Sonnet 4.6 e Haiku 4.5 tramite l'SDK OpenAI senza modifiche, instradando le chiamate attraverso Kunavo. Stesso SDK, stessi tipi, stesso streaming, stesso utilizzo degli strumenti. L'unica riga che cambia è base_url.
La modifica minima
Con il pacchetto Python openai già installato, la migrazione completa è questa.
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 diventa la tua chiave Kunavo (creata in /app/keys). base_url punta al nostro gateway. L'ID del modello passa da gpt-4o a uno slug Claude: claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5. Il corpo della richiesta, la struttura della risposta e ogni helper dell'SDK si comportano esattamente come con OpenAI.
Streaming
Lo streaming funziona nello stesso modo. Kunavo inoltra i chunk SSE di Anthropic nel formato OpenAI chat.completion.chunk, quindi il modello di iterazione asincrona esistente funziona senza modifiche.
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)Utilizzo degli strumenti / chiamate di funzione
Il protocollo di utilizzo degli strumenti di Anthropic è semanticamente uguale alle chiamate di funzione di OpenAI: differiscono solo a livello di trasmissione. Kunavo traduce in entrambe le direzioni l'array tools, la risposta tool_calls e i messaggi successivi tool. Usa tool_choice="auto", "none" o uno strumento denominato: vengono tutti mappati.
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)Visione
Claude è multimodale dalla versione 3.5; passare un'immagine usa il normale array OpenAI content: [{ type: 'text' }, { type: 'image_url' }]. image_url.url può essere un URL https oppure 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"}},
],
}],
)Quando usare l'SDK nativo di Anthropic
Alcune funzioni esclusive di Anthropic non possono essere espresse nel formato OpenAI, soprattutto la direttiva cache_control per il caching dei prompt e i token thinking estesi. Se ti serve una di queste funzioni, cambia SDK ma mantieni la stessa chiave: Kunavo espone anche l'endpoint nativo /v1/messages, quindi anche l'SDK di Anthropic funziona con una sola modifica a 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)Consulta la documentazione dell'API Messages nativa per l'elenco completo dei parametri pass-through e /docs/caching per sapere come il caching dei prompt consente di risparmiare fino al 90% del costo degli input nei prompt ripetuti.
Il caching dei prompt non richiede di per sé di cambiare SDK. Con un prompt lungo, Kunavo imposta per te i punti di interruzione della cache sul percorso nel formato OpenAI: sul prompt di sistema, sulle definizioni degli strumenti e sull'ultimo messaggio di una conversazione che contiene già un turno dell'assistente. Un cache_control che aggiungi tu a un messaggio di sistema, a un messaggio dell'utente o a una definizione di strumento viene inoltrato a Claude.
Cosa rinunci e cosa ottieni
Il percorso nel formato OpenAI è una traduzione, non il protocollo nativo. Due piccoli elementi non attraversano il confine:
- Parametri del thinking:
thinkingereasoning_effortnon vengono inoltrati a Claude su questo percorso. Per attivare l'extended thinking o regolarlo, usa l'API Messages nativa. - Output del thinking: quando il modello usa il thinking, la risposta non lo include e l'oggetto usage non ne riporta un conteggio separato; i token di thinking vengono conteggiati all'interno di
completion_tokens.
Il vantaggio è significativo: un solo SDK per Claude, GPT, GPT-Image, Veo e il resto del catalogo; al di sotto dei prezzi ufficiali dei provider a seconda del modello; fatturazione nativa Stripe nella tua valuta locale; nessuna sostituzione silenziosa del modello: il failover cambia il provider, mai il modello, e la dashboard dettaglia il modello, i token e il costo di ogni chiamata.
Due minuti per verificare
Registrati su kunavo.com/app/signup: una ricarica di $10 copre diverse migliaia di chiamate Claude, con pagamento a consumo, e il saldo non scade mai. Inserisci il tuo base_url, sostituisci l'ID del modello con uno slug Claude ed esegui la suite di test esistente. Se qualcosa non funziona correttamente, scrivi a contact@kunavo.com: leggiamo ogni messaggio.