Bundle
dsh-web-search-toggle
Composer 'Web Search' toggle for the DeepSeek Harness Web UI. When on, the agent is forced (via a mandatory system-prompt directive) to call web_search before answering.
- Source
- SeerableOfficial
- stars
- 2 stars
- License
- MIT
- Updated
- Updated 4 days ago
Readme
# dsh-web-search-toggle
A [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH)
plugin that adds a **"Web Search"** toggle button to the chat composer tool row.
When it is turned on, the agent is instructed that it **must search the web
before answering** — mirroring the "Web Search" toggle in the DeepSeek Web Chat
UI. The toggle is **per-session** (per conversation), like DeepSeek's own
per-conversation toggle.
## Features
- Adds a compact, pill-shaped **"Web Search"** button in the composer tool row.
Inactive = neutral outline; active = DeepSeek brand blue with a small green
"on" dot.
- When ON, injects a mandatory **system-prompt directive** telling the agent to
call `web_search` before answering, on every turn of that session.
- Per-session state, persisted across reloads and host restarts.
- Follows DSH's plugin conventions (`dsh.bundle.patch` + `dsh.client`), so it
installs like any other DSH web-profile plugin.
<img width="1912" height="1037" alt="Screenshot 2026-08-22 170659" src="https://github.com/user-attachments/assets/51ac6fb5-fb93-4a06-9c59-727aea3d25df" />
## How it works
- **Client half** (`lib/client.js`): registers the toggle into the composer's
tool row (`conversation.input.left`, the seat beside the resident access-mode
/ plan / attach chrome). On toggle it calls the host through the
client↔host RPC channel.
- **Host half** (`index.js`):
- Serves an RPC channel (`/dsh-web-search`) with `websearch.get-state` /
`websearch.set-state`, storing the flag per session and persisting it to
`~/.dsh/dsh-web-search-toggle.json`.
- Registers a **system-prompt section** (`dsh-web-search:force`) whose text is
evaluated on every prompt assembly. When the current session's flag is ON,
it injects a mandatory "you MUST call `web_search` first" directive into the
system prompt; when OFF it renders empty (empty sections disappear).
The `web_search` tool itself is registered by DSH's own `dsh-tool-web` package
(via the auto-selected DeepSeek search-provider seam); this plugin only forces
its use.
## Why "force" is a directive, not a hard block
DSH has no primitive for "the model MUST call tool X on every turn." So the
enforcement is a strong, always-present **system-prompt instruction** — the
authoritative, reliable way to steer the model in this harness. The model
follows it, but compliance is probabilistic rather than guaranteed (as in the
DeepSeek web chat UI itself).
## Requirements
- DeepSeek Harness with the **web** profile (`dsh --profile web`).
- A configured web search provider (the built-in DeepSeek search provider, or
any `web_search`-providing provider). The plugin forces the tool; it does not
install one.
## Installation
The plugin is published to npm. From the DSH **web** profile:
```bash
# via the dsh plugin command (recommended — reconciles the bundle list)
dsh plugin --profile web add dsh-web-search-toggle
```
or with pnpm directly (skips bundle-list reconcile):
```bash
cd <your-profile-dir>
npx pnpm add dsh-web-search-toggle
# then add "dsh-web-search-toggle" to dsh.profile.bundles in package.json
```
Then **restart DSH** so the bundle patch composes at boot:
```bash
dsh --profile web restart # or your normal restart path
```
## Usage
1. Open a conversation in the DSH web UI.
2. Click the **Web Search** pill in the composer tool row to toggle it on.
3. Ask a question — the agent calls `web_search` first and cites sources.
4. Toggle it off to restore normal behavior.
The on/off state is remembered per session.
## Files
| Path | Purpose |
|---|---|
| `package.json` | Package + `dsh.bundle.patch` + `dsh.client` declaration |
| `index.js` | Host plugin: RPC channel + system-prompt force section |
| `lib/client.js` | Client plugin: composer "Web Search" toggle |
| `cordis.patch.yml` | Bundle patch mounting the host half |
| `LICENSE` | MIT License |
| `README.md` | This file |
## License
[MIT](./LICENSE)
Install
dsh plugin --profile web add github:SeerableOfficial/dsh-web-search-toggle
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-web-search-toggle from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.