# Web and Network Tools

Tools for web search, page fetching, public API lookup, HTTP requests and downloads.

| Tool | Concurrent | Description |
|---|---|---|
| `search_web` | ✓ | Live web lookup returning DuckDuckGo results and Google News headlines together as `{"web":[...],"news":[...]}`. `source` picks `all` / `web` / `news`; `time_range` applies a lookback window to both (news caps at 7 d); `edition` sets the news locale (`TW:zh-Hant`, `US:en`); `cdp=true` forces a browser fetch (auto-enabled on HTTP 202); a refresh flag skips the result cache. Since v1.3.1, with a decision model set, each result title is judged against the current request and titles judged unrelated at confidence 0.7 or higher are dropped; the cache keeps the unfiltered list, so a cached answer is filtered again. When every result is unrelated the tool returns a note to refine the query instead. Without a decision model, or when the check fails, all results come back. 90 s cap |
| `fetch_page` | ✓ | Fetch one web page as `markdown`, `html` or `json` (readability + 4xx/5xx skip cache via ToriiDB). Cookies from the persistent Chrome profile are sent by default so login-required sites work transparently; headless is attempted first and retried visibly on failure, and `headless: false` opens a visible window right away when a display exists (before v1.1.4 it forced headless-only instead). `scroll` (added in v1.3.6; 0-20, default 3, values above 20 clamped) sets how many scroll passes load lazy content, stopping early once the page stops changing — 10-20 for feeds, timelines and long comment threads, 0 for the top of the page only. `keep_links` keeps same-domain links for recursive document research, and `force` skips the 30-minute cache and retries a URL marked as failed. The `save` and `save_to` parameters were Removed in v1.3.6: saving a page to disk is `download_file(render=true)`. Since v1.3.1 the tool tells the agent to fetch a site's `/llms.txt` before its first page and, when that file lists the wanted page, to fetch the listed `.md` URL instead. With a decision model set, `markdown` output not fetched with `keep_links` is split into blocks and page chrome (ads, navigation, share or subscribe prompts, cookie notices, footers, related-link lists) is removed before the result is cached; then a page judged unrelated to the current request is withheld with a note to use a different source, a check that also runs on a cached copy. A failed check keeps the content. 90 s cap |
| `http_request` | ✓ | Raw HTTP request (GET/POST/PUT/DELETE/PATCH), returns status + headers + body. `content_type` selects `json` / `form` / `multipart`; multipart takes `{"fields":{...},"files":[{"name","path","content_type"}]}` with absolute paths read as binary. Timeout up to 300 s. A `GET` runs without confirmation; other methods go through the confirm gate. Built-in SSRF guard (DNS-resolved against loopback / private / link-local); bypass specific hosts via `net_white_list`. Since v1.3.2 it is the answer step for a public API found with `public_api_list` — no tool is built; a user-supplied API that needs a key belongs in a `script_*` tool whose script reads the key with `get_key()`, so the key never lands in the conversation. The former advice to save a repeated endpoint as an `api_*` tool was Removed in v1.3.2 together with API tools |
| `public_api_list` | ✓ | A built-in since v1.3.2 (formerly the API tool `api_public_api_list`). Public API directory: with no `category` it returns the category names; with `category` (case-insensitive, e.g. `Weather`) it returns each API in that category with its name, description, HTTPS flag and docs URL. Since v1.3.8 the agent passes the category directly when the request clearly fits one, an unknown category returns `[Not found]` with the full category list, and the tool-call line reads `API(<category>)`. The directory lists only keyless APIs. Used when no existing tool covers a live-data request: pick an API → `fetch_page` its docs → `http_request`; no fitting API → `reasoning_guide(topics=["tool_generate"])`. 30 s cap |
| `download_file` | ✓ | Download a URL to local disk: a binary file as-is (tar.gz, images, archives, installers), or, since v1.3.6, a web page rendered in the browser with the user's Chrome login and saved as `markdown`, `html` or `json`. `url` and `output_file` are required; an absolute `output_file` is used as-is, a relative one is joined under the output directory (`output_dir`, else `~/Downloads`, else `~/.config/agenvoy/download/` — not the working directory), parent directories are created and an existing file is overwritten. `render` (added in v1.3.6, default `false`) picks the browser path; `type` (added in v1.3.6: `markdown` default, `html`, `json`) applies only with `render=true`. `timeout` (default 120 s, capped at 600 s) applies only to the plain download; a rendered page uses the browser fetch's own limit. Reading a page without saving → `fetch_page`; JSON or an API response → `http_request` |
| `html_template` | ✓ | Added in v1.0.17. Gallery of worked HTML page examples served from `https://view.agenvoy.com`: `mode=list` returns every template's `name`, `category`, `title`, `desc`; `mode=read` returns one template's full HTML by `name`. Used while building an HTML deliverable after `reasoning_guide(topics=["html_render"])`, which then saves it with `write_result(format="html")`. Replaces the former `http_request` / `fetch_page` calls to the same gallery. Any other web page → `fetch_page`. 30 s cap |

`run_websocket` (added in v1.3.0) was Removed in v1.3.2, with no replacement tool; a one-off request goes to `http_request` or `fetch_page`.
