Web Research¶
New in v2.5.0, extended in v2.6.0. The AI can search the web, read pages and save files from the web while it works. When a model hits an API it does not know, a library quirk, a version-specific change or an error message it has never seen, it can look it up instead of guessing. When you ask for real icons or a font, it can fetch them.
This closes the single biggest reason a generation used to get stuck: a model out of its depth had nowhere to go but its own training data. It does not need to be smarter. It needs to be connected.
The three tools¶
| Tool | What it does |
|---|---|
web_search(query) |
Runs a search and returns ranked results: title, address and a snippet for each. |
web_fetch(url) |
Fetches an address. A web page comes back as its text, with scripts, styles and markup stripped and long pages cut off; a raw file (an SVG, a JSON file, a Python module, a README) comes back exactly as it is. It saves nothing. |
download_file(url, path) |
Saves a file from the web into the project: an icon, an image, a font, a sound, a data file. The bytes go straight to disk, never through the conversation. It refuses anything the operating system would run, a file over 25 MB, the data folder, and overwriting one of your source files. |
The default search backend is DuckDuckGo. There is no account to create and no key to paste. Requests have a short timeout, so a slow site cannot stall a generation.
When the tools are available¶
The web tools are part of Agent Mode. The model is offered them when:
- Agent Mode is on, and
- the model calls tools (most do; a model that cannot works through scripts instead), and
- the
web_search_enabledsetting is on (it is by default).
On a review, where you have asked for no changes, download_file is not offered: it writes.
Asking for a file without an address¶
You do not have to find the address yourself. "Replace the toolbar icons with the Phosphor ones, grab them online" is enough: when you name a source without an address, the model looks it up, confirms the real path, and downloads from it. If it cannot find what you asked for, it says so and names the address that failed. It does not quietly draw a replacement of its own and call the job done.
What you see in the chat¶
Each call shows as a short line while the model works, with one indented line saying what came back:
→ Searching the web: "PySide6 QMediaPlayer setSource deprecated"
→ Reading: https://doc.qt.io/qtforpython-6/PySide6/QtMultimedia/QMediaPlayer.html
→ Downloading arrow-clockwise.svg
The pages themselves are not dumped into the chat. The model reads them and moves on; you see what it looked up, not the raw text. A downloaded image saved under assets shows up in the Assets tab.
Budgets¶
Two caps per session, set in Preferences > Web Research; both reset when a new generation starts:
- Searches and page reads: 20 by default. In field testing a research-heavy request on an unfamiliar library used nine; most use none.
- File downloads: 40 by default, counted apart from research, because fetching an icon set or a font family can be 15 to 30 files without looking anything up.
When a budget is spent, the tool says so to the model, and the model works with what it has.
Telling the AI to research first¶
The models do not always decide to search on their own, particularly the cheaper ones. If you know a task involves something the model is likely to be shaky on, say so:
Research the current wger API before writing the client. Do not guess the endpoints.
Look up how PySide6 6.11 handles fullscreen requests in QtWebEngine, then implement it.
That one sentence reliably turns a guess-then-crash cycle into a read-then-write one. It pairs well with the test gate: research, implement, prove.
Settings with no dialog¶
In settings.json in your Whittl data folder:
| Key | Default | Meaning |
|---|---|---|
web_search_enabled |
true |
Offer the web tools at all (they also need Agent Mode). |
web_search_backend |
"duckduckgo" |
Search backend. DuckDuckGo is the one that ships; it needs no key. |
Privacy¶
Searches go to DuckDuckGo, and page reads and downloads go directly to the site, from your machine. Nothing goes through Whittl's author. The model writes the queries, and they usually name the library, the API or the error it is investigating; they do not contain your project's source unless the model quotes a line of it into a query, which it is told not to do. See Privacy & Data Flow.
Limitations¶
- What the server sends.
web_fetchreads the page the server returns. Pages that build their content with JavaScript come back mostly empty. - DuckDuckGo's results. Some queries return few results or none. The model can rephrase and try again; the budget covers that.
- Text to the model, files to disk. The model reads text; images, fonts and other files are saved with
download_file, not read. - Per session, not per project. Switching projects starts a fresh count.
What's next¶
- Agent Mode: the mode that unlocks these tools and the
bashtool - Test Gate: the other half of "research, implement, prove"
- The AI's Tools: every tool the model can call, and when