dsh-web-search-searxng
基于 SearXNG 实例的 web_search 提供方:元搜索、无需厂商 API 密钥,也不绑定账号
softspark
@softspark
⬇ 1
★ 1
main
安装
dsh plugin --profile web add github:softspark/dsh-web-search-searxng
需要可复现安装时,可在仓库后追加 #commit 固定提交。
基于 SearXNG 实例的 web_search 提供方:元搜索、无需厂商 API 密钥,也不绑定账号
该插件未提供要点说明,请参考仓库 README。
cordisdeepseek-harnessdshdsh-pluginmetasearchprivacy
- 安装并启动 DeepSeek Harness:
npx @deepseek-ai/dsh web - 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
- 用 dsh plugins list 确认已安装,必要时重启 Harness 生效
插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。
| 代码仓库 | github.com/softspark/dsh-web-search-searxng |
| 许可证 | Apache-2.0 |
| 主要语言 | main |
| 下载量 | 1 |
| GitHub 星标 | 1 |
| 最近推送 | 2026-09-15 |
| 收录日期 | 2026-09-19 |
| 分类 | 工具与能力 |
事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。
以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。
# dsh-web-search-searxng
> A web-search provider for the DeepSeek Harness, backed by a [SearXNG](https://docs.searxng.org/) instance. No API key, no vendor account, and nothing for this plugin to store.
[](https://www.npmjs.com/package/@softspark/dsh-web-search-searxng)
[](https://github.com/softspark/dsh-web-search-searxng/actions/workflows/ci.yml)
[](LICENSE)
[](https://github.com/topics/dsh-plugin)
The harness ships one search provider and it is gated on `DEEPSEEK_API_KEY`. This registers a second one on the same seam and moves the selection onto it.
```bash
dsh plugin add @softspark/dsh-web-search-searxng
```
Then tell it where the instance is:
```yaml
- id: web-search-searxng
name: '@softspark/dsh-web-search-searxng'
config:
baseURL: http://searxng:8080
```
This is an independently maintained SoftSpark integration. It is unofficial and is not affiliated with or endorsed by DeepSeek or the SearXNG project.
---
## What's new in 1.0.0
First public release.
- One `ctx.web` search provider, id `searxng`, and the bundle patch that actually selects it — registering alone changes nothing, and nothing reports that as an error.
- Results deduplicated by URL, because metasearch merges engines and the same page arrives more than once.
- Optional fields omitted rather than invented; `dsh-tool-web` already renders `title ?? hostname(url)`.
- A named error for the JSON format SearXNG does not enable by default, so an instance answering HTML with HTTP 200 does not read as "no results".
- No credential path at all, no redirects followed, and no error that carries the query.
Full history in [CHANGELOG.md](CHANGELOG.md).
---
## Why this exists
The harness ships one search provider, `web-search-deepseek`, and it is gated on `DEEPSEEK_API_KEY`. That is a sensible default and a poor fit for a workbench whose point is that no vendor account sits behind the agent's ordinary actions. The key is not just a payment detail: it is an identity, and it makes every query the agent runs attributable to one account held by one person.
Searching the web does not need that. A metasearch front end forwards the query to engines and returns what they say, and the account it does not have is the account nobody can correlate against.
**What this does not claim.** The engines still see the query, and so does whoever runs the instance. Pointing `baseURL` at a public SearXNG moves the trust from a vendor you have an account with to a stranger you do not — which is a different bargain, not a strictly better one. Run your own instance if the queries matter.
---
## Configuration
| Key | Default | Meaning |
|---|---|---|
| `baseURL` | **required** | Absolute URL of the instance, without `/search`. No default: a guess would send queries somewhere you did not choose. |
| `timeoutMs` | `15000` | Upper bound on one search. Between 1000 and 120000. |
| `language` | unset | UI language passed through, e.g. `pl` or `en-US`. |
| `safeSearch` | `0` | SearXNG safe-search level: 0 off, 1 moderate, 2 strict. |
| `categories` | unset | Comma-separated categories, e.g. `general,it`. |
| `engines` | unset | Comma-separated engine names, narrowing what the instance queries. |
Unset optional keys are omitted from the request rather than sent empty, so the instance's own defaults apply.
### The instance must be allowed to answer in JSON
SearXNG does not enable the JSON output format by default. Without it, the instance answers the same URL with a rendered results page and HTTP 200 — which would read as "no results" if this provider did not check. Add it to the instance's `settings.yml`:
```yaml
search:
formats:
- html
- json
```
The provider names this fix in the error when it sees HTML, so the failure is one you can act on rather than one you have to guess at.
---
## What the bundle does to the harness
Two rows, and both are needed:
```yaml
- insert:
- id: web-search-searxng
name: '@softspark/dsh-web-search-searxng'
- patch:
- id: web
config:
searchProvider: searxng
```
Registering the provider alone changes nothing. The `web` seam resolves `searchProvider` at call time, and a configured id that is registered always wins — so while `web.searchProvider` still names `deepseek-official`, this provider is registered and never selected. The `patch:` row is what moves the selection.
Leaving the DeepSeek row mounted is otherwise harmless: without a key it reports itself unavailable. Removing it is still worth doing where the point is that no key path exists at all.
---
## Behaviour
**Selection is not order-dependent.** The seam resolves the configured id at execution time. An id that is registered but unavailable fails as `WEB_PROVIDER_CONFIGURED_UNAVAILABLE` rather than silently falling back to another provider — a fallback would make "which engine answered this" unanswerable.
**`available()` makes no network call.** It reports whether an absolute `http(s)` base URL is configured. Whether the instance is reachable is a question for the search itself, and answering it in a usability check would make every provider listing a round trip.
**Results are deduplicated by URL.** Metasearch merges engines and the same page arrives more than once; the first occurrence wins, so the engine ordering the instance chose is preserved.
**Optional fields are omitted, not invented.** A result with no title returns no title. `dsh-tool-web` renders `title ?? hostname(url)` and is built for this.
**Redirects are refused.** A search URL that redirects is a misconfiguration or an interception, not a route to follow.
**Errors name what to do.** An unreachable instance, a non-2xx answer, a timeout, and an HTML answer are four distinct messages. None of them contains the query — an error is a place a search term should never leak into.
---
## Security
This plugin reads no credential and holds no key. It makes one outbound `GET` per search, to the `baseURL` you configured and nowhere else.
Report vulnerabilities per [SECURITY.md](SECURITY.md).
---
## Documentation
- [Set up an instance](kb/howto/setup.md)
- [Architecture](kb/reference/architecture.md)
- [ADR-001: a search provider instead of a key](kb/decisions/adr-001-provider-not-key.md)
- [Common issues](kb/troubleshooting/common-issues.md)
## Licence
Apache-2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。