Overview¶
The native web_search tool in DeepSeek Harness (DSH) is usually bound to a specific search backend. Changing the provider, or configuring multiple providers for a single call with sequential fallback, can be cumbersome by directly modifying the configuration. The dsh-search-router plugin solves this by registering a native WebSearchProvider with ctx.web, forwarding each web_search call to the user-selected search backend, and supporting a sequential fallback mechanism.
About the Plugin¶
This is a very small DeepSeek Harness (DSH) plugin. It registers a native WebSearchProvider with ctx.web, forwards each web_search call to the user-selected search backend, and supports sequential fallback (trying the next provider when one fails). The model still sees the same web_search tool; no new tools, MCP, reranking, or caching is introduced.
Maintainer: XGrin
License: MIT
Stars: 1
Category: Model Inference
Core Features¶
- Multi-backend support: Supports search backends such as Exa, Tavily, Brave, Perplexity, DeepSeek, SearXNG, and DuckDuckGo.
- Sequential fallback: Supports configurable sequential fallback, automatically trying the next provider when the primary provider fails.
- No added dependencies: Does not introduce new tools, MCP, reranking, or caching.
- Visual configuration: Provides GUI support for drag-and-drop reordering and configuration.
Installation and Enabling¶
Install the plugin via the official CLI:
dsh plugin --profile web add github:XGrin/dsh-search-router
After installation, start the web interface:
dsh web
To uninstall, run:
dsh plugin --profile web remove dsh-search-router
Configuration¶
The plugin provides two configuration methods, both operating on the same set of configuration items. Settings in the GUI override environment variables, while resetting in the GUI inherits the values from the Composition configuration.
1. Configure in the GUI¶
Go to Settings -> Plugins -> Plugin Configuration and find the “Search router” card.
- Each row represents an active provider, numbered by fallback priority.
- Rows can be dragged to reorder (keyboard reordering is also supported).
- Each provider provides an inline editor for adding or modifying configuration.
- API keys entered here are persisted and override environment variables.
- Every change is applied in real time without requiring a restart.
2. Configure in the Composition¶
Edit the profiles/web/cordis.patch.yml file. The plugin automatically detects each provider that has an API key or endpoint; the default order is: exa → tavily → brave → perplexity → deepseek → searxng → duckduckgo.
Example 1: Tavily as primary, falling back to a self-hosted SearXNG
- id: search-router
config:
order: [tavily, searxng]
providers:
tavily: { apiKeyEnv: TAVILY_API_KEY }
searxng: { baseUrl: https://search.example.com }
Example 2: SearXNG only, with no commercial keys required
- id: search-router
config:
provider: searxng
providers:
searxng: { baseUrl: http://127.0.0.1:8888 }
Notes¶
- SearXNG format requirement: If using a self-hosted SearXNG, enable the
jsonoutput format (search.formats) in SearXNG’ssettings.yml. - DuckDuckGo requires no key: No API key is required when using DuckDuckGo; it works out of the box.
- Key priority: An API key set in the GUI overrides environment variables. If the key is cleared in the GUI, it falls back to reading environment variables.
- Priority inheritance: Clicking reset in the GUI restores the values defined in the Composition configuration.
Summary¶
dsh-search-router gives DSH the ability to flexibly switch between and combine search backends. Through sequential fallback, it improves the availability of search calls. The plugin design is restrained and does not introduce extra tools, making it suitable for developers who need fine-grained control over the search pipeline.
- GitHub repository: https://github.com/XGrin/dsh-search-router
- Plugin directory: https://www.skillhub.cn/plugins/XGrin/dsh-search-router