Skip to the page

dsh-web-search-multi

Enter https://api.specstream.ai/searxng as the SearXNG instance URL in dsh-web-search-multi, put your SpecStream key in the token box, and choose SearXNG as the preferred provider. DeepSeek Harness then searches through SpecStream's Search API, and your other engines stay as the fallback.

SpecStream for dsh-web-search-multiCoding agents

What you need

  • DeepSeek Harness (dsh) and Node.js 20 or newer, with the plugin in the web profile: dsh plugin --profile web add github:cinob/dsh-web-search-multi.
  • A SpecStream key. Get your key on the Search API screen of your SpecStream workspace. New accounts start with $10 of credit, no card.
  1. 1. Open the plugin's settings

    Run dsh web and open http://127.0.0.1:3080. Click Settings (the gear icon), then 多源 Web 搜索 (multi-source web search) in the sidebar.

  2. 2. Fill in the SearXNG row

    Under API 密钥与自建实例 (API keys and self-hosted instances), find SearXNG (自建开源实例). In the instance URL box, the one that shows 实例 URL (如 http://127.0.0.1:8888), enter the address below. Leave /search off: the plugin adds /search and format=json itself.

    In the token box next to it, 访问 Token / 认证密钥 (选填), paste your SpecStream key. The plugin sends the token as a Bearer token, which is where SpecStream reads the key.

    Instance URL
    https://api.specstream.ai/searxng
  3. 3. Save

    Click 保存所有输入与密钥 (save all inputs and keys). The banner ✓ 配置已持久化保存并立即生效! means the change is saved and applies from the next search, with no restart. The address goes to ~/.dsh/settings.yaml and the token to ~/.dsh/.credentials.yaml.

  4. 4. Choose SearXNG as the preferred provider

    In 首选搜索提供方 (Preferred Provider), select SearXNG (自建开源无限制). It saves on change.

    Do not leave it on 自动策略 (Auto). On Auto the plugin tries Tavily, Brave, Serper and Bocha when they have keys, then 360, Bing and Baidu, which need no key and are always on, and SearXNG only after all of them. So on Auto, SpecStream is almost never asked.

    Keep 启用自动平滑降级 (Auto Fallback) on, and the other engines answer when a SpecStream search fails.

  5. 5. Test it

    Under 在线连通性测试 & 搜索预览 (connection test and search preview), pick SearXNG in the list, type a query and click 发起测试 (run test). The result list shows titles and links from SpecStream. Then ask dsh about something from this week.

Or set it with environment variables

With no address saved in the settings tab, the plugin reads SEARXNG_URL from the environment dsh starts with, and the token from SEARXNG_TOKEN when the credentials file has none. The preferred provider still has to be SearXNG, chosen in the settings tab.

What the plugin sends, and what comes back

dsh-web-search-multi sendsSpecStream
GET {instance URL}/search?q=...&format=jsonhttps://api.specstream.ai/searxng/search
The token as Authorization: Bearer, as X-Searxng-Token, and as token and auth in the queryReads the key from the Bearer token
Reads results[].url, title, content and publishedDate, and keeps the first 8 unless dsh asks for another countSearXNG's JSON: results[] with title, url and content. publishedDate is null on most results

Why the SearXNG row is the way in

The plugin's Tavily, Brave, Serper and Bocha adapters call each provider's own address, written in the code, with no setting to change it. The SearXNG row is the one that takes an address, and its token box takes a key.

A self-hosted or public SearXNG instance answers this plugin only when JSON output is enabled in its settings.yml. SearXNG's docs say a format that is not enabled answers 403, and that many public instances turn these formats off. SpecStream answers every request in SearXNG's JSON shape, and the search runs on SpecStream's servers, so there is no instance to host and no engine list to keep unblocked.

What each search costs

Each search the plugin sends to the SearXNG address is one Search API call on the fast tier: $1 per 1,000 searches of up to 10 results, a fifth of the default search's $5. The plugin sends no result count, so each call gets one page of 10 at that price, and a search that returns nothing costs nothing. Each test search in the settings tab is one search.

Searches come out of your balance with no quote and no approval. New accounts start with $10 of credit, no card. Questions go to [email protected].

Limits and errors

  • When search is busy, SpecStream answers 429 with a Retry-After header and charges nothing. With Auto Fallback on, the next engine answers that search.
  • A key SpecStream does not accept answers 401. The test shows SearXNG search failed (401) with SpecStream's message. Check the token, and that the key can search: keys made on the Search API screen can.
  • The token box is optional in the plugin, but SpecStream needs it. An instance URL with no token answers with a missing key error.

Keep the key private

The token is kept in ~/.dsh/.credentials.yaml with mode 0600, as the plugin's README says. The plugin also puts the token in the request address as token and auth, so it shows in the logs of any proxy dsh sends through. To end a key's access, revoke it under API keys in Agents & API in your workspace and make a new one.

Read pages and get rows too

The same key reads pages with the Extract API at $0.80 per 1,000 pages, and a page with no text is not charged. For a dataset, add SpecStream's MCP server at https://api.specstream.ai/mcp and ask for the records in plain words. Deep Search returns every match as structured rows at 5¢, 15¢ or $1 a row, under a maximum you approve. See MCP. Other DeepSeek Harness plugins: dsh-searxng and dsh-web-search-free.

Remove

Run dsh plugin --profile web remove dsh-web-search-multi. Then revoke the key in your workspace if you no longer use it.

More

SpecStream for dsh-web-search-multi covers what it does in dsh-web-search-multi on one page. Every other tool has its guide in Connect your tools. You see the most a request can cost before it starts, and the matches are paid from your balance. Billing has the details. For help, email [email protected].