GitHub

docs / tools & profiles

Tools & profiles

A tool is a schema in every request. Wombat keeps the default registry small, then lets the model ask for reach when the task needs it.

The registry

Deduplication cut the always-exposed registry from 34 tools to 18 (19 with question). The default coding profile exposes nine of them:

read  write  edit  bash  glob  grep  apply_patch  tool_search  request_capability

Git actions run through bash git. Rename, refactor, multi-edit, the separate jobs list and the git tools are gone from the registry; the implementations that remain are on a one-release soft cut. TestRegistryDedup locks both the 18-tool registry and the nine-tool profile, so the count does not drift back up by accident.

Profiles

A profile is a preset bundle of capabilities. Set it in the config, on wombat run --profile, or with /profile in chat.

profilecapabilitiestools
minimalcoreread, write, edit, bash, glob, grep, todowrite, tool_search, request_capability
coding (default)core + editthe nine above plus apply_patch
webcore + edit + webbrowser, websearch, webfetch, request_more_research
semanticcore + edit + semanticlsp
verifycore + edit + verifyverify
mediacore + edit + mediaimagesearch
orchestratorcore + editplanning and worker tools, when orchestration is enabled
fulleverythingthe whole registry, including optional capabilities
autocoding, plus what the prompt impliesresolved at request time

Capabilities

A capability is a named bundle of tools the model can request mid-run. Four are optional and can be forced on or off per session.

capabilityloadsdefault
webbrowser, websearch, webfetch, request_more_researchauto
semanticlsp — definitions, references, diagnostics, completions, symbolsoff
verifyverify — run the project's own tests, build, lint, typecheckoff
mediaimagesearch — find and download image referencesoff
mcpevery tool from your attached MCP serversauto

How a capability gets loaded

tool_search takes a query and returns compact matches — name, one-line purpose and the tool count — without loading anything. request_capability then loads one named capability for the rest of the session.

tools: 8 → schema 1,219 tokens → first request 1,877 input tokens

model: request_capability("web", "need to inspect the page")
result: loaded browser, webfetch, websearch
next request: 11 tools, 2,690 schema tokens

That is the whole trade: 1.9k tokens for a coding turn, 2.7k when the browser is genuinely needed, instead of ~10k of schemas on every request.

Research budgets

Research is a policy, not a tool description. Each mode has a soft budget that triggers "synthesize now", a hard ceiling that refuses the call, and a wall-clock cap.

modesoft search / fetchhard ceilingtime capdepth
off———no web tools
quick2 / 14 / 260sfast
standard5 / 38 / 4120sfast
deep10 / 615 / 8300sdeep
autoQuick unless the prompt asks for a deep dive, a comparison, or systematic verification.

When the soft budget is spent, the tool returns:

research fetch soft budget reached (1/1); synthesize now or call
request_more_research with a specific reason

request_more_research buys one more search and one more fetch, requires a written reason, and is refused once the hard ceiling is hit. This is the difference between the old 13-search loop and the 21s research turn measured in the benchmarks.

Answer first. Recommendations and opinions come from the model's knowledge. The web is for current facts or explicit verification, and the system prompt says so.

Questions

A vague prompt ("fix it") gets one bounded round: at most two question calls per run, each offering 2–3 concrete options, and never a second round. Headless runs — wombat run — do not ask at all; they state their assumptions and proceed, then exit 0.

Web search and fetch

websearch runs the configured backends in parallel — Brave, Serper, Exa and Tavily when keys are set, plus keyless Bing RSS, DuckDuckGo HTML and Mojeek — then merges, cross-checks and ranks. It accepts 2–4 query variants, freshness, language, region and pagination; results are cached for ten minutes; trusted docs and GitHub are boosted and SEO spam is filtered. By default it also fetches the top three pages and adds an excerpt with date and author when it can find them.

webfetch extracts the main article text, pretty-prints JSON, returns XML as text, and says so plainly for PDFs and binary payloads. Both share a 15-second HTTP client with retries and a five-second grace window after the first backend answers.

export EXA_API_KEY=...
export TAVILY_API_KEY=...
export BRAVE_API_KEY=...
export SERPER_API_KEY=...

Verification and semantics

verify reads the project, works out the test, build, lint and typecheck commands, and runs them. With require_verification on, a run cannot report success without a passing check. Writers always run their checks before a patch merges.

lsp asks a language server for definitions, references, diagnostics, completions, workspace symbols and file outlines. Go uses gopls; TypeScript, Python, Rust, C/C++, Java, Ruby, PHP, Lua, C#, Swift, Kotlin and shell use their standard servers when installed. Set WOMBAT_LSP_<EXT> to point at a specific binary.