← Voltar ao curso
Nível 3 — Automação e escala · Módulo 3.7 — Claude API e agentes sob medida

3.7.2 · Primeira chamada e o formato de mensagens

5 min de vídeo TEC

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.

O que você precisa levar desta aula

  1. A chave nunca entra no código. Variável de ambiente ou cofre de segredos — e o cliente sem argumento nenhum já resolve a chave sozinho.
  2. 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.
  3. 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.

Instalação e primeira chamada

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:

Os modelos, e a conta

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.

Anatomia da resposta

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.

Streaming

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.

Três coisas que sumiram da API

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 stop_reason e trata max_tokens e refusal explicitamente — resposta cortada não pode seguir para o cliente como se estivesse completa.

📖 Client SDKs · Streaming · Pricing

Quiz — 4 questões

1.Um script em produção faz texto = response.content[0].text. Qual é o risco?
  • a)Quebra assim que a resposta trouxer outro tipo de bloco antes do texto — thinking ou tool use

    Correto. content é lista de blocos; o código precisa checar block.type.

  • b)Nenhum: o primeiro bloco é sempre o texto da resposta

    Não é garantido — com thinking ligado, um bloco de raciocínio vem antes.

  • c)Só quebra em respostas com streaming, porque os blocos chegam fora de ordem

    Streaming não reordena blocos; o problema existe também sem streaming.

Ver resposta e por quê
a) Correto. content é lista de blocos; o código precisa checar block.type.
b) Não é garantido — com thinking ligado, um bloco de raciocínio vem antes.
c) Streaming não reordena blocos; o problema existe também sem streaming.
2.Uma rotina noturna gera especificações e algumas chegam ao cliente terminando no meio de uma frase. Nenhum erro foi registrado. O que investigar primeiro?
  • a)A conexão de rede, que provavelmente cai no meio do streaming

    Queda de conexão levanta exceção e apareceria no log — o sintoma aqui é ausência de erro.

  • b)O classificador de segurança, que corta respostas longas

    Recusa vem como stop_reason: refusal e não produz texto pela metade.

  • c)stop_reason == "max_tokens" — o teto de saída cortou a resposta, sem levantar exceção

    Correto. É o erro mais silencioso da API, e o motivo de ler stop_reason em produção.

Ver resposta e por quê
a) Queda de conexão levanta exceção e apareceria no log — o sintoma aqui é ausência de erro.
b) Recusa vem como stop_reason: refusal e não produz texto pela metade.
c) Correto. É o erro mais silencioso da API, e o motivo de ler stop_reason em produção.
3.Para uma classificação simples que vai rodar 50 mil vezes por mês, qual escolha de modelo faz sentido avaliar primeiro?
  • a)Opus 5, porque em volume vale garantir a maior qualidade possível

    Em volume é justamente onde a diferença de preço pesa; começar pelo mais caro sem medir é o oposto do recomendado.

  • b)Haiku 4.5, medindo com a avaliação do módulo 3.6 se a qualidade se sustenta

    Correto. A escolha de modelo é a maior alavanca de custo, e a avaliação é o que transforma a escolha em decisão.

  • c)Fable 5, porque classificação em domínio técnico exige o modelo mais capaz

    Fable 5 é o mais caro e se destina a raciocínio difícil; classificação não é esse caso.

Ver resposta e por quê
a) Em volume é justamente onde a diferença de preço pesa; começar pelo mais caro sem medir é o oposto do recomendado.
b) Correto. A escolha de modelo é a maior alavanca de custo, e a avaliação é o que transforma a escolha em decisão.
c) Fable 5 é o mais caro e se destina a raciocínio difícil; classificação não é esse caso.
4.Você precisa gerar um documento longo, com max_tokens=64000. O que muda na chamada? ---
  • a)Nada além do valor de max_tokens — o SDK ajusta o timeout automaticamente

    Não convém depender disso: a orientação é usar streaming acima de ~16 mil tokens de saída.

  • b)É preciso dividir em várias chamadas menores, porque há teto de 16 mil por resposta

    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.

  • c)Usar 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.

Ver resposta e por quê
a) Não convém depender disso: a orientação é usar streaming acima de ~16 mil tokens de saída.
b) 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.
c) Correto. Acima de ~16 mil tokens de saída, a chamada sem streaming arrisca timeout HTTP.