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

  1. Multi-backend support: Supports search backends such as Exa, Tavily, Brave, Perplexity, DeepSeek, SearXNG, and DuckDuckGo.
  2. Sequential fallback: Supports configurable sequential fallback, automatically trying the next provider when the primary provider fails.
  3. No added dependencies: Does not introduce new tools, MCP, reranking, or caching.
  4. 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

  1. SearXNG format requirement: If using a self-hosted SearXNG, enable the json output format (search.formats) in SearXNG’s settings.yml.
  2. DuckDuckGo requires no key: No API key is required when using DuckDuckGo; it works out of the box.
  3. 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.
  4. 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