Presentation and settings
pi-web-agent keeps web research output compact by default.
That is deliberate. Research output gets noisy fast, especially when a tool is doing multiple search and fetch passes internally. The goal is to keep the transcript readable first, while still letting you ask for more detail when you want it.
Before and after
Compact output is the default now, so normal research flows stay readable instead of turning into a wall of raw tool output.
| Before | After |
![]() | ![]() |
If you want more detail inline, switch modes in /web-agent settings instead of living with the noisy default.
The three presentation modes
web_explore can be shown in one visible mode at a time:
compact: the shortest useful summarypreview: up to three plain findingsverbose: findings, sources, evidence, caveats, and retrieval details
These modes control terminal display. The model receives the same full findings, evidence, citations, caveats, and required-source notices in every mode, including compact.
The important part is that these are not stacked on top of each other.
If a result is shown in preview, you get the preview body instead of a compact summary plus extra text under it.
Default behavior
Out of the box, web_explore uses compact.
Each call has a stable heading. Pi owns the outer shell and ⎿ marker; they are shown here as terminal context, rather than text emitted by the extension:
web_explore ("Vitest coverage configuration")
⎿ 3 searches · 4 pages read · 8sWhile research runs, Pi replaces one activity line with the latest meaningful step. It does not append a growing event log or show page text:
web_explore ("Vitest coverage configuration")
⎿ Reading: vitest.dev/guide/coverage · 2 reads startedLinks you put in the question show which one is being read, since they all count toward a known total:
⎿ Reading link 3 of 8: example.com/ · 5 reads startedsearches counts logical search requests that actually started. pages read counts distinct readable documents that completed successfully, including a direct URL or repository read where applicable. A fallback does not turn one logical search into several searches, and retries or redirects do not turn one document into several pages. The elapsed time is measured for this call.
If no useful evidence was found, compact output says that plainly:
No usable evidence foundWhen a direct source the user supplied cannot be read, every mode preserves that failure instead of presenting unrelated findings as a review of that source:
Required source not read: https://github.com/owner/repo/issues/42. GitHub resource was not found or may require access. The requirements of this source were not checked.Use a follow-up after fixing access or narrowing the source. A failed required source is never represented as reviewed.
Required-source notices appear before findings in compact, preview, and verbose views. They name the requested URL, explain the failure, and say that its requirements were not checked. Other partial evidence gets a short limitation in compact and preview; verbose retains the fuller caveat and diagnostics.
Preview and verbose detail
Preview keeps the result short by showing at most three plain findings. This is an intentional reduction: it omits reader labels, remaining findings, source lists, and internal retrieval detail.
web_explore ("Vitest coverage configuration")
⎿ 3 searches · 4 pages read · 8s
Findings
• Vitest supports V8 and Istanbul coverage providers.
• Coverage thresholds can be set in the test configuration.
• Provider behavior differs for some source transforms.Verbose keeps the full terminal detail: executed queries, all findings, sources, evidence, caveats, backend attempts, and a successful-read breakdown. Its method labels include HTTP, Browser, Firecrawl, GitHub, PDF, YouTube, and Repository. Repository means local repository research; it is distinct from the GitHub reader. The Queries section is absent when the run only read direct sources.
Expanding a result in Pi opens its verbose view regardless of the inline mode. Saved results retain the presentation mode selected when they ran. Results from older sessions use the available legacy presentation as a fallback.
The fastest way to change it
Open the action menu and choose Settings:
/web-agentTo open the settings section menu directly:
/web-agent settingsThese also work:
/web-agent settings
/web-agent show
/web-agent reset project
/web-agent reset global
/web-agent mode preview
/web-agent mode web_explore verbose
/web-agent mode web_explore inheritWhat /web-agent does
/web-agent opens the action menu. Choose Settings to pick between:
- Presentation: default output mode and the
web_exploreoverride - Backends: search/fetch providers, base URLs where relevant, fallback behavior, and env-var reminders for Brave/Firecrawl API keys
From either settings screen you can:
- choose whether you are editing global or project settings
- save, reset the current scope, or cancel
Keyboard shortcuts in the settings UI:
Ctrl+Ssaves edits to the selected scopeCtrl+Rresets the selected scope: the first press asks, a second press deletes that scope's entire config file (presentation and backend settings both), and Esc or any other key cancelsEscdiscards unsaved edits and closes settings
The reset menu entries and /web-agent reset project or /web-agent reset global also delete the whole scope file, after a confirmation dialog. Without an interactive UI, the typed command resets straight away.
While an inline backend URL editor is open, its keys take precedence: Enter accepts the field edit and Esc cancels that edit. Return to the settings screen before using Ctrl+S to save the scope.
Config files
Settings are stored in real JSON files. The UI writes presentation and backend sections separately so changing one does not wipe the other.
Global config:
~/.pi/agent/extensions/pi-web-agent/config.jsonProject config:
.pi/extensions/pi-web-agent/config.jsonPrecedence
Effective behavior is resolved in this order:
- built-in defaults
- global config
- project config
Project config overrides global config.
That means you can keep a personal default and then override it inside one repo when you want different transcript behavior there.
How inheritance works
The web_explore override inherits from the current default mode unless you set it explicitly.
So if your default mode is preview and web_explore is set to verbose, then web_explore uses verbose.
When you switch web_explore back to inherit, it uses the current default mode. Project settings save a presentation.cleared marker when removing a tool override, so a global tool override does not reappear after reload:
{
"presentation": {
"cleared": ["tools.web_explore"]
}
}Omitting a project setting inherits the global setting. A clear marker removes the lower layer's tool override before this layer's values are applied. Changing the default mode then changes the inherited tool mode too. Selecting an explicit tool mode replaces the clear; removing the marker or resetting project config restores the global tool setting.
An explicit mode stays pinned even when it matches the global mode or current default. Saving other settings preserves existing tool and default-mode pins. Untouched inherited settings remain omitted from the saved layer.
Example config
{
"presentation": {
"defaultMode": "compact",
"tools": {
"web_explore": { "mode": "verbose" }
}
},
"backends": {
"search": { "provider": "duckduckgo" },
"fetch": { "provider": "http" },
"headless": { "provider": "local-browser" }
}
}Backend provider, URL, and fallback settings are usually easier to edit through Settings → Backends than by hand.
When to use each mode
A good practical rule:
- use
compactif you mostly want clean transcripts - use
previewif you want up to three plain findings - use
verboseif you want sources and caveats inline too
For most people, compact as the default is probably right. Use preview or verbose when you are debugging research behavior or want to inspect what happened under the hood.

