Introduction

DeepSeek Harness (dsh) built-in search provider relies on the DeepSeek official API key (DEEPSEEK_API_KEY). Without a key, or when using an OpenAI-compatible gateway like opencode-go that doesn’t support the web_search tool, the agent often directly reports “unable to connect to the internet.” If you want low-cost, switchable online search capabilities within dsh, you need an alternative solution registered into the ctx.web seam.

Here we introduce the community plugin dsh-free-search (maintainer DDDMUC, SkillHub category: Internet Tool). It implements the official WebSearchProvider interface, features multiple engines with unified fallback, and defaults to free Bing search, ready to use out of the box without requiring an API key.

What This Is

dsh-free-search is a plugin that adds a multi-engine search provider to DeepSeek Harness. It registers tools like web_search into dsh and provides a web settings page, chat box shortcuts, and YAML configuration for switching engines, filling in paid engine keys, testing connectivity, and adjusting caching.

  • Maintainer: DDDMUC
  • Current version: v0.4.12 (MIT License)
  • GitHub: 51 stars, 3 forks
  • Directory page: https://www.skillhub.cn/plugins/DDDMUC/dsh-free-search
  • Source code: https://github.com/DDDMUC/dsh-free-search

Core Features

Multi-engine and Automatic Fallback

The plugin includes 10 search engines, both free and paid. The default engine is bing (free, Chinese market zh-CN).

ID Engine Cost Description
ddg DuckDuckGo HTML Free Occasionally rate-limited, automatically recovers after unblocking
ddg-lite DuckDuckGo Lite Free Lightweight version
bing Bing Free Default engine, relatively stable
anysearch AnySearch AI Free Anonymous public quota
searxng SearXNG Free Supports custom instances
exa Exa Free Can use MCP anonymously without key; configuration increases quota
tavily Tavily Free Can use keyless anonymous mode without key
keenable Keenable Free Can use MCP anonymously without key
perplexity Perplexity Paid Requires PERPLEXITY_API_KEY
deepseek-official DeepSeek Official Paid Requires DEEPSEEK_API_KEY

When any engine fails (missing key, 401, rate limiting, network error), the plugin cycles through the next engine in the unified fallback chain and notes the actually effective engine at the top of the results, e.g., Note: perplexity unavailable or failed, using exa. Search won’t be directly interrupted by a single engine failure.

Web Settings and Quick Switching

After installation, find the Free Search card in Settings → Plugins → Configurable:

  • Dropdown to switch Search engine, takes effect upon saving
  • Fill in API keys for Exa / Tavily / Keenable / Perplexity / DeepSeek (after saving, the interface only shows “Configured”)
  • Test engine directly tests the current engine (bypasses fallback chain)
  • Use Bing default one-click switch back to Bing
  • Check to enable platform search for GitHub / V2EX / Bilibili, etc.
  • Supports Chinese and English interface switching

Input /free-search-engine in the chat box to bring up the engine selection window; click to switch, equivalent to saving on the settings page. The settings page also displays the current version and provides a “Check for updates” button to compare with the npm registry.

Tool Capabilities

Besides the standard web_search, the plugin also provides:

  • advanced_search: Time-filtered search with timeRange. Supports fixed intervals (day / week / month / year), relative values (e.g., 3d, 12h), and absolute dates (e.g., 2026-07-01). With time filtering, engines supporting this parameter are prioritized at the front of the fallback chain.
  • free_search_test: Tests all engines individually and reports availability.
  • web_fetch: Fetches webpage content (based on the official dsh-web-fetch-http provider). Note: This tool lacks SSRF protection; the agent theoretically can access internal network addresses.
  • platform_search: Searches platforms like GitHub, V2EX, Bilibili, Reddit, Hacker News, Stack Overflow, Wikipedia, npm, etc. (public APIs, zero dependencies).

Identical queries (including engine and time filter parameters) are cached for 5 minutes by default (LRU 50 items), configurable from 0–5 minutes on the settings page, with 0 disabling caching.

Installation and Enablement

The plugin requires Node.js >= 20. It uses peerDependencies for @deepseek-ai/dsh-settings and @deepseek-ai/dsh-tools and must be installed via dsh plugin. Do not copy DSH core packages into the profile’s local node_modules, as this may cause the tool scheduler to fail.

First, clone, then add to the web profile:

git clone https://github.com/DDDMUC/dsh-free-search.git
dsh plugin --profile web add /path/to/dsh-free-search

Then restart dsh web:

dsh web

Typical Usage

Open the Free Search card via the path mentioned above, select an engine, and save. Free engines display a green FREE badge, while paid engines show an orange API KEY badge with a link to obtain the key.

Configuration File

Configuration is written to ~/.dsh/settings.yaml:

free-search:
  provider: bing              # ddg / ddg-lite / bing / searxng / anysearch / exa / tavily / keenable / perplexity / deepseek-official
  lang: zh                    # Settings page interface language (zh / en)
  bingMarket: zh-CN           # Bing market
  region: cn-zh               # DuckDuckGo region (optional)
  searxngInstances:           # Custom SearXNG instances (optional)
    - https://your-instance.example
  exaApiKey: ...
  tavilyApiKey: ...
  keenableApiKey: ...
  perplexityApiKey: ...
  deepseekApiKey: ...

Letting the Agent Test Engines

Tell the agent “test all search engines,” and it will call free_search_test, outputting something like:

Search engine test:
- ddg: FAIL - DuckDuckGo is rate-limited right now (anti-bot challenge, usually temporary) - Bing works
- bing: OK (2 results, e.g. "DeepSeek Harness developer preview...")
- exa: FAIL - EXA_API_KEY not configured

For example, “help me search for news about DSH in the last 3 days,” the agent will call advanced_search with timeRange: "3d". Exa and Keenable support more precise time parameters; Tavily, SearXNG, and DuckDuckGo map custom days to the nearest fixed interval; Bing and AnySearch ignore time filtering.

Platform Search and Web Fetching

  • “Search for deepseek harness on GitHub” → platform_search
  • After finding a URL, say “open the first link to see the content” → web_fetch

Use Cases and Notes

Who It’s For:

  • Those without a DeepSeek official key but still want dsh agent to perform online searches
  • Users of third-party gateways that don’t support web_search and need an independent search provider
  • Those needing to switch between free engines like Bing, DuckDuckGo, SearXNG, or configure keys for Exa / Tavily to increase quotas
  • Those needing to filter results by time range or perform targeted searches on platforms like GitHub and V2EX

Before Use, Please Note:

  • The plugin runs with the permissions of the current dsh process; before installation, you should review the source code and MIT license to confirm you accept its behavior (including web_fetch lacking SSRF protection).
  • Free engines may encounter rate limiting or anti-scraping; the plugin mitigates this through multi-engine fallback but cannot guarantee the primary engine is always available.
  • SkillHub is an independent community directory, not officially affiliated with DeepSeek / High-Flyer; plugins and official dsh plugins can coexist, all implementing the same seam interface.

Conclusion

dsh-free-search expands dsh’s online search from “must have a DeepSeek official key” to “multiple engines optional, automatic failure fallback, usable even without a key.” If you’re stuck on the online connectivity step while setting up your dsh environment, you can first install this plugin, use the default Bing engine to get it running, and then switch or add paid keys as needed.

  • Directory page: https://www.skillhub.cn/plugins/DDDMUC/dsh-free-search
  • GitHub: https://github.com/DDDMUC/dsh-free-search