tool_choice e distribuição de ferramentas entre agentes
Objetivos de aprendizagem
- Configurar
tool_choice(auto,any,toolforçado,none) edisable_parallel_tool_use. - Usar seleção forçada para garantir que uma ferramenta específica seja chamada primeiro, processando os passos seguintes em turnos com
auto. - Conhecer a restrição dos modelos mais novos que rejeitam
any/toolforçado com erro 400 — e as alternativas. - Explicar por que dar muitas ferramentas a um agente (18 em vez de 4–5) degrada a confiabilidade da seleção.
- Escopar ferramentas por papel do agente, com ferramentas cross-role limitadas e substituição de ferramentas genéricas por alternativas restritas.
As quatro opções de tool_choice
| Valor | Comportamento |
|---|---|
{"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:
- Escopo por papel: cada subagente recebe apenas as ferramentas do seu papel (o agente de pesquisa tem busca; o de síntese, não).
- Cross-role limitado: para necessidades de alta frequência, dê uma ferramenta escopada — ex.: um
verify_factsimples para o agente de síntese resolver 85% das verificações localmente, roteando os casos complexos pelo coordenador. - Substitua genéricas por restritas: troque
fetch_url(busca qualquer URL) porload_documentque valida URLs de documentos permitidos — a restrição vira contrato, não torcida.
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
- Distrator típico: "dê ao agente de síntese acesso a todas as ferramentas de busca para eliminar round-trips". Viola separação de responsabilidades; a resposta certa é a ferramenta cross-role escopada para o caso frequente.
- Distrator típico: confundir
any("alguma ferramenta, obrigatoriamente") comauto("o modelo decide"). Sóany/toolgarantem chamada — mas lembre da restrição 400 nos modelos mais novos. - Pegadinha:
disable_parallel_tool_use: truelimita a uma chamada por resposta; não força sequência específica entre ferramentas nem garante ordem entre turnos. - Pegadinha: em Opus 5.5/Fable 5.1,
auto+disable_parallel_tool_usesignifica "no máximo uma" chamada; a combinação "exatamente uma" (comany) não existe mais nesses modelos. - Distrator típico: resolver seleção ruim entre 18 ferramentas com um modelo maior. O problema é a superfície de decisão, não a capacidade — reduza e escope o conjunto de ferramentas.
Resumo em 5 linhas
tool_choice:auto(padrão),any(alguma ferramenta obrigatória),tool(ferramenta específica),none; todos aceitamdisable_parallel_tool_use.- Force uma ferramenta no 1º turno (ex.:
extract_metadata) e volte aautonos seguintes para o restante do fluxo. - Modelos mais novos (Opus 5.5, Fable 5.1) rejeitam
any/toolforçado com 400 — useauto+ instrução no prompt + verificação,strictpara schema e structured outputs para JSON. - 18 ferramentas em vez de 4–5 degrada a seleção; agentes usam mal ferramentas fora da sua especialização.
- Escope por papel, dê cross-role só o necessário e escopado (
verify_fact), e troque genéricas (fetch_url) por restritas (load_documentcom validação).
Documentação oficial
- Implement tool use — tool_choice
- Tool use — Overview
- Structured outputs (alternativa ao tool forçado para JSON)
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?
Gabarito: C. any obriga o modelo a chamar pelo menos uma ferramenta. A não garante (auto é probabilístico). B proíbe ferramentas — o oposto. D só controla paralelismo, não obriga chamada nenhuma.
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?
Gabarito: B. Nos modelos mais novos, any e tool forçado retornam 400 — a alternativa é auto + prompt + verificação (e structured outputs quando a chamada forçada só servia para gerar JSON). A está errada: 400 é erro de request, não transitório. C está errada: any também é rejeitado. D usa prefill, padrão obsoleto que retorna erro 400 nos modelos atuais.
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?
Gabarito: D. Escopo por papel + cross-role limitado é o padrão recomendado: menos ferramentas melhora a seleção e evita uso fora da especialização. A depende de compliance probabilística com o prompt. B não reduz a superfície de decisão. C exagera: o agente ainda precisa das ferramentas do próprio papel.
4. Qual é o efeito de "disable_parallel_tool_use": true dentro de tool_choice?
Gabarito: A. O flag limita a uma chamada por resposta. B está errada: ferramentas custom executam no cliente; o flag não muda onde executam. C está errada: com auto significa "no máximo uma", e a combinação "exatamente uma" com any/tool não existe nos modelos mais novos. D está errada: resultados de chamadas paralelas vão todos numa única mensagem user — regra independente deste flag.