Introduction¶
DeepSeek Harness (DSH) uses a plugin-based architecture. The native web_search tool has relatively fixed functionality when handling complex queries or specific requirements. The dsh-web-search plugin is designed to replace this native backend by introducing a configurable multi-provider fallback chain, enhancing the flexibility and reliability of search.
Plugin Positioning¶
This plugin is maintained by ForeverYoungPp and provides multi-provider web search capabilities for DSH. It redirects DSH’s native web_search tool to a fallback chain composed of eight search services, supporting on-demand configuration and sequential attempts.
Installation and Activation¶
Before installing, ensure your environment meets the following dependency requirements:
- Node.js version:
^22.19or>=24 - DeepSeek Harness version:
0.2.0-rc.2
Use the following command to install the plugin (this command activates the --profile web configuration profile):
dsh plugin --profile web add @ian_p/dsh-web-search
After installation, you must restart the DSH process to load the new plugin.
Core Features¶
The plugin integrates eight search providers and works through a fallback chain mechanism. It includes the following characteristics:
- Multi-provider support: Supports Tavily, Brave, Exa, Firecrawl, Jina, Kagi, SearXNG, and DuckDuckGo.
- Native tool replacement: Directly replaces DSH’s native
web_searchtool without requiring changes to calling code. - Fail-loud mechanism: If all providers in the fallback chain fail, it reports a clear error instead of silently degrading.
- Host-native UI: Provides a localized settings page that uses the host’s design tokens and supports drag-and-drop reordering.
- Auditable logs: Logs record every skipped or failed provider, as well as the final successful service.
Configuration and Usage¶
Plugin configuration and credentials are managed through DSH’s credential records and do not depend on environment variables.
Configuring Providers¶
In the settings page, you can add API keys for API-key-based providers (such as Tavily, Brave, Exa, Firecrawl, Jina, and Kagi), or configure an instance endpoint for SearXNG. DuckDuckGo does not require a key and serves as the final fallback option.
Adjusting the Fallback Order¶
Use the drag-and-drop feature on the settings page to customize the order in which providers are attempted. The configuration is stored in the dsh-web-search/config credential record.
Search Behavior¶
The search process is sequential rather than parallel racing:
1. Check the availability of the current provider (a local check, with no network call).
2. Issue the search request (default timeout: 60 seconds).
3. If successful (non-empty results are returned), return the results immediately and stop trying subsequent providers.
4. If it fails (HTTP error, invalid JSON, etc.), log the error and try the next provider.
Note: The plugin does not implement racing, result merging, retries, or caching.
Caveats¶
- Permissions and security: The plugin runs as part of the DSH process. Ensure it is installed from a trusted source and inspect the source code.
- License: This project is open-sourced under the MIT License.
- Provider-specific details:
- Tavily: Set
chunks_per_source: 1in the configuration to obtain page snippets rather than full-page content. - SearXNG: An instance endpoint must be configured, and its time-unit mapping may need adjustment (for example, mapping
weektomonth). - DuckDuckGo: It does not use an API key, but it parses the HTML front end and may encounter bot verification pages that result in no results.
- Tavily: Set
Plugin directory: SkillHub
GitHub repository: ForeverYoungPp/dsh-web-search