rogerdigital/dsh-searxng

插件Plugin 原生Native ⭐ 3 MIT 其他Other

A DeepSeek Harness (dsh) plugin that registers a SearXNG-backed search provider into the web capability seam (ctx.web), giving your agent websearch through a free, self-hosted, key-less metasearch instance — instead of the paid Exa/Perplexity APIs.

catalog 简介 / catalog descriptioncatalog description:—

项目介绍Project Overview

dsh-searxng 是 DeepSeek Harness 插件,在 web 能力接口中注册一个由 SearXNG 驱动的 web_search 提供方,使智能体通过自建、无需密钥的元搜索后端获取网页结果,从而替代 Exa、Perplexity 等付费 API。配置项包括 baseURL、language、engines、categories 与 authHeader,均可选。适用于希望以自有 SearXNG 实例承担检索、避免外部配额与费用的场景。注意:目标实例必须在 settings.yml 的 search.formats 中启用 json 格式,否则会返回 403;该插件目前仍处于开发者预览阶段。

dsh-searxng is a DeepSeek Harness plugin that registers a SearXNG-backed web_search provider on the web capability seam, letting an agent query the web through a self-hosted, key-less metasearch instance instead of paid APIs such as Exa or Perplexity. Configuration lives on the web-search-searxng row and covers baseURL, language, engines, categories, and authHeader, all optional. Use it when you want your own SearXNG to supply the agent's web results. Note: the target instance must enable json in search.formats, otherwise requests fail with HTTP 403, and the wider dsh runtime is still in developer preview.

或使用命令行安装(适合开发者)Or use CLI install (for developers)

命令行安装CLI Install

dsh plugin add dsh-searxng

rogerdigital/dsh-searxng 加入你的 DSH 配置(web profile)即可启用。

READMEREADME

dsh-searxng

A DeepSeek Harness (dsh) plugin that registers a SearXNG-backed search provider into the web capability seam (ctx.web), giving your agent web_search through a free, self-hosted, key-less metasearch instance — instead of the paid Exa/Perplexity APIs.

Install

dsh plugin add dsh-searxng

(With a named profile: dsh plugin --profile <name> add dsh-searxng.)

Quick start

  1. Run a SearXNG instance with the JSON format enabled. If you installed only the plugin, clone the repository example first:

    git clone --depth 1 https://github.com/rogerdigital/dsh-searxng.git dsh-searxng-example
    docker compose -f dsh-searxng-example/examples/docker/docker-compose.yml up -d
    curl 'http://127.0.0.1:8080/search?q=test&format=json'
    

    From an existing source checkout, you can instead run docker compose up -d in examples/docker. This repository example is loopback-only and pre-configures search.formats with json — the one setting most public instances deliberately disable.

  2. Point the plugin at it. Either set an environment variable before launching dsh:

    export SEARXNG_BASE_URL=http://127.0.0.1:8080
    dsh
    

    …or override the plugin row in your profile's cordis.patch.yml ($DSH_HOME/profiles/<name>/cordis.patch.yml):

    - id: web-search-searxng
      config:
        baseURL: http://127.0.0.1:8080
        language: zh-CN
    
  3. Ask your agent something that needs the web. If this is the only search provider you have installed, the seam auto-selects it. If you also have Exa/Perplexity installed, select it explicitly with export DSH_WEB_SEARCH_PROVIDER=searxng (or set searchProvider: searxng in the web row's config).

Until baseURL is set, the provider registers as unavailable — no public instance is assumed, because most disable the JSON format and rate-limit heavily.

Configuration

All keys are optional; all live on the web-search-searxng row's config.

Key Default Meaning
baseURL $SEARXNG_BASE_URL Base URL of the instance, e.g. http://127.0.0.1:8080. Must be http(s), contain no query or fragment, and have json in search.formats.
language none Locale passed as SearXNG's language parameter, e.g. zh-CN, en-US.
engines none Comma-separated engine allowlist, e.g. bing,duckduckgo.
categories none Comma-separated category filter, e.g. general,it.
authHeader none Authorization header value, for instances fronted by an API-key gate. Sent verbatim.

The result count is not configurable here: dsh-tool-web owns the bound (searchMaxResults, default 8) and the seam truncates to it.

Troubleshooting

  • HTTP 403 — the instance does not enable the JSON format. Add json to search.formats in its settings.yml (see the repository example), then restart the instance.
  • HTTP 429 — the instance's rate limiter. For a local instance set limiter: false, or raise its limits.
  • Provider unavailable / never selectedbaseURL is not set, is not an absolute http(s) URL, or contains a query or fragment.
  • WEB_PROVIDER_AMBIGUOUS — more than one search provider is installed and available; select one via DSH_WEB_SEARCH_PROVIDER=searxng.

Compatibility

dsh is in developer preview with breaking changes expected. This table tracks tested pairings:

Plugin version @deepseek-ai/dsh-web @deepseek-ai/dsh-launch-environment Notes
0.1.1 >=0.1.0-rc.6 <0.2.0 (tested against 0.1.0-rc.6) >=0.0.1-rc.3 <0.2.0 (tested against 0.0.1-rc.3) First-round hardening
0.1.0 >=0.1.0-rc.1 <0.2.0 >=0.0.1-rc.1 <0.2.0 Initial release

Develop

pnpm install
pnpm test    # vitest
pnpm build   # tsdown → lib/

Integration check against a live instance:

cd examples/docker && docker compose up -d
node -e "import('./lib/index.mjs').then(m => new m.SearxngSearchProvider({ baseURL: 'http://127.0.0.1:8080' }).search({ query: 'deepseek harness' }).then(r => console.log(r.sources.slice(0, 3))))"

License

MIT

上一个 Prev dsh-session-move 下一个 Next dsh-chrome