dsh-search-picker
DiscoveredSidebar search-provider picker for DeepSeek Harness (DSH): switch ctx.web between DeepSeek Messages, DeepSeek Search API, OpenCode Go, Tavily and Exa.
dsh-search-picker
English | 中文
A DeepSeek Harness (DSH) bundle plugin that puts a “Search: …” button at the
bottom of the desktop sidebar (right above the Settings row) and switches
ctx.web's search backend with one click.
The picker writes the official web settings namespace's searchProvider
field — the exact same field edited by Plugins › Web search in the DSH
settings UI. Therefore:
- switches take effect immediately, no restart;
- the choice survives restarts (persisted in the host settings document);
- it never fights the official settings page — both edit the same field.
Engines
| id | Engine | Credential | Notes |
|---|---|---|---|
deepseek-official | DeepSeek official Messages | DEEPSEEK_API_KEY | Built in. Anthropic Messages + web_search_20250305; each search consumes model tokens |
deepseek-search-api | DeepSeek official Search API | DEEPSEEK_API_KEY | Built in. Direct retrieval endpoint; no model tokens |
opencode-go | OpenCode Go | OPENCODE_GO_API_KEY | Provided by this plugin. Anthropic Messages + x-opencode-session header; ≈ $0.01 per search |
tavily | Tavily | TAVILY_API_KEY | Provided by this plugin; greyed out until a key is configured |
exa | Exa | EXA_API_KEY | Provided by this plugin; greyed out until a key is configured |
Engines without credentials are greyed out in the menu. Selecting an
unregistered/unavailable provider directly in the settings page makes
web_search return an explicit WEB_PROVIDER_* error instead of silently
falling back to another engine.
UI

The button sits at the bottom of the sidebar, right above the Settings row. The
menu is a position: fixed popover: its width follows the sidebar content width
(sidebar defaults to 280 px, draggable 264–420 px → menu 240–396 px) and updates
live while dragging, so it is never clipped by the sidebar column's
overflow: hidden. When the sidebar collapses to the 56 px icon rail, the menu
pops out at 280 px to the right.
The menu background is opaque: white in the light theme, dark grey in the dark
theme (--dsw-alias-bg-layer-1, theme-aware), with the official popover
hairline stroke and soft elevation shadow (--dsw-elevation-panel). The
official menu material (--dsw-specific-menu + backdrop-filter blur) is
intentionally not used: that surface is only 58 % opaque and relies on the blur
to look right, so without the blur the sidebar text bleeds through.
Install (desktop profile)
-
Clone the repo to a fixed location:
git clone https://github.com/xiaoxiaosrm/dsh-search-picker.git D:\tools\dsh-search-picker -
Edit
%DSH_HOME%\profiles\desktop\package.json(POSIX:$DSH_HOME/profiles/desktop/package.json):- add the dependency
"dsh-search-picker": "file:D:/tools/dsh-search-picker"; - append
"dsh-search-picker"todsh.profile.bundles.
- add the dependency
-
In
%DSH_HOME%\profiles\desktop, runpnpm install. -
Fully quit and reopen the DSH desktop app. The loader scans profile bundles only at startup, and the client half is read into memory at startup too — so a page refresh is not enough after updating the plugin.
If the file: dependency fails to resolve, copy this directory into
%DSH_HOME%\profiles\desktop\node_modules\dsh-search-picker and add the package
name to dsh.profile.bundles instead.
Configuration
The bundle ships a default patch entry (cordis.patch.yml). Every field is
optional; omitted fields fall back to the defaults below.
- insert:
- id: search-picker
name: dsh-search-picker
config:
opencodeGo:
baseURL: https://opencode.ai/inference/go/anthropic/v1
model: deepseek-v4.1-flash
maxTokens: 4096
maxUses: 5
tavily:
baseURL: https://api.tavily.com
apiKeyEnv: TAVILY_API_KEY
exa:
baseURL: https://api.exa.ai
apiKeyEnv: EXA_API_KEY
Override any value by targeting the same entry id from your profile's
cordis.patch.yml.
Credentials
This plugin never reads or writes the credentials file directly. At search time
it resolves the credential reference named by apiKeyEnv through
ctx.credentials, falling back to the process environment. A missing credential
raises WEB_PROVIDER_CREDENTIAL_MISSING, and the message names the referenced
variable.
Fallback
- Switch back to
deepseek-officialin the menu (or use the official Plugins › Web search page). - Remove
dsh-search-pickerfrom the profilepackage.jsondependencies and fromdsh.profile.bundles, runpnpm install, restart the desktop app.
Troubleshooting
deepseek-officialreturns 404: check that neither the profile patch nor another plugin overridesweb-search-deepseek.baseURL. It must stay on the built-in default (https://api.deepseek.com/anthropic/v1); pointing it at a search provider's host breaks the provider.- Menu width does not follow the sidebar: the popover measures its anchor
with
ResizeObserver; after profile/bundle changes, restart the desktop app to reload the client bundle.
Testing
npm run check # node --check on all three entry files
npm test # node --test test/engines.test.mjs
node test/engines.test.mjs # single-process fallback
The single-process fallback exists for Windows sandboxes that block
child-process pipes (spawn EPERM).
Known limitations
- The engine list in the menu is fixed. If the official providers'
apiKeyEnvis remapped to another credential name, the greyed-out state still checks the default reference name. - Conflicts with plugins that take over
web.searchProviderat runtime (dsh-free-search,dsh-web-search-free, …). Do not install them together. opencode-go'sx-opencode-sessionuses a random in-process UUID when the current session id is unavailable (the Go relay only needs it to be opaque and stable).
Compatibility
- DSH desktop
0.2.1-rc.2(declared inpackage.json→dsh.compatibility). - Client half targets the
webplatform and injects@deepseek-ai/dsh-api-remotes,@deepseek-ai/dsh-client-locale,@deepseek-ai/dsh-client-ui-settings.
License
MIT © 2026 xiaoxiaosrm
Comments
Loading…
Similar plugins
by abcdream-Lary
DeepSeek Harness (DSH) 的多提供商网页搜索和页面获取插件:AnySearch、Bing、DuckDuckGo、Tavily、Exa
★ 2
↓ 35/wk
MIT
JavaScript
Aug 22, 2026
dsh plugin --profile web add dshsearch-multiby X-C1811
Tavily web-search provider for DeepSeek Harness (ctx.web). Keyless or API-key modes with a configurable UI card; provider framework designed to be extended to more search APIs.
★ 4
↓ 191/wk
MIT
JavaScript
Oct 20, 2026
dsh plugin --profile web add dsh-web-search-pluginby Yurzi
Multi-protocol web_search provider for DeepSeek Harness
★ 4
↓ 409/wk
MIT
TypeScript
Sep 30, 2026
dsh plugin --profile web add dsh-web-search-enhancedby Anixuil
Replace DSH's built-in DeepSeek search with SearXNG / Tavily / Exa / Brave / Serper / Bing / Google CSE. web_search keeps its name and schema.
★ 0
MIT
JavaScript
Oct 16, 2026
dsh plugin --profile web add dsh-custom-searchby fno2010
Multi-backend web_search provider for DeepSeek Harness (DSH): Exa + Firecrawl with automatic failover, key-free capable
★ 3
↓ 141/wk
MIT
JavaScript
Sep 11, 2026
dsh plugin --profile web add @fno2010/dsh-web-search-extby rogerdigital
DeepSeek Harness (dsh) plugin that adds a SearXNG-backed web_search provider to the ctx.web seam — free, self-hosted, key-less search instead of paid Exa/Perplexity APIs.
★ 11
↓ 281/wk
MIT
TypeScript
Sep 21, 2026
dsh plugin --profile web add dsh-searxng