Skip to main content
O ChatCLI suporta chamadas de ferramentas via API nativa para OpenAI, Anthropic, ZAI (Zhipu AI), MiniMax, Moonshot (Kimi) e OpenRouter, substituindo a abordagem de XML embutido no prompt por chamadas estruturadas via API. Isso melhora a precisao, reduz o consumo de tokens e habilita otimizações de cache.

Por que Tool Use Nativo?


Arquitetura

Interface ToolAwareClient

A interface ToolAwareClient 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:
Ao usar provedores sem tool use nativo, os modos agent e coder ainda funcionam mas dependem de parsing baseado em XML do texto de saída do LLM. Isso e menos confiavel que tool calling nativo e pode ocasionalmente precisar de retentativas de correcao de formato (até 3 tentativas). Para workflows /coder em produção, OpenAI, Claude, ZAI, MiniMax ou OpenRouter são recomendados.

Tipos de Dados

Define uma ferramenta disponível para o modelo:
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.
Resposta unificada que pode conter texto e/ou tool calls:

Implementações por Provedor

Usa o campo tools na API de Chat Completions:
  • Envia ferramentas como array de tools com tool_choice: "auto"
  • Processa tool_calls em choices[0].message
  • Mensagens tool no histórico vinculam resultado ao tool_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 quando IsError=false.
O modelo pattern-match no [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:
O cache_control:ephemeral informa a Anthropic que o bloco do system prompt pode ser cacheado entre requests, reduzindo significativamente a latência e custo em conversas longas.

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.