Documentação
Claude Agent SDK
O Agent SDK não tem uma opção de URL base — ele inicia a CLI do Claude Code e repassa todo o seu ambiente. Esse é o ponto de integração do roteamento, e bastam duas variáveis.
Buscar uma opção base_url no SDK não retorna nada, e isso não é uma omissão na documentação — a opção não existe. O SDK executa a CLI do Claude Code como um subprocesso, e é a CLI que lê ANTHROPIC_BASE_URL e ANTHROPIC_AUTH_TOKEN. Defina essas duas variáveis e todas as chamadas feitas pelo agente serão direcionadas, sem alterar o código do agente.
# The SDK has no base_url option. The CLI it spawns reads these, and the
# SDK passes the parent environment straight through — so exporting them
# before your program starts is enough.
export ANTHROPIC_BASE_URL=https://api.kunavo.com
export ANTHROPIC_AUTH_TOKEN=sk-kn-...
# Pin models Kunavo serves: the CLI's default and its opus/sonnet aliases
# follow Anthropic's newest models, and the sonnet alias asks for Sonnet 5.5,
# which Kunavo does not serve — unpinned, those requests 404.
export ANTHROPIC_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_OPUS_MODEL=claude-opus-5-5
export ANTHROPIC_DEFAULT_SONNET_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-haiku-4-5
python my_agent.pyhttps://api.kunavo.com, sem /v1. Os clientes Anthropic acrescentam /v1/messages por conta própria. A mesma regra que causa problemas em todos os outros clientes compatíveis com Anthropic se aplica aqui, e está explicada na página de ANTHROPIC_BASE_URL.Por que o ambiente chega à CLI
Vale dedicar um parágrafo a isso, pois essa é a diferença entre um truque que pode deixar de funcionar e uma propriedade documentada na qual você pode confiar. O transporte de subprocessos do SDK Python constrói o ambiente do processo filho a partir do os.environ do processo pai, com a remoção de uma única chave — CLAUDECODE, para que o processo filho não pense que está sendo executado dentro de uma sessão do Claude Code —, e depois mescla CLAUDE_CODE_ENTRYPOINT, em seguida ClaudeAgentOptions.env e, por fim, a versão do SDK.
Disso decorrem duas coisas, e a segunda é onde as pessoas costumam se confundir. Tudo o que estiver no seu shell chega à CLI, então exportar as duas variáveis funciona. Além disso, options.env é mesclado por cima do ambiente herdado, portanto a forma explícita prevalece sobre uma variável exportada desatualizada, em vez de ser sobrepujada por ela. O código está em subprocess_cli.py.
A forma explícita e quando insistir nela
Variáveis exportadas funcionam bem na sua própria máquina, mas são frágeis em qualquer outro ambiente: o endpoint do agente passa a depender da forma como o processo foi iniciado, o que deixa de funcionar na primeira vez que ele é executado por um agendador, em um contêiner ou em uma tarefa de CI que não carrega seu perfil. Passar env no objeto de opções torna o roteamento parte do programa.
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
# The explicit form. options.env is merged ON TOP of the inherited
# environment, so this wins over whatever the shell happens to hold —
# which is what you want in anything that is not your own laptop.
options = ClaudeAgentOptions(
env={
"ANTHROPIC_BASE_URL": "https://api.kunavo.com",
"ANTHROPIC_AUTH_TOKEN": "sk-kn-...",
"ANTHROPIC_MODEL": "claude-sonnet-5",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-5-5",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-5",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5",
},
)
async with ClaudeSDKClient(options=options) as client:
await client.query("Summarise the open TODOs in this repo")
async for message in client.receive_response():
print(message)Passo a passo
- Crie uma chave em
/app/keyse copie-a — ela é exibida uma única vez. - Decida onde o roteamento será definido: variáveis exportadas para o trabalho local,
ClaudeAgentOptions(env=…)para tudo o que é executado sem supervisão. - Defina
ANTHROPIC_BASE_URLcomohttps://api.kunavo.comeANTHROPIC_AUTH_TOKENcomo sua chavesk-kn-…. - Defina
ANTHROPIC_MODEL,ANTHROPIC_DEFAULT_OPUS_MODELeANTHROPIC_DEFAULT_SONNET_MODELcomo IDs oferecidos: o padrão integrado da CLI e seus aliasesopusesonnetseguem os modelos mais recentes da Anthropic, e um modelo que a Kunavo não oferece — Sonnet 5.5, solicitado pelo aliassonnet— retorna 404. - Defina
ANTHROPIC_DEFAULT_HAIKU_MODELcomoclaude-haiku-4-5também: sem essa configuração, o aliashaikuda CLI solicita um ID de modelo que a Kunavo não oferece (Haiku 5.5 a partir da v2.1.293), então os subagentes definidos commodel: haikuretornam 404. Essa mesma linha também direciona as subtarefas em segundo plano iniciadas pela CLI para o nível mais barato. - Execute seu programa. Nada muda no código do agente.
Qual nível usar em cada subtarefa
Um agente distribui o trabalho — uma coisa que você pede se transforma em várias chamadas de ida e volta cobradas —, por isso o mapeamento de níveis importa mais aqui do que em um aplicativo de chat. As tarifas são em USD por 1M de tokens, entrada / saída, consultadas em tempo real no catálogo.
| ID do modelo | Entrada / saída da Kunavo | Indicação de uso |
|---|---|---|
claude-haiku-4-5 | $0.70 / $3.50 | Subtarefas em segundo plano que a CLI gera por conta própria — frequentes, automáticas e fáceis de pagar caro demais |
claude-sonnet-5 | $1.40 / $7.00 | O padrão recomendado para o raciocínio principal do agente |
claude-opus-5 | $3.50 / $17.50 | Somente quando um nível mais barato precisar de várias tentativas para chegar ao resultado |
Verifique antes de depurar o SDK
Uma solicitação basta para determinar se a falha está na chave, no endpoint ou no SDK. Se ela retornar 200, a mesma credencial funciona para a CLI iniciada pelo SDK, e qualquer problema restante está na forma como as variáveis foram definidas, não no conteúdo delas.
# Settles whether a failure is the key, the endpoint, or the SDK.
# 200 here means the same credential works for the CLI the SDK spawns.
curl -sS https://api.kunavo.com/v1/messages \
-H "Authorization: Bearer sk-kn-..." \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-haiku-4-5","max_tokens":16,
"messages":[{"role":"user","content":"ping"}]}'Referência
O SDK é de código aberto em anthropics/claude-agent-sdk-python. O comportamento do ambiente descrito aqui vem do transporte de subprocessos do próprio SDK, consultado em 2026-09-04. O SDK TypeScript tem a mesma arquitetura — ele controla a CLI em vez de chamar a API —, então a CLI novamente lê as variáveis de roteamento. O README do SDK TypeScript não documenta nem a opção nem esse comportamento; confirme o nome da opção nos tipos antes de depender da forma explícita. O lado da Kunavo usa a API Messages, e os outros clientes que usam o mesmo roteamento estão no hub de integrações.
Perguntas frequentes
O SDK do Claude Agent pode usar uma URL base personalizada?
Sim, mas não por meio de uma opção do SDK — não existe um parâmetro base_url, por isso uma busca por ele no README não retorna nada. O SDK executa a CLI do Claude Code como um subprocesso, e é a CLI que lê ANTHROPIC_BASE_URL e ANTHROPIC_AUTH_TOKEN. Definir essas duas variáveis no ambiente em que seu programa é executado direciona todas as chamadas feitas pelo agente, sem alterar o código do agente.
Como o SDK passa as variáveis de ambiente para a CLI?
Ele herda todo o ambiente do processo pai e filtra exatamente uma chave. No transporte de subprocessos do SDK Python, o ambiente do processo filho é criado a partir de os.environ do processo pai, removendo CLAUDECODE; em seguida, mescla CLAUDE_CODE_ENTRYPOINT, depois ClaudeAgentOptions.env e, por fim, a versão do SDK. Disso decorrem duas consequências: tudo o que estiver no seu shell chega à CLI, e options.env prevalece sobre o shell porque é mesclado por cima.
Devo usar o ambiente ou ClaudeAgentOptions(env=...)?
Use options.env em qualquer ambiente que não seja seu próprio computador. Confiar no shell do ambiente significa que o endpoint do agente depende da forma como o processo foi iniciado, o que deixa de funcionar na primeira vez que ele é executado por um agendador, em um contêiner ou em uma tarefa de CI que não carrega seu perfil. Passar env explicitamente no objeto de opções torna o roteamento uma propriedade do programa, e não do ambiente ao redor; além disso, essa opção é mesclada sobre o ambiente herdado, portanto também prevalece sobre uma variável exportada desatualizada.
O Agent SDK precisa de uma conta Anthropic separada?
Ele precisa de uma credencial aceita pela CLI do Claude Code, que não precisa ser de primeira parte. Como o roteamento ocorre por meio de ANTHROPIC_BASE_URL e ANTHROPIC_AUTH_TOKEN, funciona qualquer endpoint que ofereça a API Anthropic Messages — na Kunavo, isso significa uma chave sk-kn- em https://api.kunavo.com, com cobrança por token a partir de um saldo pré-pago, em vez de um plano.
Quais modelos um programa com o Agent SDK deve usar?
Associe o nível à subtarefa, pois um agente distribui o trabalho entre várias subtarefas. Claude Haiku 4.5 a $0.70 / $3.50 por 1 milhão de tokens é a opção certa para o trabalho em segundo plano que a CLI gera automaticamente; Claude Sonnet 5 a $1.40 / $7.00 é a opção padrão para o trabalho habitual; Claude Opus 5 a $3.50 / $17.50 só vale a pena quando um nível mais barato exigiria várias tentativas. Defina ANTHROPIC_DEFAULT_HAIKU_MODEL junto com as variáveis de roteamento em qualquer caso: sem essa configuração, o alias haiku da CLI solicita um ID de modelo que a Kunavo não oferece, então os subagentes definidos com model: haiku retornam 404; com ela, esse trabalho em segundo plano usa o Haiku, em vez do modelo principal.
O Agent SDK para TypeScript funciona da mesma forma?
Ele tem a mesma arquitetura — o SDK controla a CLI do Claude Code em vez de chamar a API diretamente —, então é a CLI que novamente lê as variáveis de roteamento. Esta página descreve o mecanismo do SDK Python porque foi essa a implementação consultada; se você usa o SDK TypeScript, confirme o nome da opção nos tipos dele antes de depender da forma explícita e, enquanto isso, use as variáveis de ambiente exportadas.
Por que o SDK filtra CLAUDECODE do ambiente?
Para que uma CLI iniciada pelo SDK não pense que está sendo executada dentro de uma sessão principal do Claude Code. Essa é a única chave removida do ambiente herdado, e aqui ela só importa como evidência de que todo o restante é repassado por completo — incluindo as duas variáveis de roteamento das quais esta página depende.