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.
What you need
- DeepSeek Harness (dsh) and Node.js 20 or newer, with the plugin in the
webprofile: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 weband openhttp://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/searchoff: the plugin adds/searchandformat=jsonitself.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 - 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.yamland 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 sends | SpecStream |
|---|---|
GET {instance URL}/search?q=...&format=json | https://api.specstream.ai/searxng/search |
The token as Authorization: Bearer, as X-Searxng-Token, and as token and auth in the query | Reads the key from the Bearer token |
Reads results[].url, title, content and publishedDate, and keeps the first 8 unless dsh asks for another count | SearXNG'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
429with aRetry-Afterheader and charges nothing. With Auto Fallback on, the next engine answers that search. - A key SpecStream does not accept answers
401. The test showsSearXNG 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].