DeepSeek Harness Plugin

anweat/dsh-web-search-pro

Stars ★ 83 Downloads (30d) 6,000 Category Browser & Web Added 2026-08-14 npm dsh-web-search-pro

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.run a 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) then web_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_call with sources.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_KEY the default search leads with DeepSeek Search, which is billed per request; put deepseek under sources.disabled to 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 credential DEEPSEEK_API_KEY, or the process environment); put deepseek under sources.disabled or write your own engines list 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/opencli plus 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 by sources.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/:

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.

Content from the project README on GitHub ↗

Links

More in this category

View the whole category →

Community comments

Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.