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.19 or >=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_search tool 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: 1 in 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 week to month).
    • 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.

Plugin directory: SkillHub
GitHub repository: ForeverYoungPp/dsh-web-search