Skip to main content

dsh-free-search

35Stars4Forks0Issues0Watchers

For DeepSeek Harness: 10 web search engines with no API key required, featuring built-in time filtering, platform search, and web settings interface.

Evidence5/5methodologySourceInstallMaintenanceDSH versionSecurity scan
Machine-auditedInstall commandRepo verifieddsh-plugin topicLicenseREADMEAI wiki
Language
JavaScript
License
MIT
Branch
master
bingdeepseek-harnessdshdsh-pluginduckduckgoweb-search

Install

cmdweb profile
$ dsh plugin --profile web add dsh-free-search

Run the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial

Install via your agent

Install the DeepSeek Harness plugin DDDMUC/dsh-free-search for me: review the repository at https://github.com/DDDMUC/dsh-free-search first, then run the install command and verify the plugin loads successfully.

Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.

One-line Description

Provides 10 switchable web search engines for DeepSeek Harness, defaulting to free Bing, enabling agents to search the web without any API key, with time filtering, platform search, and a web settings interface.

Core Features

  • Provides 10 web search engines (ddg / ddg-lite / bing / searxng / anysearch / exa / tavily / keenable / perplexity / deepseek-official), default bing works out of the box
  • Automatic engine fallback: any engine error (missing key, 401, rate limit, network issue) automatically tries the next one in rotation, search never fails directly, and the actual active engine is noted at the top of results
  • Web settings page + chat /free-search-engine command to switch engines, configure API keys, test connectivity, toggle between Chinese and English UI
  • Time-filtering enabled advanced_search tool, supports "last N days/hours/months" or "after a certain date"
  • Platform search platform_search tool, retrieves public APIs by GitHub / V2EX / Bilibili / Reddit
  • Result caching (LRU 50 entries, TTL 0-5 minutes configurable), prevents rate limiting on free engines and saves paid quota

Technical Implementation

  • Language: JavaScript (ESM)
  • Key Dependencies: @deepseek-ai/dsh-settings (configuration access and bridging), @deepseek-ai/dsh-tools (agent tool registration), @deepseek-ai/schemastery (configuration schema validation)
  • Architecture Pattern: Implements the official WebSearchProvider interface (id / available / search), uses cordis.patch.yml to simultaneously inject the web-search-free sub-plugin and redirect the host's web.searchProvider to this plugin's ddg provider, causing DSH's built-in web_search tool to automatically use this plugin's multi-engine logic; host-side + client-side dual packages (lib/index.js + lib/client.js)
  • Entry Files: lib/index.js (host-side, registers provider/tools/settings panel bridging), lib/client.js (browser-side React settings card + popup command)

Use Cases

Use this plugin when you don't have or don't want a DeepSeek official API key but need agents to search the web, such as daily Q&A, information lookup, fetching web page content; or when your OpenAI-compatible gateway doesn't support the web_search tool, this plugin directly takes over search via the host-side implementation. Regular users' needs like searching "recent week's XX news", "finding repositories on GitHub", "reading this link's content" can all be directly covered.

Prerequisites and Compatibility

DependencyMin VersionDescription
DSH (@deepseek-ai/dsh-settings, @deepseek-ai/dsh-tools)>= 0.1.0-rc.6peerDependencies, must share the same installation with the host
Node>= 20engines.node
PlatformCross-platformNo native modules, pure JS + Node fetch
Native ModulesNoneOnly depends on schemastery for configuration validation

Note: @deepseek-ai/dsh-settings and @deepseek-ai/dsh-tools are intentionally declared as peerDependencies; DSH runtime must use the single instance in the installation tree. Please install via dsh plugin --profile <profile> add ..., do not copy the DSH core package to the profile's local node_modules; duplicate copies will break the tool scheduler.

Installation

dsh plugin --profile web add github:DDDMUC/dsh-free-search

Restart dsh web after installation to take effect.

Configuration Options

Configuration is saved under the free-search namespace in ~/.dsh/settings.yaml, or can be filled in via the web settings page (key fields only display "configured" in the UI, not echoed in plain text).

ConfigTypeDescriptionDefault
providerStringPreferred search engine, options: bing / ddg / ddg-lite / searxng / anysearch / exa / tavily / keenable / perplexity / deepseek-officialbing
cacheBooleanEnable single query result caching (prevents rate limiting, saves quota)true
cacheTtlNumberCache duration (minutes), range 0-5, 0 disables caching5
langStringSettings page UI language (zh / en)zh
regionStringDuckDuckGo region (e.g., cn-zh)Not set
bingMarketStringBing market codezh-CN
searxngInstancesString ArrayCustom SearXNG instance address list, takes precedence over built-in instancesNot set
platformsString ArrayEnabled platform search list (github / v2ex / bilibili / reddit)[github, v2ex, bilibili, reddit]
exaApiKeyString (secret)Exa engine API key; if not filled, uses MCP anonymous quotaNot set
tavilyApiKeyString (secret)Tavily engine API key; if not filled, uses keyless anonymous quotaNot set
keenableApiKeyString (secret)Keenable engine API key; if not filled, uses MCP anonymous quotaNot set
perplexityApiKeyString (secret)Perplexity engine API key (required)Not set
deepseekApiKeyString (secret)DeepSeek official engine API key (required)Not set

FAQ

Q: Do I need to configure an API key after installation?

A: Not needed. The default engine is free Bing, it can search the web right after installation. Exa/Tavily/Keenable will use each provider's public anonymous quota even without a key; only Perplexity and DeepSeek official (these two paid engines) require a key.

Q: Where do I switch search engines?

A: Two ways. In the web settings page, go to Settings → Plugins → Configurable → Free Search card, use the dropdown to switch and save; or in the chat input, type /free-search-engine to pop up the engine selection window and click to select, which is equivalent to switching and saving via the settings page.

Q: What happens if one engine returns no results?

A: The plugin follows a unified fallback chain: after the preferred engine fails, it tries other engines in sequence (first paid engines with configured keys, then Exa/Tavily/Keenable's keyless channels, finally free engines like Bing/AnySearch/DDG). A Note is added at the top of results explaining the actual active engine and the reason for skipping (e.g., "Note: perplexity unavailable or failed, using exa.").

Q: How to search "recent week's news" or "updates since July"?

A: Just tell the agent in natural language, e.g., "search DSH news from the last 3 days", "find releases since July". The agent will call the advanced_search tool with the timeRange parameter, supporting fixed buckets (day/week/month/year), custom relative values (12h / 3d / 2mo / 1y), and absolute dates (2026-07-01).

Q: How to read the full text of a web page from search results?

A: Just tell the agent "open the first link and see the content". The web_fetch tool is enabled (official dsh-web-fetch-http provider), automatically follows redirects and converts HTML to plain text. Note it has no SSRF protection, agents can theoretically access internal addresses, please use as needed.

Q: Do I need to configure a proxy for domestic use?

A: Engines like DuckDuckGo may have restricted access in China. On Node 24+, you need to set three environment variables for the dsh process: NODE_USE_ENV_PROXY=1, HTTPS_PROXY, HTTP_PROXY, otherwise Node fetch won't use the system proxy.

Q: How to uninstall?

A: Remove this plugin entry from the DSH profile's plugin list, then restart dsh web. Configuration is written to the free-search namespace in ~/.dsh/settings.yaml, which can be manually cleaned up if needed.

Q: What's the relationship with DSH's built-in web_search?

A: This plugin implements the official WebSearchProvider interface and uses cordis.patch.yml to redirect the host's web.searchProvider field to this plugin's provider (id=ddg). Therefore, DSH's built-in web_search tool automatically calls this plugin's multi-engine + fallback logic; they don't conflict.

Difficulty Level

Beginner — Default Bing works right after installation, paid engines also have keyless fallback; deep customization only requires switching engines via the web settings page dropdown and filling in keys as needed.

Known Issues and Limitations

  • DuckDuckGo (html / lite) occasionally triggers anti-bot rate limiting ("anti-bot challenge"), usually temporary, recovers automatically; first failure is skipped by the fallback chain, noted in results
  • Bing / AnySearch don't support time filtering parameters (no corresponding query fields), when timeRange is present they are skipped and engines that support filtering are used instead
  • Tavily / SearXNG / DDG time filtering only supports fixed buckets (day/week/month/year), custom relative values (like 3d) are approximate-mapped to the nearest bucket
  • Paid engines (Perplexity, DeepSeek official) without configured keys are skipped by the fallback chain, they won't "fake search"
  • web_fetch tool has no SSRF protection, agents can theoretically read internal addresses
  • Checking for updates requests npm registry https://registry.npmjs.org/dsh-free-search/latest, domestic environments with network restrictions may not get the version number

Read the usage guide →

Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.

Listing badge

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/DDDMUC/dsh-free-search)

Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.

← Back to plugin directory