按顺序自动切换搜索与抓取后端,失败即换下一个
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wjunhere/dsh-web-providers该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 17 处,展示前 17 条)
- 读取密钥环境变量lib/index.js:55
apiKey: config.apiKey ?? process.env.EXA_API_KEY ?? '', - 读取密钥环境变量lib/index.js:68
apiKey: config.apiKey ?? process.env.TAVILY_API_KEY ?? '', - 读取密钥环境变量lib/index.js:82
apiKey: config.apiKey ?? process.env.JINA_API_KEY ?? '', - 发起网络请求lib/chain.js:51
async fetch(request, signal) { - 发起网络请求lib/chain.js:57
return await backend.fetch(request, signal) - 发起网络请求lib/exa.js:43
const dispatcher = this.options.proxyUrl.length > 0 ? new ProxyAgent(this.options.proxyUrl) : undefined - 发起网络请求lib/exa.js:47
response = await undiciFetch(`${this.options.baseURL}/search`, { - 发起网络请求lib/jina.js:51
async fetch(request, signal) { - 发起网络请求lib/jina.js:61
const dispatcher = this.options.proxyUrl.length > 0 ? new ProxyAgent(this.options.proxyUrl) : undefined - 发起网络请求lib/jina.js:67
response = await undiciFetch(endpoint, { - 发起网络请求lib/jina-search.js:33
const dispatcher = this.options.proxyUrl.length > 0 ? new ProxyAgent(this.options.proxyUrl) : undefined - 发起网络请求lib/jina-search.js:45
response = await undiciFetch(`${this.options.baseURL.replace(/ +$/u, '')}/${encodeURIComponent(request.query)}`, { - 发起网络请求lib/tavily.js:47
const dispatcher = this.options.proxyUrl.length > 0 ? new ProxyAgent(this.options.proxyUrl) : undefined - 发起网络请求lib/tavily.js:53
response = await undiciFetch(`${this.options.baseURL}${path}`, { - 发起网络请求lib/tavily.js:105
async fetch(request, signal) { - 发起网络请求lib/tavily.js:123
const dispatcher = this.options.proxyUrl.length > 0 ? new ProxyAgent(this.options.proxyUrl) : undefined - 发起网络请求lib/tavily.js:129
response = await undiciFetch(`${this.options.baseURL}${path}`, {
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-web给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
为 DeepSeek Harness ctx.web 提供 Exa/Tavily/Jina 搜索和 Jina/Tavily 抓取服务商,支持回退链。
README
由 DeepSeek 最新模型翻译生成@wjunhere/dsh-web-providers
DeepSeek Harness(DSH)ctx.web 的搜索与抓取 provider,内部是有序兜底链:
- 搜索:exa → tavily → jina-search,注册为 provider id dsh-search;
- 抓取:jina → tavily extract,注册为 provider id dsh-fetch。
链对外仍是单个 provider,web_search / web_fetch 工具不变,模型无感知;前一后端失败(403/404/超时/空正文)自动换下一个。
解决什么问题
- DSH 内置 web_fetch 走 DeepSeek Fetch API,目标站点不可达或被反爬时统一返回 HTTP 404; Jina Reader 由 Jina 侧抓取并转 Markdown,能覆盖维基百科、GitHub raw、Hacker News 等站点。
- 官方 DeepSeek 搜索是一次完整模型调用;Exa 是纯检索 API,语义召回更适合英文技术内容。
- 官方 Exa provider 用精确 peer 版本,DSH 小版本升级就会在启动时被禁用;本包用范围 peer + 兜底链,不再依赖单一后端是否可用。
展开完整文档(README 剩余 1 节)
@wjunhere/dsh-web-providers
DeepSeek Harness(DSH)ctx.web 的搜索与抓取 provider,内部是有序兜底链:
- 搜索:exa → tavily → jina-search,注册为 provider id dsh-search;
- 抓取:jina → tavily extract,注册为 provider id dsh-fetch。
链对外仍是单个 provider,web_search / web_fetch 工具不变,模型无感知;前一后端失败(403/404/超时/空正文)自动换下一个。
解决什么问题
- DSH 内置 web_fetch 走 DeepSeek Fetch API,目标站点不可达或被反爬时统一返回 HTTP 404; Jina Reader 由 Jina 侧抓取并转 Markdown,能覆盖维基百科、GitHub raw、Hacker News 等站点。
- 官方 DeepSeek 搜索是一次完整模型调用;Exa 是纯检索 API,语义召回更适合英文技术内容。
- 官方 Exa provider 用精确 peer 版本,DSH 小版本升级就会在启动时被禁用;本包用范围 peer + 兜底链,不再依赖单一后端是否可用。
安装
在 DSH profile 目录(例如 ~/.dsh/profiles/<name>)安装:
npm install @wjunhere/dsh-web-providers
把包加进 package.json 的 dsh.profile.bundles:
{
"dsh": { "profile": { "bundles": ["...", "@wjunhere/dsh-web-providers"] } }
}
再在 profile 的 cordis.patch.yml 里 pin 两个 provider:
- id: web
name: "@deepseek-ai/dsh-web"
config:
searchProvider: dsh-search
fetchProvider: dsh-fetch
重启 DSH 生效。
配置
凭据默认从启动环境的 EXA_API_KEY / TAVILY_API_KEY / JINA_API_KEY 读取,也可以写在 config 里(优先级高于环境变量)。
- insert:
- id: web-providers
name: '@wjunhere/dsh-web-providers'
config:
search:
order: [exa, tavily, jina] # 搜索链顺序
fetch:
order: [jina, tavily] # 抓取链顺序
exa:
apiKey: '' # 空则读 EXA_API_KEY baseURL: https://api.exa.ai proxyUrl: '' searchType: auto # auto / keyword / neural highlightsPerResult: 1 timeoutMs: 20000 tavily: apiKey: '' # 空则读 TAVILY_API_KEY baseURL: https://api.tavily.com proxyUrl: '' # 大陆网络通常需要 searchDepth: basic # basic / advanced extractDepth: basic numResults: 5 maxContentChars: 100000 timeoutMs: 20000 jina: apiKey: '' # 空则读 JINA_API_KEY baseURL: https://r.jina.ai searchBaseURL: https://s.jina.ai proxyUrl: '' timeoutMs: 30000 maxContentChars: 100000 minContentChars: 50 allowAnonymous: false
行为
- 搜索链:Exa 返回 sources[](无 highlight 的结果被丢弃);Tavily 返回 title/url/content (content 截 500 字符当 snippet);Jina Search 返回 title/url/description。
任一成功即返回,全部失败时报 WEB_PROVIDER_ERROR 并附每段失败原因。
- 抓取链:Jina 返回 { url, statusCode: 200, body: { kind: 'text', content } },正文前带标题;失败(非 2xx、空正文、正文过短、拦截页)后回退 Tavily Extract 的 raw_content。
- 两链都遵守调用方 AbortSignal,每段有独立超时。
限制
- Tavily Extract 对反爬站点同样可能失败(如 Reddit);这类只能走浏览器路径。
- Exa 需要 API key;Jina 匿名模式只有 20 RPM(带 key 500 RPM)。
开发
npm install
EXA_API_KEY=... TAVILY_API_KEY=... JINA_API_KEY=... \
JINA_PROXY_URL=http://127.0.0.1:7897 TAVILY_PROXY_URL=http://127.0.0.1:7897 \
node test/providers.mjs
测试直接打真实 API,覆盖每个后端和两条兜底链,没有 mock。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
wjunhere/dsh-web-providers
按顺序自动切换搜索与抓取后端,失败即换下一个
相关插件 · 搜索 / 抓取
LLM 知识平台Tencent/WeKnora
概览 ·快速开始 ·新特性 ·功能 ·客户端 ·文档 ·开发
★ 36,032已汉化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