dsh-plugin-duckduckgo-search
Verifieddsh-plugin-duckduckgo-search Β· v0.1.0 Β· MIT
Keyless DuckDuckGo search provider for DeepSeek Harness: the built-in web_search works with no API key and no infrastructure (HTML/Lite endpoints, parsing, result dedup)
Install
dsh plugin add dsh-plugin-duckduckgo-search Confirm the layer applied with dsh --profile default --dump-config β see the install guide.
Source
Tags
Creators
Readme
dsh-plugin-duckduckgo-search β keyless DuckDuckGo search for DeepSeek Harness
Registers a DuckDuckGo-backed search provider into the harness web
capability seam (ctx.web) so the built-in web_search tool works with no
API key and no infrastructure: the plugin queries DuckDuckGo's public HTML
and Lite result pages and parses them β the same approach battle-tested
scraping clients use.
Pairs with @local/dsh-web-search-searxng: DuckDuckGo needs nothing
running (best default), while a self-hosted SearXNG stays the sturdier
choice for automation-heavy use. Switch between them by editing one line in
the profile patch.
How it fits
Implements the standard provider face (id, cheap available(),
search(request, signal) β { sources[], truncated }):
- two endpoint kinds: the
htmlpage (form POST) and thelitepage (GET);endpoint: "auto"tries html first and falls through to lite on failure or an empty parse; - titles/snippets are tag-stripped and entity-decoded;
/l/?uddg=β¦redirect wrappers are unwrapped back to target URLs; results dedupe in rank order; - query options ride the wire:
klregion,kpsafesearch (0/1/2β-2/-1/1),dfrecency (day/month/year); - the request's own
maxResultsand the configured cap are both honored; cancellation surfaces as the seam's stableWEB_ABORTED.
Caveat kept honest: this reads a rendered page, not a contract API. From a
desktop IP it is dependable; if DuckDuckGo throttles or reshapes, failures
surface as WEB_PROVIDER_ERROR with the endpoint named β switch to SearXNG
for those workloads.
Install
DSH Desktop: Settings β Plugins β add plugin, type the package name. From the
CLI: dsh plugin --profile <your-profile> add <name>, then restart the harness.
name: dsh-plugin-duckduckgo-search
Config
| Field | Default | Meaning |
|---|---|---|
endpoint |
auto |
auto / html / lite |
language |
"" |
DDG region, e.g. ru-ru, en-us; empty = all |
safesearch |
1 |
0 off Β· 1 moderate Β· 2 strict |
timeRange |
"" |
day / month / year; empty = any |
maxResults |
20 |
Provider-side source cap |
requestTimeoutMs |
15000 |
Per-request backstop timer |
userAgent |
Chrome-like UA string | DuckDuckGo throttles generic clients harder |
acceptLanguage |
"" |
e.g. ru,en |
Editable live from the harness settings UI under the web-search-duckduckgo
namespace; each search snapshots the current section.
Checks
node test/smoke.mjs # helpers, parsing, auto-fallback, caps, failures, abort
(The test symlinks node_modules at the profile tree when present so the
plugin's @deepseek-ai/* imports resolve outside the installed location.)