O SDK da própria Anthropic é excelente, mas todo o ecossistema de IA se padronizou no formato do cliente da OpenAI — todos os exemplos, adaptadores de frameworks e tutoriais de “hello world” pressupõem que você tenha uma instância OpenAI(...) disponível. Migrar seu código para chamar diretamente o SDK da Anthropic é uma refatoração significativa.
Não precisa ser assim. Esta publicação mostra como chamar Claude Opus 4.7, Sonnet 4.6 e Haiku 4.5 pelo SDK da OpenAI sem alterações — roteando suas chamadas pela Kunavo. Mesmo SDK, mesmos tipos, mesmo streaming e mesmo uso de ferramentas. A única linha que muda é base_url.
A mudança mínima
Com o pacote openai do Python já instalado, a migração completa fica assim.
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 passa a ser sua chave da Kunavo (criada em /app/keys). base_url aponta para nosso gateway. O ID do modelo muda de gpt-4o para um slug do Claude — claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5. O corpo da solicitação, o formato da resposta e todos os auxiliares do SDK funcionam exatamente como na OpenAI.
Streaming
O streaming funciona de forma idêntica. A Kunavo encaminha os chunks SSE da Anthropic no formato chat.completion.chunk da OpenAI, portanto o padrão existente de iteração assíncrona funciona sem modificações.
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 ferramentas / chamadas de função
O protocolo de uso de ferramentas da Anthropic é semanticamente igual às chamadas de função da OpenAI — eles diferem apenas no nível do protocolo de transmissão. A Kunavo traduz o array tools, a resposta tool_calls e as mensagens de acompanhamento tool nos dois sentidos. Use tool_choice="auto", "none" ou uma ferramenta nomeada — todos fazem o mapeamento.
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)Visão
O Claude é multimodal desde a versão 3.5; passar uma imagem usa o array padrão da OpenAI content: [{ type: 'text' }, { type: 'image_url' }]. image_url.url pode ser uma URL https ou uma 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 você quiser usar o SDK nativo da Anthropic
Alguns recursos exclusivos da Anthropic não podem ser expressos no formato da OpenAI — principalmente a diretiva cache_control para cache de prompts e os tokens thinking estendidos. Se precisar de algum deles, troque de SDK, mas mantenha a mesma chave: a Kunavo também expõe o endpoint nativo /v1/messages, portanto o SDK da Anthropic funciona com apenas uma alteração 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 a documentação da API Messages nativa para ver a lista completa de parâmetros encaminhados e /docs/caching para saber como o cache de prompts economiza até 90% do custo de entrada em prompts repetidos.
O cache de prompts, por si só, não exige trocar de SDK. Em um prompt longo, a Kunavo define os pontos de interrupção do cache para você na rota no formato da OpenAI: no prompt do sistema, nas definições de ferramentas e na última mensagem de uma conversa que já contém um turno do assistente. Um cache_control que você mesmo colocar em uma mensagem do sistema, em uma mensagem do usuário ou em uma definição de ferramenta é encaminhado ao Claude.
O que você perde — e o que ganha
A rota no formato da OpenAI é uma tradução, não o protocolo nativo. Duas coisas pequenas não atravessam essa fronteira:
- Controles de raciocínio —
thinkingereasoning_effortnão são encaminhados ao Claude nesta rota. Para ativar o raciocínio estendido ou ajustá-lo, use a API Messages nativa. - Saída de raciocínio — quando o modelo raciocina, a resposta não inclui esse raciocínio, e o objeto de uso não apresenta uma contagem separada para ele: os tokens de raciocínio são contabilizados dentro de
completion_tokens.
O ganho é significativo: um SDK para Claude, GPT, GPT-Image, Veo e o restante do catálogo; abaixo dos preços oficiais upstream, dependendo do modelo; cobrança nativa da Stripe na sua moeda local; nenhuma troca silenciosa de modelo — o failover muda o fornecedor, nunca o modelo, e o painel detalha o modelo, os tokens e o custo de cada chamada.
Dois minutos para confirmar
Cadastre-se em kunavo.com/app/signup — uma recarga de $10 cobre vários milhares de chamadas Claude, com pagamento conforme o uso e saldo sem expiração. Insira seu base_url, troque o ID do modelo por um slug do Claude e execute sua suíte de testes existente contra ele. Se algo não funcionar corretamente, envie um e-mail para contact@kunavo.com — lemos todas as mensagens.