qwased
dsh-web-search-duckduckgo
No description
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 13, 2026
- Updated
- Aug 13, 2026
Introduction
dsh-web-search-duckduckgo
English | 中文
Free DuckDuckGo search for the DeepSeek Harness — no API key, no credentials, no per-search cost. This repository publishes the plugin and its installer bundle:
packages/dsh-web-search-duckduckgo/— the plugin source: aWebSearchProvider(idduckduckgo) registered intoctx.web, plus the model-facingweb_search_ddgtool that calls the provider directly.packages/dsh-web-search-duckduckgo-bundle/— the profile bundle: one patch-layer insert (cordis.patch.yml) mounting the plugin into adsh --profilecomposition.dist/— the built, installable tarballs.
Install
Before the packages reach a registry, install from both tarballs — the bundle pulls the plugin tarball as its dependency:
dsh plugin --profile <name> add ./dist/dsh-web-search-duckduckgo.tgz ./dist/dsh-web-search-duckduckgo-bundle.tgz
Once @deepseek-ai/* packages reach a registry, the bundle installs by name:
dsh plugin --profile <name> add @deepseek-ai/dsh-web-search-duckduckgo-bundle
Configuration
All options are optional; a deployment that pins another provider on the web seam (the shipped searchProvider: deepseek-official) can offer this free route side by side and let the model pick per turn.
| Key | Default | Meaning |
|---|---|---|
proxy | (unset) | host:port or http://host:port CONNECT proxy for endpoints a direct connection cannot reach. Unset = direct; a failing tunnel falls back to a direct fetch. |
region | us-en | Region code for the HTML form's l field (e.g. us-en, uk-en, de-de). |
baseURL | https://html.duckduckgo.com/html/ | HTML search endpoint, searched with a POST q/b/l form. |
fallbackBaseURL | https://api.duckduckgo.com/ | Instant Answer JSON endpoint used when HTML yields no sources. |
userAgent | browser UA | User-Agent header sent on every request. |
timeoutMs | 30000 | Per-request timeout budget in ms. |
maxResults | 8 | Source cap when a request carries no maxResults. |
Configure through the web-search-duckduckgo settings namespace or a composition overlay:
- id: web-search-duckduckgo
name: '@deepseek-ai/dsh-web-search-duckduckgo'
config:
proxy: http://127.0.0.1:7890
How it works
The HTML search POSTs a q/b/l form (query, bang placeholder, region) to html.duckduckgo.com/html/, so result__a hrefs come back as direct links instead of the advertising uddg wrapper a GET returns. Results are parsed from the current results_links layout, normalized (Unicode NFC, control characters removed), and y.js advertising trackers are dropped. When HTML yields no sources, the Instant Answer JSON endpoint is the fallback. An optional zero-dependency CONNECT tunnel (node:net + node:tls) reaches endpoints a direct connection cannot.
Build from source
The packages build inside the DeepSeek Harness pnpm workspace (packages/web/web-search-duckduckgo, packages/bundle/web-search-duckduckgo); workspace-scoped @deepseek-ai/* dependencies resolve from that workspace or the published @deepseek-ai packages. To rebuild the tarballs:
# plugin
pnpm --filter @deepseek-ai/dsh-web-search-duckduckgo pack --out dist/dsh-web-search-duckduckgo.tgz
# bundle
pnpm --filter @deepseek-ai/dsh-web-search-duckduckgo-bundle pack --out dist/dsh-web-search-duckduckgo-bundle.tgz
License
MIT