Introduction

DeepSeek Harness (DSH) adopts the “everything is a plugin” ecosystem philosophy. When deploying locally or developing intelligent agents, web search capabilities often require integrating multiple third-party APIs. Manually managing multiple data sources, key rotation, and fallback logic is not only cumbersome but also error-prone. um-dsh-websearch is a plugin maintained by UnforgetMemory, designed to encapsulate Exa, Parallel, and DeepSeek official data sources through a unified policy layer, providing a complete solution from configuration to runtime.

Core Features

The plugin implements flexible and secure search configuration through a policy layer and gating mechanisms:

  • Multi-provider policy layer: Supports Exa, Parallel, and DeepSeek official data sources. Priority is defined by array order, with automatic fallback when the primary source fails.
  • Paid / Free dual tiers + gated fallback: Each data source includes two tiers: REST (paid) and anonymous MCP (free). Independently controlled directional switches forcibly disable cross-tier fallback logic.
  • Multi-key policy: Multiple credentials can be attached to each data source, supporting sequential polling or random shuffle strategies.
  • Concurrent fan-out: When concurrency is greater than 1, requests are sent simultaneously to all enabled sources, and results are deduplicated by URL and merged.
  • Optimistic cache: Built-in in-memory result cache with configurable TTL (1–86400 seconds).
  • Credential security: Isolated using the UM_WS_ namespace; keys are stored only as references and not written to disk in plaintext.
  • Official primitives settings card: Reuses the DSH official settings form and supports inline editing of the global toggle, default source, concurrency, and cache settings.

Installation and Enablement

Use pnpm to install the plugin in the web profile:

pnpm exec dsh plugin --profile web add github:UnforgetMemory/um-dsh-websearch

After installation, DSH needs to be restarted. Go to Settings → Plugins → UM Web Search and turn on the enabled switch. During installation, the plugin automatically takes over the default search (via dsh bundle and cordis.patch), and during uninstallation, it automatically falls back to the original default deployment backend.

Typical Usage

In the settings card, you can control overall behavior through inline configuration:
1. Global toggle and default source: Set enabled to control activation, and defaultProvider to determine the starting point of the ordered chain.
2. Concurrency mode: Set concurrency to 1 for sequential fallback; set it to 2–8 for concurrent fan-out to all enabled sources.
3. Credential configuration: Add key references for each provider in “Detailed Configuration.” Key values are written through the official credential interface and are not directly exposed in configuration files.

Applicable Scenarios and Notes

  • Version requirements: DeepSeek Harness version must be >= 0.2.0-rc.1 and < 0.3.0; Node.js version must be >= 20.
  • DeepSeek official source limitations: The DeepSeek official free tier is disabled by default, and only the paid REST tier is supported.
  • Migration note: If you previously manually inserted an id: web-search-exa configuration line according to the old README, you must first remove that line from the profile’s cordis.patch.yml; otherwise, duplicate loading will cause conflicts.
  • License: MIT license.

Short Conclusion

um-dsh-websearch reduces the maintenance cost of multi-source search through policy-layer encapsulation and native UI, making it suitable for DSH users who need flexible switching or load balancing. For more details and source code, refer to its GitHub repository.