Domínio 2 — Tool Design & MCP Integration · Lição 2 de 6

tool_choice e distribuição de ferramentas entre agentes

Objetivos de aprendizagem

As quatro opções de tool_choice

ValorComportamento
{"type": "auto"}Padrão: o modelo decide se usa ferramentas ou responde em texto.
{"type": "any"}O modelo deve chamar pelo menos uma ferramenta (qualquer uma) — nunca responde só com texto conversacional.
{"type": "tool", "name": "..."}O modelo deve chamar a ferramenta nomeada.
{"type": "none"}O modelo não pode usar ferramentas neste turno.

Qualquer valor de tool_choice aceita "disable_parallel_tool_use": true, que limita o modelo a no máximo uma chamada de ferramenta por resposta (por padrão ele pode pedir várias em paralelo).

Restrição em modelos mais novos: nas gerações topo de linha mais recentes (ex.: Claude Opus 5.5 e Claude Fable 5.1), tool_choice forçado — any ou {"type": "tool", ...} — retorna erro 400. Em claude-opus-5 ainda funciona. Nesses modelos, use auto + instrução explícita no prompt ("Use a ferramenta get_weather para responder"), verifique se a chamada aconteceu e repita se necessário; strict: true preserva a garantia de argumentos válidos, e structured outputs (output_config.format) substitui o caso em que a chamada forçada só existia para extrair JSON.

Forçando a primeira chamada e liberando as seguintes

Padrão de exame: garantir que extract_metadata rode antes das ferramentas de enriquecimento. A técnica é forçar a ferramenta no primeiro request e voltar a auto nos turnos seguintes:

import anthropic

client = anthropic.Anthropic()

tools = [
    {
        "name": "extract_metadata",
        "description": "Extrai metadados estruturados de um documento. Deve rodar antes de qualquer enriquecimento.",
        "input_schema": {
            "type": "object",
            "properties": {"doc_id": {"type": "string", "description": "ID do documento"}},
            "required": ["doc_id"],
        },
    },
    {
        "name": "enrich_entities",
        "description": "Enriquece entidades ja extraidas com dados externos. Requer metadados previos.",
        "input_schema": {
            "type": "object",
            "properties": {"entities": {"type": "array", "items": {"type": "string"}}},
            "required": ["entities"],
        },
    },
]

messages = [{"role": "user", "content": "Processe o documento DOC-991."}]

# Turno 1: forca extract_metadata (funciona em claude-opus-5;
# em Opus 5.5 / Fable 5.1 retornaria 400 — la, use auto + instrucao no prompt)
first = client.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    tools=tools,
    tool_choice={"type": "tool", "name": "extract_metadata"},
    messages=messages,
)

tool_use = next(b for b in first.content if b.type == "tool_use")
metadata_result = {"title": "Relatorio Q3", "entities": ["ACME", "Q3-2026"]}

messages.append({"role": "assistant", "content": first.content})
messages.append({
    "role": "user",
    "content": [{
        "type": "tool_result",
        "tool_use_id": tool_use.id,
        "content": str(metadata_result),
    }],
})

# Turnos seguintes: auto — o modelo decide os proximos passos
followup = client.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    tools=tools,
    tool_choice={"type": "auto"},
    messages=messages,
)
print(followup.stop_reason)

Use any quando o requisito é "o modelo nunca deve responder texto solto neste turno" (ex.: pipeline que só consome tool_use). Se o objetivo era apenas obter JSON válido, structured outputs é a solução moderna — não uma ferramenta forçada de mentira.

Muitas ferramentas degradam a seleção

Dar a um agente 18 ferramentas em vez de 4–5 aumenta a complexidade da decisão a cada turno e degrada a confiabilidade da seleção — mais descrições parecidas competindo, mais chances de misrouting e de uso indevido. Agentes com ferramentas fora da sua especialização tendem a usá-las mal: um agente de síntese com acesso a web search tende a sair pesquisando em vez de sintetizar.

Princípios de distribuição em sistemas multi-agente:

flowchart TD
    C[Coordenador] --> P[Agente de pesquisa\nweb_search, load_document]
    C --> A[Agente de análise\nextract_data_points, summarize_content]
    C --> S[Agente de síntese\ncompose_report, verify_fact*]
    S -. verificações complexas .-> C
  

Pegadinhas da prova

Resumo em 5 linhas

  1. tool_choice: auto (padrão), any (alguma ferramenta obrigatória), tool (ferramenta específica), none; todos aceitam disable_parallel_tool_use.
  2. Force uma ferramenta no 1º turno (ex.: extract_metadata) e volte a auto nos seguintes para o restante do fluxo.
  3. Modelos mais novos (Opus 5.5, Fable 5.1) rejeitam any/tool forçado com 400 — use auto + instrução no prompt + verificação, strict para schema e structured outputs para JSON.
  4. 18 ferramentas em vez de 4–5 degrada a seleção; agentes usam mal ferramentas fora da sua especialização.
  5. Escope por papel, dê cross-role só o necessário e escopado (verify_fact), e troque genéricas (fetch_url) por restritas (load_document com validação).

Documentação oficial

Questões de fixação

1. Um pipeline consome exclusivamente blocos tool_use e quebra quando o modelo responde texto conversacional. Em claude-opus-5, qual configuração garante que alguma ferramenta será chamada?

2. Ao migrar um agente de claude-opus-5 para um modelo topo de linha mais novo, os requests com tool_choice={"type": "tool", "name": "extract_json"} passam a retornar 400. Qual é a adaptação correta?

3. Um agente de síntese em um sistema multi-agente de pesquisa tem acesso a 18 ferramentas, incluindo todas as de web search, e os logs mostram que ele frequentemente sai pesquisando em vez de sintetizar. Qual mudança segue as boas práticas de distribuição de ferramentas?

4. Qual é o efeito de "disable_parallel_tool_use": true dentro de tool_choice?