Persistent enhanced web search: multi-engine routing (DeepSeek/Exa/DDG/Bing/Jina + GitHub/Bilibili/YouTube/V2EX/Xiaohongshu/Twitter/Reddit/RSS), SQLite+LRU cache, userscript-style extraction, Playwright rendering.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-web-search-pro
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:anweat/dsh-web-search-pro
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 中文
An enhanced web search plugin for DeepSeek Harness (DSH): multi-engine search, platform search, a persistent cache and evidence packs, with only two tools resident in the model's context.
The detailed guides linked below are written in Chinese. This page covers install, first use and the everyday settings in English.
- Evidence-pack mode: give
search.runa one-sentence task and it returns scored excerpts plus the gaps that remain, instead of a result list. It uses far less context. - Multi-engine plus platform sources: web engines (ddg, bing, Exa, Jina ...) and platforms (GitHub, Bilibili, YouTube, Xiaohongshu, Zhihu, Reddit, X, RSS ...) share one probing, cooldown, fallback and history path. DeepSeek Search / Fetch is the "common" source (billed per request).
- You do the logging in: platforms that need a login go opencli-first (your everyday Chrome's session). The plugin has no login window and never reads cookies.
- Two resident tools:
web_index(catalog) thenweb_call(execute). 27 actions are disclosed on demand, about 800 characters resident. - Persistence: SQLite plus in-memory LRU cache, query history, re-importable per-site extraction rules.
- Visual settings: one settings card for search order, keys, custom CLIs and the scoring model. Changes an agent makes appear as an overlay you can adopt or revert with one click.
Compatibility
| Item | Range |
|---|---|
| dsh-web-search-pro | 0.2.4 |
| DSH host (peer) | >=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0; verified on 0.2.0-rc.2, 0.2.1-rc.3, 0.2.1-rc.4, 0.2.1-rc.5, 0.2.2-rc.1 |
| cordis (peer) | ~4.0.4 || ~4.1.0 (0.2.2-line hosts ship 4.1.x) |
Optional companion @anweat/dsh-browser |
^0.2.0 (on 0.2.1-line hosts it must be 0.2.2 or later; on 0.2.2-line hosts use 0.2.3 or later) |
| DSH 0.1.x hosts or dsh-browser 0.1.x | Stay on dsh-web-search-pro@0.1.15; it is no longer updated |
Settings card channel on the 0.2.2 line: the host's connection.rpc.handle() throws for external plugins under cordis 4.1 (root cause: the host's dsh-client-connection register() reads owner.webServer, and cordis 4.1 checks inject at the service's definition site). The plugin calls handle through a derived context that owns webServer (ctx.extend({ webServer: ctx.get('webServer') })): public Context API only, no private host method, the same code on all three host lines (0.2.0-rc.2, 0.2.1-rc.5, 0.2.2-rc.1). The approach comes from anweat/dsh-browser#49 (@shuaigekda). If mounting fails the plugin prints one console warning and keeps running (live status, agent-edits panel and CLI dry-run unavailable). See the CHANGELOG and the validation record (Chinese).
The compatibility table of earlier versions is in the CHANGELOG; how the peer range is written is explained in Compatibility (Chinese).
Installation
DSH CLI (restart the profile afterwards):
# Search only:
dsh plugin --profile web add dsh-web-search-pro@0.2.4
# Plus rendered pages / browser platforms: install the optional browser plugin together (both must be direct dependencies of the profile)
dsh plugin --profile web add @anweat/dsh-browser@0.2.3 dsh-web-search-pro@0.2.4
dsh --profile web
DSH Desktop: Desktop manages its profile itself and the CLI cannot operate it. Open the Plugins page, click Add plugin, enter the package name (a version may be appended, for example dsh-web-search-pro@0.2.4, the same text as after add above), then Install. The dialog also lets you pick a Registry. Upgrading a non-official plugin means uninstalling and reinstalling it. Mirrors such as npmmirror can lag the official registry by minutes to hours; if a new version cannot be installed, switch the Registry to https://registry.npmjs.org.
Local directory / tarball (development): dsh plugin --profile web add ../dsh-browser ./dsh-web-search-pro.
More (first-install notes and troubleshooting) in Install and first use (Chinese); upgrading is covered in the CHANGELOG.
First use
- Settings card:
Settings -> Plugins -> Plugin config -> Web Search Pro. The status summary at the top shows the default engine chain in the order it is actually tried, how many sources have a key, whether DeepSeek is ready, and pending restarts. - Check the backends: have the model call
web_callwithsources.status; the readiness of every source and platform, and why a backend was skipped, are listed there. - Sources and keys: web search and the evidence pipeline work right after install (ddg / bing need no key). With a
DEEPSEEK_API_KEYthe default search leads with DeepSeek Search, which is billed per request; putdeepseekundersources.disabledto opt out. Exa, Jina, Bocha, GitHub and other keys are entered in the card's "Sources" group (stored in DSH Credentials and never read back). - Defaults out of the box: Jev is off by default (
evidence.jevMode: off; evidence scoring uses the local rules and no model is called, no model key is needed); Bocha is used only when you configure a key. Exception: DeepSeek Search (the common, 常用, source; billed per request) leads the default order as soon as a DeepSeek API key resolves (settings key field, DSH credentialDEEPSEEK_API_KEY, or the process environment); putdeepseekundersources.disabledor write your ownengineslist to opt out. - Optional dependencies: the browser plugin
@anweat/dsh-browser(read.snapshot,read.fetch mode=playwright, search-page platforms; an installed Chrome / Edge is used directly, no Chromium download);npm i -g @jackwener/opencliplus its Browser Bridge extension (Xiaohongshu / Zhihu / Reddit / X, using your everyday Chrome's login, see Platform login); CLIs such as bili, yt-dlp and gh are detected bysources.deps.
Quick examples
The model calls web_call({action, args}). An evidence pack (pass task or profile):
{"action":"search.run","args":{"query":"node:sqlite busy timeout","task":"how to set a busy timeout in node:sqlite","profile":"docs_code"}}
Search one platform (login platforms use the opencli-first backend chain):
{"action":"search.run","args":{"query":"机械键盘 轴体 推荐","task":"了解知乎上对机械键盘轴体的真实经验","profile":"experience","platform":"zhihu"}}
Read a page with read.fetch (pass offset to continue a long page); ask search.recommend when you do not know which source to use. More in Search and evidence (Chinese).
Tools and actions
Only two tools are resident: web_index({group?, action?, query?}), a progressive-disclosure catalog, and web_call({action, args}), which runs an action and returns a uniform envelope. Usage guidance ships in the skill dsh-web-search-pro.
| Group | Actions | Purpose |
|---|---|---|
search |
run recommend |
Multi-engine / platform search and evidence packs; recommend at most 3 sources for a task |
read |
fetch contents snapshot |
Readable fetch with continuation; Exa batch contents; browser snapshot |
history |
list replay expand export delete |
List, replay, expand evidence blocks, export and delete query history |
sources |
status deps install |
Backend probing and diagnostics; external dependency check and install |
rules |
list upsert remove import export |
Per-site extraction rules |
cache |
clear stats |
Cache cleanup and statistics |
config |
inspect set_order set_confidence upsert_cli remove_cli reset export |
Agent overlay: adjust search order, confidence and custom CLIs at runtime |
Full parameters, approval rules, output budgets and the old tool mapping are in Tools and actions (Chinese).
Common settings
Set them under web-search-pro: in $DSH_HOME/settings.yaml, or use the settings card. Almost all are hot-reloaded.
| Key | Default | Meaning |
|---|---|---|
engines |
[ddg, bing, exa, seam, jina] |
Fallback order of general search |
sources.priority / sources.disabled |
empty | Source ids to move first / never use (for example disabled: [deepseek]) |
searchMaxResults |
8 |
Default number of results of a plain search |
evidence.jevMode |
off |
Bocha Jev scoring: off | shadow | control | hybrid (paid, not called by default) |
evidence.sourcePolicy |
default |
anonymous-only = automatic planning never uses a source that needs a key, account or login |
deepseekFetch |
false |
true = read.fetch may use the DeepSeek Fetch API (billed per request) |
fetchDefaultChars |
20000 |
Default characters returned by read.fetch |
toolSurface |
indexed |
flat = one tool per action (for comparison and debugging only); restart required |
registerProvider |
false |
Route the host's built-in web_search / web_fetch through this plugin; restart required |
Only these need a plugin restart: toolSurface, registerProvider, providerId, timeoutMs, memoryCacheEntries, dbPath, verbose, playwright.snapshotDir. All keys and defaults are in the configuration reference (Chinese).
Documentation
The detailed guides (Chinese) are under docs/:
- Usage: Install and first use · Search and evidence · Tools and actions · History
- Configuration: Configuration reference · Settings panel · Sources and engines · Built-in web tool routing · Jev scoring
- Platforms and CLIs: Platform login · CLI adapters and custom CLIs · External dependencies · Custom platforms · Browser scripts and automation tiers
- Versions and development: Compatibility · CHANGELOG · Development · Design and research notes · Validation records
License
MIT. The routing control plane borrows the backend probing, ordered selection and failure-cooldown ideas of Agent-Reach; the core logic is this project's own TypeScript.
Links
More in this category
Tencent/BrowserSkill#dsh-plugin-browserskill★ 9929
BrowserSkill bridge for controlling visible Chrome and Edge Agent Windows from DeepSeek Harness, with native browser tools, accessibility and VOM observations, screenshots, owned multi-session control, and a live Web UI overlay.
omdsh-dev/dsh-browser#packages/browser/bridge-browser★ 966
Chrome sidebar extension that lets DSH operate your browser directly, no vision capabilities required.
liustack/modsearch★ 911
Web search bridge for text-only agents: ask the web or X, get structured JSON evidence (search, fetch, citations).
DDDMUC/dsh-free-search★ 817
Free, keyless web search for DSH: 7 engines (DuckDuckGo/Bing/SearXNG free + Exa/Perplexity/DeepSeek paid), auto-failover, settings-page UI with API key inputs and official links, web_fetch, and an engine test tool.
Fisfzy/dsh-ego-browser★ 395
Drive a real Chrome/Chromium browser from DeepSeek Harness with 35 structured tools for navigation, snapshots, clicks, forms, JavaScript/CDP, screenshots, downloads and tabs; a live sidebar mirrors the page and accepts mouse and keyboard input. It ships a managed CDP runtime, keeps login state across calls, and can import cookies from your everyday Chrome through a companion extension.
wqty123/dsh-browser★ 162
Shared real browser for DSH: a native Electron window the human can watch and take over, driven by the agent over CDP with 20 browser_* tools (open/snapshot/execute/fill/screenshot/download/auth), per-task session isolation, cookie persistence, CAPTCHA detection; self-hosts on plain dsh web without a desktop shell.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.