chendefine/dsh-web-search-aggregation ↗★ 3
dsh-web-search-aggregation
聚合多个搜索引擎并支持多密钥和备用轮询 适合需要整合多个搜索API并实现自动降级检索的用户。
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:chendefine/dsh-web-search-aggregation说明文档
阅读完整 README ↗Configuration
The Plugins page (侧边栏 → 插件) opens the form one click from the list: the dsh-web-search-aggregation card's 查看 lands on the package page with the full form between its description and its rows; the row's own 配置 control opens the same form under the plugin's title. It edits the web-search-aggregation settings section — derived from the plugin entry's Config schema — live:

| Field | Default | Description |
|---|---|---|
providers | nine enabled entries — one per kind | The prioritized queue. Each entry: provider kind (each kind at most once), enabled toggle (a disabled entry stays configured but is skipped), and an optional endpoint base URL overriding the adapter's default. The shipped order carries no meaning; arrange it however you like. |
attemptTimeoutMs | 10000 | Per-attempt deadline in ms (1000–60000). One attempt is cut off after this long and the queue moves to the next key or entry. |
API keys are managed on each entry as masked tags: add one key at a time (+ or Enter), reorder by dragging tags off/on — tag order is the order a save writes and the runtime reads. Stored keys are never read back; a save replaces the whole pool, and closing every tag before saving clears the credential. Each provider's keys live in one fixed credential:
| Credential | Provider | Required | Value format |
|---|---|---|---|
ANYSEARCH_API_KEY | AnySearch | no — anonymous access works | one key bare, or several joined by , |
TAVILY_API_KEY | Tavily | yes, for the entry to serve | same pool format |
TINYFISH_API_KEY | TinyFish | yes, for the entry to serve | same pool format |
BRAVE_SEARCH_API_KEY | Brave Search | yes, for the entry to serve | same pool format |
EXA_API_KEY | Exa | yes, for the entry to serve | same pool format |
FIRECRAWL_API_KEY | Firecrawl | yes, for the entry to serve | same pool format |
JINA_API_KEY | Jina Search | yes — the Search API rejects anonymous calls | same pool format |
SERPAPI_API_KEY | SerpApi | yes — the API rejects keyless calls | same pool format (64-hex keys, no prefix) |
SERPER_API_KEY | Serper | yes — the API rejects keyless calls (403) | same pool format (keys carry no prefix) |
Combining with other provider plugins
A bundle patch replaces the web seam row's whole config, so the layer applied last determines the final searchProvider / fetchProvider pair. This plugin's patch states only searchProvider: aggregated — it owns the search selection and nothing else. Two consequences:
-
With
dsh-web-fetch-playwrightinstalled before this plugin (or without it entirely), nothing needs adjusting: an unconfiguredfetchProviderresolves to the single registered fetch provider automatically. -
If another plugin's layer is applied after this one and resets
searchProvider, pin the combined selection in your profile's ownprofiles/web/cordis.patch.yml— the user layer wins over every bundle layer:- id: web config: searchProvider: aggregated fetchProvider: playwright