Por que Tool Use Nativo?
| Aspecto | XML no Prompt | API Nativa |
|---|---|---|
| Precisao | Depende do modelo parsear XML | Estruturado pela API, sem ambiguidade |
| Tokens | XML consome tokens do context window | Campos separados, mais eficientes |
| Cache | Sem otimização | cache_control:ephemeral na Anthropic |
| Validação | Manual | Automática pela API do provedor |
| Compatibilidade | Qualquer provedor | OpenAI, Anthropic, ZAI, MiniMax, Moonshot e OpenRouter (outros continuam com XML) |
Arquitetura
Interface ToolAwareClient
A interfaceToolAwareClient estende a LLMClient base com suporte a ferramentas:
Detecção Automatica
A detecção e feita via type assertion, sem configuração necessaria:Provedores que não implementam
ToolAwareClient continuam funcionando normalmente via SendPrompt.Suporte a Tool Use por Provedor
Nem todos os provedores implementam tool use nativo. Funcionalidades como/coder e orquestracao multi-agente funcionam melhor com provedores que suportam SendPromptWithTools:
| Provedor | Tool Use Nativo | Streaming | Impacto |
|---|---|---|---|
| OpenAI | Sim | Sim | Suporte completo a /coder e multi-agente |
| Anthropic (Claude) | Sim | Sim (OAuth) | Suporte completo a /coder e multi-agente |
| ZAI (Zhipu AI) | Sim | Sim | Suporte completo a /coder e multi-agente |
| MiniMax | Sim | Sim | Suporte completo a /coder e multi-agente. Desabilitado quando MINIMAX_API_COMPAT=anthropic (fallback para XML). |
| OpenRouter | Sim | Sim | Suporte completo a /coder e multi-agente. Usa API compatível com OpenAI. Funcionalidade depende do modelo escolhido no OpenRouter. |
| Google (Gemini) | Não | Não | Fallback para parsing de tool calls via texto — /coder funciona via extracao XML |
| xAI (Grok) | Não | Não | Fallback para parsing de tool calls via texto |
| GitHub Copilot | Não | Não | Fallback para parsing de tool calls via texto |
| GitHub Models | Não | Não | Fallback para parsing de tool calls via texto (API OpenAI-compatible) |
| Ollama | Não | Não | Fallback para parsing de tool calls via texto |
| StackSpot | Não | Não | Fallback para parsing de tool calls via texto |
Tipos de Dados
ToolDefinition
ToolDefinition
Define uma ferramenta disponível para o modelo:
ToolCall e ToolResult
ToolCall e ToolResult
Representam uma chamada de ferramenta pelo modelo e seu resultado:O campo
IsError (alinhado com a Anthropic Messages API) é emitido nativamente como is_error: true no tool_result block do Claude. Para provedores OpenAI-compatible (OpenAI, Moonshot, MiniMax, ZAI, OpenRouter), o models.Message carrega também ErrorCode (ENOENT, Timeout, ExitCode:N, InvalidArgs, …) e o adapter prefixa o content com [ERROR:<code>] — o modelo recebe o sinal mesmo sem campo nativo de erro.LLMResponse
LLMResponse
Resposta unificada que pode conter texto e/ou tool calls:
Implementações por Provedor
- OpenAI
- Anthropic (Claude)
Usa o campo
tools na API de Chat Completions:- Envia ferramentas como array de
toolscomtool_choice: "auto" - Processa
tool_callsemchoices[0].message - Mensagens
toolno histórico vinculam resultado aotool_call_id
Tool result com is_error / ErrorCode (provider-agnostic)
Resultados de ferramenta carregam dois sinais ortogonais que viajam até o modelo:IsError bool— true quando o tool executou mas reportou falha de negócio (exit code não-zero, HTTP 4xx, arquivo não encontrado, schema args inválido). False = sucesso.ErrorCode string— classificação locale-independente:ENOENT,EACCES,EISDIR,EEXIST,Timeout,Canceled,ExitCode:N,NetworkError,DNSError,InvalidArgs, etc. Vazio quandoIsError=false.
| Provider family | Como emite |
|---|---|
| Anthropic (claudeai, Bedrock Claude, StackSpot Claude) | {"type":"tool_result","is_error":true,"content":"[ERROR:ENOENT] <body>"} |
| OpenAI Chat Completions (openai, moonshot, minimax, zai, openrouter, xai, copilot) | {"role":"tool","tool_call_id":...,"content":"[ERROR:ENOENT] <body>"} |
| Outros (sem suporte nativo) | content com header [ERROR] quando aplicável |
[ERROR:<code>] para decidir retry/recovery sem precisar parsear inglês — InvalidArgs significa “corrigir schema”, Timeout significa “tentar novamente”, ENOENT significa “arquivo errado”.
ContentBlock com Cache Control
Para Anthropic, o system prompt e dividido em blocos com controle de cache:Integração com Fallback
A cadeia de fallback (llm/fallback) suporta SendPromptWithTools automaticamente. Provedores sem suporte a tool use nativo são ignorados na cadeia de tool calls, mas continuam disponíveis para requests de texto simples.