DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Web Search Exa Dynamic — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
W

dsh-web-search-exa-dynamic

Web Search Exa Dynamic

用于 DeepSeek Harness ctx.web 接口的 Exa 网络搜索提供程序,默认启用 Dynamic Highlights,并提供 /exa 命令以在运行时更改设置。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:Geighlord007/dsh-web-search-exa-dynamic#d08c0432a7ed97e780116d4e950d597e96c94244
README兼容性版本

兼容性与来源证明

Web Search Exa Dynamic 以 dsh-web-search-exa-dynamic 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/9/10

版本

0.1.0stable
2026/9/10

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 search-research 分类下经过校验的插件。

Anysearch Dsh@anysearch/anysearch-dsh适用于 DeepSeek Harness 的 AnySearch 网络搜索和获取提供程序及高级工具Industry Researchdsh-industry-research适用于 DeepSeek Harness 的行业与公司研究领域包:方法论技能、行业链结构模型(industry_map)、通过 ctx.web 进行的公开来源政策/新闻跟踪(industry_track)、公司扫描卡片(company_scan)以及可审计的研究Zoterodsh-zotero让智能体搜索、阅读并引用您的本地 Zotero 文献库:查找论文、浏览笔记和批注、按问题提取证据、打开源文档并生成引文。Browser@anweat/dsh-browserDeepSeek Harness 的自包含浏览器运行时插件(作用域为 @anweat)——将 Playwright(chromium)和 OpenCLI 作为插件本地依赖进行打包(支持全局复用回退),提供 `browser` 服务和交互式浏览器工具。

README

dsh-web-search-exa-dynamic

English | 简体中文

An Exa-backed WebSearchProvider for the DeepSeek Harness ctx.web seam, with Exa Dynamic Highlights on by default and an /exa command that changes highlights, search type and result count at runtime.

dsh plugin --profile web add dsh-web-search-exa-dynamic

Why this exists

The first-party @deepseek-ai/dsh-web-search-exa cannot reach Exa Dynamic Highlights, for two independent reasons:

  1. Its request body is hardcoded. It sends contents.highlights.highlightsPerUrl, and no config field it accepts reaches a dynamic field.

  2. Dynamic Highlights is a beta API and needs a header. Every request that sets dynamic: true must also send Exa-Beta: dynamic-highlights-2026-08-28. That provider's headers are authorization, content-type, accept and user-agent — no Exa-Beta. Without it Exa answers HTTP 400:

    {"error":"'highlights.dynamic' is in beta. Send the 'Exa-Beta: dynamic-highlights-2026-08-28' request header to use it.","tag":"INVALID_REQUEST"}
    

This provider sends both, and drops highlightsPerUrl entirely — measured against the live API, Exa ignores that parameter, returning byte-identical payloads for values 1 and 5. It uses maxCharacters instead, which is the knob that actually works when Dynamic Highlights are off.

Measured

Real /search calls, one query, 8 results:

ConfigurationHighlight characters
First-party provider's default (no working knob)51,152
This provider, dynamicHighlights: false + highlightsMaxCharacters: 150010,973
This provider, dynamicHighlights: true (default)12,716

Dynamic Highlights is not a uniform truncation: it concatenates the retrieved documents into one input, runs a single forward pass, and allocates a shared budget across the result set — so useful pages keep more context and redundant ones get less.

Install

dsh plugin --profile web add dsh-web-search-exa-dynamic

The package declares a dsh.bundle manifest, so its bundle patch inserts the provider row for you — no hand-written patch entry is needed.

To select it, override the web row in $DSH_HOME/profiles/web/cordis.patch.yml:

- id: web
  name: '@deepseek-ai/dsh-web'
  config:
    searchProvider: exa
    fetchProvider: http

A patch replaces the targeted row's whole config rather than merging into it, so fetchProvider: http must be restated or the fetch provider is dropped.

Then give it a key, either as plugin config:

- id: web-search-exa-dynamic
  name: dsh-web-search-exa-dynamic
  config:
    apiKey: 'your-exa-api-key'

or through the environment. apiKey is declared role('secret'), so it never appears in a describe() response — but a plain-text config file is still a plain-text config file; prefer the environment when you can.

On $DSH_HOME/.env. The plugin reads apiKeyEnv (default EXA_API_KEY) through the harness's launch-environment snapshot, which is documented to consult the inherited environment, the invoking directory's .env and the Harness home's .env. That worked in some deployments and not in others — on one Windows install the snapshot came back without the variable even though the file was correct, and the config apiKey above was the fix. If your provider reports registered but unavailable, the key is not reaching it; set apiKey directly.

Restart dsh web after changing the environment. cordis.patch.yml itself is hot-reloaded, so config edits apply without a restart.

Configuration

Every field has a safe default; you normally only supply a key.

FieldDefaultMeaning
providerIdexaRegistry id. Change it only to coexist with another Exa provider.
apiKeyunsetLiteral key; falls back to apiKeyEnv.
apiKeyEnvEXA_API_KEYEnvironment variable consulted when apiKey is unset.
baseURLhttps://api.exa.aiExa endpoint; /search is appended.
searchTypeautoRetrieval type — see below. Runtime-settable with /exa type.
numResults8Source cap. Runtime-settable with /exa results.
dynamicHighlightstrueOn by default; adds the required Exa-Beta header. Runtime-settable with /exa.
highlightsMaxCharactersunsetPer-page highlight cap, used only when dynamicHighlights is false.

dynamicHighlights is never combined with highlightsMaxCharacters: Exa sizes and distributes the shared budget itself when dynamic is on, and its docs warn against combining the two.

The /exa command

Typed in the composer. It runs directly against the interface and creates no model message.

CommandEffect
/exaToggle Dynamic Highlights
/exa on / /exa offSet them explicitly
/exa typeList the retrieval types
/exa type deepSet the retrieval type
/exa resultsReport the source cap
/exa results 3Set the source cap
/exa statusReport every knob, the available types, and the real ceiling

Plain words, no punctuation: the command declares no argument hint, so the composer inserts no template to edit around. /exa status lists the retrieval types too, so "which types were there again" never costs a second command, and a mistyped argument replies with copy-pasteable examples.

Writes land in the web-search-exa-dynamic settings namespace's user layer, so they survive a restart. Clearing that section returns the plugin to its configured defaults.

Measured on one provider instance, one query: switching Dynamic Highlights off took the same search from 12,716 to 57,958 highlight characters — a 4.6x difference, applied on the next search.

Retrieval types

Exa's type is the latency/quality dial. All eight were verified against the live API; measured latency for one query, 8 results:

TypeMeasuredUse
keyword464 msKeyword only, fastest
neural737 msSemantic retrieval
fast798 msSpeed with minimal quality loss
instant856 msReal-time (chat, voice)
auto1,914 msDefault
deep-lite3,116 msLightweight synthesized output
deep5,282 msMulti-step reasoning
deep-reasoning18,278 msHardest research tasks

The first-party provider's schema lists only auto, keyword and neural — that set is stale. This provider exposes all eight.

The deep* types are discounted by this seam

Measured through this provider's own class, same query, dynamic highlights on:

TypeTimeSources returned
fast718 ms8
auto215 ms8
deep6,891 ms3
deep-reasoning14,776 ms4

The raw API returns 8 results for deep; the rest carry no non-blank highlight and are dropped, because the seam has no other field to derive a snippet from and inventing one would make the seam lie. The deep* family's real product is the synthesized output, which WebSearchSource has no field for. In practice the useful range here is keyword, neural, fast, instant and auto.

Result count belongs to dsh-tool-web

Worth stating plainly, because it is easy to misread:

  • The model-facing web_search tool takes only queries — the model cannot ask for a count.
  • The ceiling belongs to dsh-tool-web: searchMaxResults, default 8. Its own comment: "The consumer owns the returned-context limit; providers and models do not."
  • The tool sends maxResults on every call, and the seam truncates the returned sources to it — so no provider can exceed that ceiling.

That makes this plugin's numResults one-directional: it can pull the count down, never up.

ConfiguredTool ceilingSent to Exa
383
1288 (clamped)
2088 (clamped)

/exa status and /exa results report the ceiling the provider actually observed, so a clamped value is explained rather than silently applied. To raise the ceiling itself, set searchMaxResults on the tool-web row once:

- id: tool-web
  name: '@deepseek-ai/dsh-tool-web'
  config:
    searchMaxResults: 20

Raise it once and everything above stays a runtime /exa results decision. Note this raises the cap for whichever provider is active, so it also affects the DeepSeek provider if you switch back.

Known limitations

  • Exa's beta surface can move. dynamic-highlights-2026-08-28 is a research preview; a change on Exa's side means updating DYNAMIC_BETA_VALUE.
  • Results without highlights are dropped, matching the seam's rule. With dynamic highlights on, 8 of 8 results carried a highlight in testing, so it rarely fires.
  • No category, domain or date filters, and no full text. Those are Exa features this provider does not expose yet.
  • One of this and the first-party Exa provider per profile. Both register the provider id exa by default; running both needs a distinct providerId on one of them.
  • Tested against dsh 0.1.5-rc.1 only, which is what the peer ranges pin.
  • Without a settings service the /exa writes are in-memory only. The provider itself works either way; without a command registry there is simply no /exa.

Development

node test/index.test.js    # 34 unit tests, no API key needed
EXA_API_KEY=... node test/live.mjs   # hits the real API, spends credit

Run the test file directly rather than through node --test: the test runner spawns a child process per file with piped stdio, which fails with spawn EPERM in a restricted sandbox.

Uninstall

dsh plugin --profile web remove dsh-web-search-exa-dynamic

Remove the web override from cordis.patch.yml to return to the built-in DeepSeek search. That edit is hot-reloaded, so it takes effect immediately.

License

MIT