As web tools são ferramentas nativas do ChatCLI, disponíveis automaticamente nos modos agent e coder. Não e necessário configurar servidores MCP para usa-las.
@webfetch
Faz o fetch de uma URL, remove o HTML e retorna o conteúdo textual limpo. Ideal para ler documentações, artigos, READMEs e qualquer página web.Como Funciona
Requisicao HTTP
O ChatCLI faz uma requisicao GET para a URL fornecida com headers padrão de navegador.
Parse HTML
O HTML recebido e parseado usando
golang.org/x/net/html, extraindo apenas o conteúdo textual.Limpeza
Tags de script, style, navegacao e elementos não-textuais são removidos. O texto resultante e limpo e formatado.
Uso
O LLM invoca@webfetch automaticamente quando precisa acessar conteúdo de uma URL. Você também pode solicitar explicitamente:
Formatos de Argumentos
- JSON
- Posicional
Exemplo
Filtros para payloads grandes
Endpoints como Prometheus/metrics, dumps de configuração ou listagens longas podem facilmente exceder dezenas de milhares de caracteres. O @webfetch aceita um conjunto de parâmetros que aplicam filtragem por linha antes do truncamento, evitando que o miolo útil seja descartado:
| Parâmetro | Tipo | Descrição |
|---|---|---|
filter | string (regex Go) | Mantém apenas linhas que casam com o regex. Aplicado antes de exclude e from_line/to_line. |
exclude | string (regex Go) | Descarta linhas que casam com o regex. Aplicado depois de filter. |
from_line | integer | Início da janela na visão filtrada (1-based, inclusivo). |
to_line | integer | Fim da janela na visão filtrada (1-based, inclusivo). |
save_to_file | boolean | Persiste o corpo completo (pré-filtro) no scratch dir da sessão e retorna preview + caminho absoluto. Disparado automaticamente quando o corpo excede CHATCLI_WEBFETCH_AUTOSAVE_BYTES (default 10000) e não há filtro/range definido. |
save_path | string | Sobrescreve o nome do arquivo gerado por save_to_file (qualquer prefixo de diretório é descartado — escrita sempre confinada ao scratch). |
max_length | integer | Tamanho máximo do conteúdo retornado inline (default: 20.000). Conteúdo acima disso é truncado inline — ou auto-salvo no scratch dir via auto-save. |
render | boolean | Força (true) ou suprime (false) a renderização headless de páginas JS — ver Renderização de páginas JavaScript. Sem o parâmetro, o modo auto decide pela heurística. |
read_file apontando para o caminho absoluto retornado, escolhendo o intervalo exato de linhas que importa.
Auto-save inteligente
Quando o LLM chama@webfetch sem filtro, exclude, range ou save_to_file explícito, e o body retornado supera o threshold de auto-save, o ChatCLI promove o fetch automaticamente para modo save_to_file=true. Isso protege o contexto contra páginas gigantes sem obrigar o modelo a saber o tamanho de antemão.
Default: bodies acima de 10.000 bytes (configurável via CHATCLI_WEBFETCH_AUTOSAVE_BYTES) passam pelo auto-save. O resultado inline fica em um preview compacto (~5.000 chars) e a resposta começa com um marker explícito:
Renderização de páginas JavaScript (SPA)
Páginas que constroem o conteúdo no client (SPAs, tabelas montadas via JavaScript) retornam um “casco” vazio no fetch estático —<div id="root"> e bundles, sem o conteúdo real. O @webfetch resolve isso com uma cadeia de escalonamento:
Detecção de shell JS
Heurística: texto extraído fino + sinais estruturais (mount points vazios
#root/#app, aviso <noscript>, marcadores de framework — React, Next, Angular, Vue, Nuxt, Svelte, Gatsby, Remix, Flutter).Render headless via CDP
Um Chromium real renderiza a página (espera load + DOM estável) e o DOM resultante passa pelo mesmo pipeline de extração/filtros/auto-save.
CHATCLI_WEBFETCH_RENDER_BROWSER → download opt-in de um Chromium pinado (~150 MB, uma vez) com CHATCLI_WEBFETCH_RENDER_AUTOPROVISION=true. Sem API keys, sem serviços externos.
Postura de produção: um browser compartilhado por processo (lançamento lazy, reuso com health-check, shutdown após 2 min ocioso), circuit breaker (2 falhas de launch → 5 min de pausa), contexto incógnito por render (cookies nunca vazam entre sites) e SSRF reforçado dentro do browser — cada sub-request da página é validado via interceptação CDP, espelhando o guard do caminho HTTP normal. DOM renderizado limitado a 10 MB.
| Variável | Descrição | Default |
|---|---|---|
CHATCLI_WEBFETCH_RENDER | auto (heurística decide), always, never | auto |
CHATCLI_WEBFETCH_RENDER_TIMEOUT | Timeout do render em segundos | 25 |
CHATCLI_WEBFETCH_RENDER_BROWSER | Caminho absoluto para um binário Chromium-based específico | (auto-detect) |
CHATCLI_WEBFETCH_RENDER_AUTOPROVISION | Permite o download único de um Chromium pinado quando nenhum browser existe | false |
@websearch
Realiza uma busca web e retorna os resultados com título, URL e snippet. Suporta dois backends keyless por design — nada de API key externa para cadastrar: DuckDuckGo (scraping HTML) é o default zero-config, e SearxNG self-hosted é o preferido em ambiente corporativo quando você aponta para uma instância interna.Backends disponíveis
| Backend | Requisito | Quando brilha | Quando dói |
|---|---|---|---|
| DuckDuckGo | Nenhum | Default, funciona já, zero config | DDG eventualmente serve interstitial de anti-bot (CAPTCHA) — pode retornar zero resultados |
| SearxNG self-hosted | SEARXNG_URL apontando para a instância | Empresa fechada em rede corporativa — você controla o backend, sem saída para scraping público, agrega vários engines (Bing/Google/Qwant) pela instância | Requer subir um container interno + habilitar JSON no settings.yml |
| Brave Search | Nenhum | Índice próprio e independente (não é meta-busca) — diversidade real quando DDG bloqueia | Scraping HTML; layout pode mudar (parser ancorado em atributos semânticos estáveis) |
| Mojeek | Nenhum | Índice próprio e independente, crawler britânico | Algumas redes recebem 403 para tráfego automatizado — a cadeia simplesmente avança |
Cadeia de fallback
A cada query, o ChatCLI monta uma cadeia ordenada de backends. Se o primeiro falha ou retorna vazio, o próximo é tentado automaticamente. Ordem default (CHATCLI_WEBSEARCH_PROVIDER não setado ou auto):
searxng → duckduckgo → brave → mojeek. Os demais continuam como fallback se a instância SearxNG falhar. O mesmo vale para qualquer provider: CHATCLI_WEBSEARCH_PROVIDER=brave move o Brave para o topo e mantém o resto atrás.
Variáveis de ambiente
| Variável | Descrição | Default |
|---|---|---|
CHATCLI_WEBSEARCH_PROVIDER | Força um backend específico no topo da cadeia: searxng, duckduckgo, brave, mojeek, ou auto. | auto |
SEARXNG_URL | URL raiz da instância SearxNG (ex.: https://searx.internal.corp). Quando setado, SearxNG entra na cadeia. | (não setado) |
Comando /websearch
Gerenciador interativo do backend preferido. Autocomplete disponível para subcomandos e nomes de provider.
| Subcomando | Efeito |
|---|---|
/websearch ou /websearch status | Mostra provider atual + cadeia ativa |
/websearch list | Lista providers conhecidos e quais estão configurados |
/websearch provider <searxng|duckduckgo|brave|mojeek|auto> | Define provider preferido para a sessão (seta CHATCLI_WEBSEARCH_PROVIDER no processo) |
/websearch reset | Remove o override e volta ao modo auto |
/websearch provider é apenas para a sessão corrente. Para persistir, exporte a env no shell ou adicione ao .env.
Configurando SearxNG self-hosted
A instância SearxNG precisa ter a JSON API habilitada — não vem ativa por default. Nosettings.yml do SearxNG:
SEARXNG_URL para uma instância sem JSON habilitado, o ChatCLI retorna um erro acionável ao invés de uma mensagem de decode confusa:
Como funciona internamente
Seleção da cadeia
SelectSearchChain() lê CHATCLI_WEBSEARCH_PROVIDER e SEARXNG_URL, retorna uma lista ordenada de backends a tentar.Tentativa sequencial
Para cada backend na cadeia: chama a função de busca. Se retorna resultados, pára e formata. Se falha ou retorna zero, loga o motivo e avança para o próximo.
Formatos de Argumentos
- JSON
- Posicional
Exemplo
(via DuckDuckGo) ou (via SearxNG) deixa claro qual backend respondeu — útil para diagnosticar por que alguma query não voltou resultado (ex.: DDG serviu CAPTCHA → fallback para SearxNG).
Por que keyless? O ChatCLI é usado em ambientes corporativos onde gerenciar API keys de terceiros (Brave Search, Tavily, SerpAPI) gera atrito operacional — cadastro, rotação, approvals. SearxNG self-hosted resolve fechamento de rede sem custo recorrente; DuckDuckGo cobre o caso casual sem nenhuma config.
Comparacao
| Aspecto | @webfetch | @websearch |
|---|---|---|
| Proposito | Ler conteúdo de uma URL específica | Buscar na web por uma query |
| Input | URL | Query de busca |
| Output | Texto limpo da página | Lista de resultados (título + URL + snippet) |
| Quando usar | Você sabe a URL exata | Você precisa encontrar informações |
| Motor | HTTP GET + HTML parser | DuckDuckGo (scraping HTML) + SearxNG (JSON API) |
Disponibilidade
As web tools estão disponíveis nos seguintes modos:| Modo | @webfetch | @websearch |
|---|---|---|
| Chat | Não | Não |
Agent (/agent) | Sim | Sim |
Coder (/coder) | Sim | Sim |
One-shot (-p) | Sim (com --agent) | Sim (com --agent) |
Próximos Passos
MCP Integration
Integre ferramentas web adicionais via MCP servers.
Plugins Agenticos
Veja todas as ferramentas disponíveis para o agent.