Busque em todas as páginas da documentação
Um checklist testado em produção para usar bem o SDK Python anthropic em produção: configuração do cliente, escolha síncrona/assíncrona, retentativas, streaming e tratamento de erros.
Anthropic() ou AsyncAnthropic() na inicialização do módulo ou da aplicação, não dentro de um manipulador de requisição ou corpo de loop - reconstruí-lo a cada chamada descarta o pooling de conexões.Anthropic() pegar ANTHROPIC_API_KEY automaticamente em vez de codificar uma string de chave em código fonte; passe api_key=... explicitamente apenas quando a chave vier de um gerenciador de segredos em tempo de execução.anthropic não fixada pode introduzir novos campos de resposta ou tipos de bloco entre deploys; fixe-a e atualize deliberadamente.max_retries e timeout deliberadamente, não por acidente. Decida os valores com base se a chamada é interativa (timeout curto, poucas retentativas) ou um job em background (timeout mais longo, mais retentativas), em vez de deixar cada local de chamada com os mesmos padrões.http_client customizado quando tiver um requisito real de infraestrutura. Proxies, pacotes CA customizados e ajuste de pool de conexões são razões válidas; não adicione complexidade especulativamente.Anthropic() em scripts, CLIs e frameworks síncronos; use AsyncAnthropic() em serviços web assíncronos e em qualquer lugar onde você faça chamadas concorrentes em leque.async def. Isso bloqueia todo o loop de eventos durante a duração da chamada; use AsyncAnthropic() em manipuladores assíncronos, ou envolva chamadas síncronas inevitáveis em um pool de threads.asyncio.gather para realmente obter concorrência do cliente assíncrono. Aguardar cada chamada sequencialmente dentro de um loop abre mão do benefício de throughput que motivou a escolha de AsyncAnthropic() em primeiro lugar.asyncio.gather ilimitado sobre muitas requisições pode sobrecarregar seus próprios limites de taxa; limite-o a um limite de concorrência sensato para a carga de trabalho.max_tokens for grande. Acima de aproximadamente 16.000 tokens de saída, uma chamada não-streaming corre o risco de um timeout HTTP do lado do cliente; client.messages.stream() evita esse risco independentemente do tamanho da saída.text_stream para o caso comum, eventos brutos apenas quando precisar deles. text_stream cuida da análise para texto puro; desça para iteração de eventos brutos apenas quando precisar de eventos de tool-use ou thinking no meio do stream.get_final_message() após o loop, não antes. Ele retorna a mesma Message completa e tipada que uma chamada não-streaming retornaria, incluindo stop_reason e usage - não reconstrua essa informação manualmente a partir de pedaços acumulados.with/async with com o cliente que você está usando. O streaming de Anthropic() usa with e for; o streaming de AsyncAnthropic() usa async with e async for. Misturá-los levanta um TypeError.except anthropic.NotFoundError, except anthropic.RateLimitError, except anthropic.APIStatusError, except anthropic.APIConnectionError em vez de um except Exception amplo.429, 5xx, 408 e 409 são retentados automaticamente até max_retries; adicione seu próprio tratamento para o que acontece após as retentativas serem esgotadas, não para duplicá-las.400, 401, 403, 404, ou 422 sem alteração. Estes não são retentáveis por design - a requisição em si precisa mudar, não apenas ser reenviada.e.status_code, e.message, e e.type em APIStatusError, não a string bruta da exceção. O campo .type fornece uma classificação mais granular do que apenas o status HTTP (distinguindo rate_limit_error de overloaded_error, por exemplo).AuthenticationError. Uma chave de API inválida ou ausente não se resolve com retentativa; exponha-a ruidosamente em vez de entrar em loop.Message e ContentBlock, não dict ou Any. Isso é o que permite a um verificador de tipos capturar um local de chamada malformado antes de executar o código, e o que torna o estreitamento isinstance() em blocos de conteúdo realmente útil.Geralmente, sim.
Os padrões (max_retries=2, timeout=600.0 segundos) são valores razoáveis de propósito geral; substitua-os apenas quando um cenário específico (UI interativa, job de lote em background) exigir algo mais restrito ou mais flexível.
Construir o cliente uma vez na inicialização (item A1) e escolher síncrono vs assíncrono para corresponder ao modelo de concorrência real do seu programa (item B1) - ambos são fundamentais, e errar em qualquer um deles se agrava em todos os outros itens desta lista.
Não estritamente - uma resposta curta e limitada dificilmente atingirá um timeout do lado do cliente sem streaming. O streaming se torna importante à medida que max_tokens cresce ou quando você deseja feedback incremental na UI.
Porque isso bloqueia todo o loop de eventos, não apenas a requisição atual - toda outra requisição sendo servida por esse mesmo processo assíncrono para durante a duração da chamada bloqueante, não apenas a que a fez.
Para um script genuinamente descartável onde qualquer falha significa apenas "parar e imprimir um erro", uma captura ampla é aceitável. Em qualquer código que se destina a rodar sem supervisão ou servir tráfego, a cadeia específica-primeiro na seção D vale as linhas extras.
Aguardar chamadas de ferramenta assíncronas ou requisições sequencialmente em um loop em vez de usar asyncio.gather - compila, funciona e renuncia silenciosamente à concorrência que foi o motivo inteiro para escolher o cliente assíncrono.
Não.
Adicione um apenas quando houver um requisito concreto (um proxy, um pacote CA privado, ajuste de pool de conexões) - é um ponto de personalização avançado, não um passo de endurecimento de produção padrão.
As práticas subjacentes (tratamento de retentativas, disciplina de streaming, respostas tipadas) são idênticas; apenas a sintaxe (await, async with, async for) difere entre as duas classes de cliente.
Sempre que você adicionar um novo local de chamada com requisitos de confiabilidade ou latência diferentes dos seus existentes, ou após um incidente de produção que rastreou até o tratamento de erros ou configuração de timeout.
É de menor risco para um projeto pequeno, mas ainda vale a pena fazer - uma dependência não fixada pode introduzir um novo campo de resposta ou tipo de bloco entre deploys sem aviso, o que é um bug mais difícil de rastrear do que um aumento de versão que você escolheu deliberadamente.
Versões da Stack: Escrito contra a linha de modelos Claude atual em ~junho de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (o padrão), e Claude Haiku 4.5 - e o SDK oficial
anthropicPython (último release 0.x). Nomes de modelos, versões de SDK e preços mudam rapidamente - verifique os detalhes atuais em platform.claude.com/docs antes de confiar neles.