直连 Exa 与 Parallel 搜索,无需密钥即可返回结果
29.5/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add DOCUTEE/dsh-web-search-opencode-style该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · search
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 41 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 3 处,展示前 3 条)
- 发起网络请求lib/index.js:374
response = await fetch(url, { - 读取密钥环境变量lib/index.js:556
exaApiKey: config?.exaApiKey ?? process.env.EXA_API_KEY, - 读取密钥环境变量lib/index.js:557
parallelApiKey: config?.parallelApiKey ?? process.env.PARALLEL_API_KEY,
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-web@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 无需APIkey调用
- 返回网页搜索结果
为 DeepSeek Harness 带来 Opencode 风格的网页搜索:直接调用 Exa / Parallel MCP,无需 API key
README
由 DeepSeek 最新模型翻译生成dsh-web-search-opencode-style
npm version
license
一个为 DeepSeek Harness(DSH)打造的 opencode 风格网页搜索提供程序。它向 ctx.web 注册单个 opencode-style 提供程序,因此来自 @deepseek-ai/dsh-tool-web 的面向模型的 web_search 工具可以继续工作(卡片、引用、超时、searchMaxResults),而不会触发 WEB_PROVIDER_AMBIGUOUS。
无需安装 MCP 服务器。无需 API 密钥。不消耗 LLM 额度。
工作原理
这是对 opencode 执行网页搜索方式的直接移植(packages/opencode/src/tool/websearch.ts + packages/opencode/src/tool/mcp-websearch.ts):CLI 将 JSON-RPC tools/call 以 POST 直接发送到两个公共 MCP 端点,然后解析 MCP 响应(纯 JSON 或 SSE data: ... 行):
- Exa:https://mcp.exa.ai/mcp → web_search_exa
- Parallel:https://search.parallel.ai/mcp → web_search
展开完整文档(README 剩余 1 节)
dsh-web-search-opencode-style
npm version
license
一个为 DeepSeek Harness(DSH)打造的 opencode 风格网页搜索提供程序。它向 ctx.web 注册单个 opencode-style 提供程序,因此来自 @deepseek-ai/dsh-tool-web 的面向模型的 web_search 工具可以继续工作(卡片、引用、超时、searchMaxResults),而不会触发 WEB_PROVIDER_AMBIGUOUS。
无需安装 MCP 服务器。无需 API 密钥。不消耗 LLM 额度。
工作原理
这是对 opencode 执行网页搜索方式的直接移植(packages/opencode/src/tool/websearch.ts + packages/opencode/src/tool/mcp-websearch.ts):CLI 将 JSON-RPC tools/call 以 POST 直接发送到两个公共 MCP 端点,然后解析 MCP 响应(纯 JSON 或 SSE data: ... 行):
- Exa:https://mcp.exa.ai/mcp → web_search_exa
- Parallel:https://search.parallel.ai/mcp → web_search
该插件零依赖:仅使用全局 fetch(Node >= 20)。
与 opencode 的一致性
1:1 移植,并对照 websearch.ts + mcp-websearch.ts 交叉核对:
- 相同的端点、工具名称、JSON-RPC 请求体(id: 1、tools/call)、accept 头、25 秒超时、默认 redirect(跟随)。
- 相同的默认参数:type: auto、numResults: 8、livecrawl: fallback,contextMaxCharacters 仅在设置时发送;numResults = request || config || 8(不做钳制,严格为 params.numResults || 8)。
- 与 selectWebSearchProvider() 相同的后端选择顺序:环境变量 OPENCODE_WEBSEARCH_PROVIDER → 配置 provider → 标志 enableExa/enableParallel(环境变量 OPENCODE_ENABLE_EXA、OPENCODE_ENABLE_PARALLEL、OPENCODE_EXPERIMENTAL 作为 RuntimeFlags)→ checksum(sessionID) % 2。会话来自 ctx.agents.currentInitiator(),因此同一会话内的每次搜索都会命中同一后端,与 opencode 完全一致。
- 发送给 Parallel 的相同字段:objective、search_queries、session_id(真实会话;没有会话时为 dsh_)、model_name(agent.options.model,截断至 100 个字符——对应 webSearchModelName)。
- 相同的解析方式:先解析原始 JSON,然后扫描 data: 行;不是 McpResult 的 {...} 载荷(JSON-RPC error、格式错误的 JSON)是错误,而不是静默的“无结果”。
- 相同的空结果语句: No search results found. Please try a different query.
- 相同的 FNV-1a base36 checksum(移植自 packages/core/src/util/encode.ts)。
无法从提供程序层复现的内容(DSH 架构限制):
| 要点 | opencode | DSH |
| 由模型选择 numResults/livecrawl/type/contextMaxCharacters | 工具参数 | DSH 的 web_search 仅接受 queries[];maxResults 由 tool-web 行(searchMaxResults)固定,其余为配置 |
| 搜索前请求许可 | ctx.ask({permission:'websearch'}) | dsh-tool-web 没有审批层;权限属于宿主,提供方没有通道 |
| 卡片标题 + metadata.provider | "Exa Web Search: " | 接缝的 WebSearchResult 没有元数据通道 |
| User-Agent(Parallel) | opencode/ | dsh-web-search-opencode-style/ —— 刻意不冒充其他产品 |
sources[] 是 opencode 没有的唯一转换步骤:接缝需要结构化数据来渲染卡片和引用。该插件优先解析结构化格式——先是 Parallel 的 JSON results[](title、publish_date → publishedAt、excerpts → snippet),然后是 Exa 的 Title:/URL:/Published:/Highlights: 块——只有当文本不匹配任何已知格式时,才回退到扫描原始 URL。当提取到的来源数量超过 maxResults 时会设置 truncated,这样 web_search 就能提示模型优化查询。
错误码:WEB_PROVIDER_ERROR(HTTP 失败 / 网络失败 / 无法解析的响应体 / 响应大于 4 MiB)、WEB_SEARCH_TIMEOUT(超过 timeoutMs,消息与 opencode 相同: request timed out,名称族与 dsh-web-fetch-http 的 WEB_FETCH_TIMEOUT 相同)、WEB_ABORTED(调用方中止)。
安装(一条命令)
dsh plugin --profile web add dsh-web-search-opencode-style
这会在该 profile 内运行 pnpm add,并将该 bundle 接入 dsh.profile.bundles(通过 reconcilePlugins:任何声明了 dsh.bundle 的包都会自动加入栈)。该 bundle 补丁既挂载了提供方,又将 web 行覆盖为 searchProvider: opencode-style(环境变量 DSH_WEB_SEARCH_PROVIDER 仍然优先),因此不会与内置的 deepseek-official 发生 WEB_PROVIDER_AMBIGUOUS 冲突。重启 dsh --profile web,模型就会像之前一样看到 web_search——无需密钥,无需额外编辑文件。
回到旧的 DeepSeek 搜索:
DSH_WEB_SEARCH_PROVIDER=deepseek-official dsh --profile web。
固定某一个 opencode 后端:OPENCODE_WEBSEARCH_PROVIDER=exa|parallel。
改为从本地检出安装:
dsh plugin --profile web add /path/to/dsh-web-search-opencode-style
卸载:
dsh plugin --profile web remove dsh-web-search-opencode-style
配置
以下所有内容都可以在 设置 → 插件 → 插件配置(命名空间 web-search-opencode-style)中编辑:该插件注册了一个真正的设置区段,因此表单会列出每个键,更改会从下一次搜索起生效。该区段需要来自正在运行的 DSH 安装的 @deepseek-ai/schemastery;插件会从 $DSH_HOME/profiles/node_modules(DSH 的共享回退位置)加载它,因此通过符号链接的 dsh plugin add 安装无需任何额外操作即可工作。没有 schemastery 时插件仍然可用——只是缺少表单。
你也可以使用该行的 cordis.patch.yml(参见模板文件),或直接使用传给 apply() 的 config 对象:
| 键 | 默认值 | 含义 |
| provider | undefined(自动) | "exa" / "parallel" 用于固定;优先级低于环境变量 OPENCODE_WEBSEARCH_PROVIDER(顺序与 opencode 相同) |
| enableExa | 环境变量 OPENCODE_ENABLE_EXA / OPENCODE_EXPERIMENTAL_EXA / OPENCODE_EXPERIMENTAL | 强制使用 Exa,类似 RuntimeFlags.enableExa |
| enableParallel | 环境变量 OPENCODE_ENABLE_PARALLEL / OPENCODE_EXPERIMENTAL_PARALLEL | 强制使用 Parallel;在 enableExa 之前检查,与 opencode 相同 |
| exaApiKey | 环境变量 EXA_API_KEY | 可选——公共端点无需密钥即可使用 |
| parallelApiKey | 环境变量 PARALLEL_API_KEY | 可选 |
| numResults | 8 | 当调用方未发送 maxResults 时使用;实际上由 tool-web.searchMaxResults 决定 |
| type | "auto" | auto / fast / deep(Exa) |
| livecrawl | "fallback" | fallback / preferred(Exa) |
| contextMaxCharacters | _(不发送)_ | Exa 上下文上限 |
| timeoutMs | 25000 | 与 opencode 的 "25 seconds" 匹配 |
| enabled | true | false → available() 返回 false |
开发
该模块导出 name、inject、apply 和 Config——并且没有默认导出。cordis 的加载器使用 default ?? exports 规范化模块导出(cordis-plugin-loader),因此默认导出会遮蔽具名元数据,插件会丢失其 inject/Config(这曾导致 cannot get property "web" without inject)。仅当默认导出自身携带该元数据时才添加默认导出。
node --test test/.test.mjs # plugin.test.mjs (ported logic) + dsh-seam.test.mjs (real cordis + dsh-web)
DSH_INTEGRATION=1 node --test test/dsh-seam.test.mjs # plus one real search against Exa/Parallel
test/dsh-seam.test.mjs 将插件挂载到带有真实 ctx.web 接缝的真实 cordis 上下文上,并且仅对网络进行打桩,因此导出结构和设置接线也都被覆盖;当 PATH 上没有 dsh 安装时,它会跳过自身。
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
DOCUTEE/dsh-web-search-opencode-style
直连 Exa 与 Parallel 搜索,无需密钥即可返回结果
相关插件 · 搜索 / 抓取
LLM 知识平台Tencent/WeKnora
概览 ·快速开始 ·新特性 ·功能 ·客户端 ·文档 ·开发
★ 36,161已汉化DSH
72.1
智能体记忆系统MemTensor/MemOS
MemOS 2.0 Stardust星尘
★ 12,195已汉化DSH
71.2
跨代理记忆库zilliztech/memsearch
跨平台语义记忆,专为 AI 编程智能体打造。
★ 2,799已汉化DSH
70.9
技能语料库EverMind-AI/SkillCorpus
SkillCorpus 能给你什么
★ 694已汉化DSH
69.7
代码图谱记忆syncable-dev/memtrace-public
你的智能体值得拥有结构化记忆。
★ 509已汉化MCP
67.9
AnySearch 搜索插件anysearch-team/anysearch-dsh
AnySearch 网页搜索服务商,为 DeepSeek Harness(DSH)提供高级搜索工具
★ 457已汉化DSH
66.6