Objetivo: ao final, o consultor faz a primeira chamada à Messages API, entende o payload e a resposta bloco a bloco, sabe onde a chave não pode ficar, e sabe quando streaming deixa de ser opcional.
response.content é uma lista de blocos, não uma string. Checar block.type é o que impede o código de quebrar quando aparecer um bloco de thinking ou de tool use.stop_reason precisa ser lido em produção. max_tokens significa resposta cortada no meio — o erro mais silencioso da API, porque não levanta exceção.pip install anthropic
export ANTHROPIC_API_KEY="sk-ant-..."
import anthropic
client = anthropic.Anthropic() # lê ANTHROPIC_API_KEY do ambiente
response = client.messages.create(
model="claude-opus-5",
max_tokens=16000,
system="Você é um analista funcional SAP especialista em MM.",
messages=[
{"role": "user", "content": "Explique a diferença entre bloqueio de fatura e bloqueio de pagamento."}
],
)
for block in response.content:
if block.type == "text":
print(block.text)
Sete linhas úteis. Repare em três decisões que já estão embutidas:
anthropic.Anthropic() sem argumento. Passar api_key="sk-ant-..." funciona, e é o começo de todo vazamento de chave em repositório.system é parâmetro próprio, fora de messages. Papel, regras e contexto estável vão aí.max_tokens=16000 é o padrão razoável sem streaming. Valor baixo demais corta a resposta; valor alto demais sem streaming arrisca timeout.| Modelo | ID | Contexto | Entrada / saída por milhão | Quando |
|---|---|---|---|---|
| Claude Opus 5 | claude-opus-5 |
1M | US$ 5 / US$ 25 | Padrão. Tarefa difícil, agente, código |
| Claude Sonnet 5 | claude-sonnet-5 |
1M | US$ 3 / US$ 15 | Volume com qualidade alta |
| Claude Haiku 4.5 | claude-haiku-4-5 |
200K | US$ 1 / US$ 5 | Classificação, extração, tarefa simples |
| Claude Fable 5 | claude-fable-5 |
1M | US$ 10 / US$ 50 | Só por exceção, raciocínio mais difícil |
preview — pode mudar· Preços e IDs conferidos em julho de 2026. Consulte a página de pricing antes de fechar proposta com número.
A escolha de modelo é a alavanca de custo mais grossa disponível: entre Haiku 4.5 e Opus 5 há cinco vezes de diferença na entrada. E é exatamente aqui que o módulo 3.6 se paga: rodar a avaliação com o modelo barato responde, com número, se ele aguenta a tarefa. Sem avaliação, a escolha de modelo é palpite com fatura no fim do mês.
response.id # "msg_01..."
response.model # o modelo que respondeu
response.content # LISTA de blocos
response.stop_reason # por que parou
response.usage.input_tokens
response.usage.output_tokens
stop_reason |
Significa | O que fazer |
|---|---|---|
end_turn |
Terminou naturalmente | Nada |
max_tokens |
Bateu no teto — resposta cortada | Aumentar max_tokens ou usar streaming |
stop_sequence |
Bateu numa sequência de parada sua | Depende do desenho |
tool_use |
Quer chamar uma ferramenta | Aula 3.7.3 |
pause_turn |
Pausou numa ferramenta de servidor | Reenviar para continuar |
refusal |
Recusa por segurança | Não reenviar igual; tratar |
max_tokens é o erro mais silencioso da API. Não levanta exceção, não vira log de erro: você recebe um texto que termina no meio de uma frase, e o código a jusante segue como se estivesse completo. Em pipeline desassistido, isso vira uma FS truncada entregue ao cliente.
with client.messages.stream(
model="claude-opus-5",
max_tokens=64000,
messages=[{"role": "user", "content": "Redija a especificação funcional completa do RICEFW 17."}],
) as stream:
for texto in stream.text_stream:
print(texto, end="", flush=True)
final = stream.get_final_message() # a mensagem completa, com usage e stop_reason
Quando streaming deixa de ser opcional:
| Situação | Streaming |
|---|---|
max_tokens acima de ~16.000 |
Obrigatório na prática — risco real de timeout HTTP |
| Interface em que o usuário espera olhando | Recomendado |
| Job em lote sem ninguém olhando | Desnecessário, salvo pelo limite acima |
get_final_message() é o que permite usar streaming sem perder nada: você exibe o texto em tempo real e ainda recebe o objeto completo, com usage e stop_reason, no fim.
| O material antigo usa | Hoje |
|---|---|
temperature, top_p, top_k |
Removidos nos modelos atuais — retornam 400. Variação e determinismo se pedem por prompt |
| Prefill do assistente | Removido — 400 (aula 3.6.1) |
thinking: {budget_tokens: N} |
Removido — use effort (aula 3.7.4) |
Regra Wayon Chave de API é credencial de sistema, tratada como qualquer outra credencial de projeto: cofre ou variável de ambiente, nunca em repositório, nunca em notebook compartilhado, nunca em anexo. Uma chave por projeto de cliente, para que revogar uma não derrube as outras. Código que chama a API em produção lê
stop_reasone tratamax_tokenserefusalexplicitamente — resposta cortada não pode seguir para o cliente como se estivesse completa.
📖 Client SDKs · Streaming · Pricing
texto = response.content[0].text. Qual é o risco?Correto. content é lista de blocos; o código precisa checar block.type.
Não é garantido — com thinking ligado, um bloco de raciocínio vem antes.
Streaming não reordena blocos; o problema existe também sem streaming.
Queda de conexão levanta exceção e apareceria no log — o sintoma aqui é ausência de erro.
Recusa vem como stop_reason: refusal e não produz texto pela metade.
stop_reason == "max_tokens" — o teto de saída cortou a resposta, sem levantar exceçãoCorreto. É o erro mais silencioso da API, e o motivo de ler stop_reason em produção.
Em volume é justamente onde a diferença de preço pesa; começar pelo mais caro sem medir é o oposto do recomendado.
Correto. A escolha de modelo é a maior alavanca de custo, e a avaliação é o que transforma a escolha em decisão.
Fable 5 é o mais caro e se destina a raciocínio difícil; classificação não é esse caso.
max_tokens=64000. O que muda na chamada? ---max_tokens — o SDK ajusta o timeout automaticamenteNão convém depender disso: a orientação é usar streaming acima de ~16 mil tokens de saída.
O teto de saída dos modelos atuais é de 128 mil tokens; o limite de 16 mil é de prudência com timeout, não da API.
client.messages.stream(), e recuperar o objeto completo com get_final_message()Correto. Acima de ~16 mil tokens de saída, a chamada sem streaming arrisca timeout HTTP.