Skip to content

Web search & fetch

Both tools are off by default, for the same reason: they turn something the model said into a request from your machine.

Searching the web100×30 · 0:29
Off by default; on, the query really goes to DuckDuckGo (or your SearXNG) and the results come back as a tool result you can read.

Turn it on with /websearch, or web_search = true. koda tells you which backend is active.

There are two, chosen automatically:

Backend When it is used What it means
SearXNG searx_url is set Your own instance. Private, self-hosted, no third party sees the query.
DuckDuckGo Otherwise The keyless HTML endpoint, so search works out of the box with nothing to host.
web_search = true
searx_url = "http://localhost:8888" # optional; omit to use DuckDuckGo
search_backend = "duckduckgo" # duckduckgo | searxng
search_results = 6

A SearXNG instance needs json in search.formats in its settings.yml, or koda cannot read the results.

You can also pick the backend explicitly in /settings: enable web search, choose DuckDuckGo or SearXNG (entering the instance address inline), then close to confirm.

With web_fetch on — off by default, toggled in /settings — the agent can GET a URL and read it as plain text. HTML is stripped and the output is capped at max_tool_output_bytes.

It is the companion to search: search finds a page, web_fetch reads it. Only http and https are accepted.

A plain GET is enough for a documentation page and useless for anything that renders client-side — you get an empty shell, a spinner, or a cookie wall.

When web_fetch returns almost no text, koda adds a note saying the page probably renders with JavaScript and points at the browse tool, or at the setting if the browser is off. Without that note a near-empty page looks like a real one that happens to be short, and the model reasons about the wrong thing.

See Browsing live pages for the browser.