🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

网页工具后端 nhhc-lxr/dsh-web-tool-provider

DeepSeek Harness
nhhc-lxr9 天前有提交已提供中文文档扫描:含敏感能力

切换搜索与抓取引擎,统一结果格式并管理密钥

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add nhhc-lxr/dsh-web-tool-provider
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 9 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
  • 读取本地文件
    index.js:296
    const raw = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    index.js:309
    mkdirSync(dirname(file), { recursive: true })
  • 写入本地文件
    index.js:316
    writeFileSync(temporary, `${JSON.stringify(payload, null, 2)}\n`)
  • 写入本地文件
    index.js:317
    renameSync(temporary, file)
  • 发起网络请求
    index.js:366
    const response = await fetch(url, {
  • 发起网络请求
    index.js:384
    const response = await fetch(url, { method: 'GET', headers: { accept: 'application/json', ...headers }, signal: inner })
  • 发起网络请求
    index.js:762
    const response = await fetch(current.toString(), {
  • 发起网络请求
    index.js:852
    async fetch(request, signal) {
  • 发起网络请求
    client.js:185
    const response = await fetch(ENDPOINT, { headers: { accept: 'application/json' } })
  • 发起网络请求
    client.js:191
    const response = await fetch(ENDPOINT, {
  • 发起网络请求
    client.js:297
    const response = await fetch(`${ENDPOINT.replace('/state', '/credits')}?vendor=${vendor}`, {
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-web-tool-provider DeepSeek Harness 的 web_search / web_fetch 与 Tavily / Exa / Firecrawl 之间的归一化中间层。 web_search ─┐ ┌─ tavily ├─ ctx.web 统一契约 ───────┤ web_fetch ─┘ (本插件负责转换) └─ exa / firecrawl - 输入归一:通用层只有域名白/黑名单;每次查询固定 5 条;其余厂商参数(深度、主题、格式、地区……)全部由插件内部的默认值决定,界面不暴露。 - 输出归一:一个 source 形状、一种日期格式、一套错误码;厂商的 author/warnings/failed_results 都折进同一处。 - 不向厂商索要答案或逐条正文:Tavily 的 include_answer 与 Exa 的 contents.highlights 都关闭,content 只承载降级 notice,正文一律走 web_fetch。
展开完整文档(README 剩余 1 节)
dsh-web-tool-provider

DeepSeek Harness 的 web_search / web_fetch 与 Tavily / Exa / Firecrawl 之间的归一化中间层。

web_search ─┐ ┌─ tavily
├─ ctx.web 统一契约 ───────┤ web_fetch ─┘ (本插件负责转换) └─ exa / firecrawl

- 输入归一:通用层只有域名白/黑名单;每次查询固定 5 条;其余厂商参数(深度、主题、格式、地区……)全部由插件内部的默认值决定,界面不暴露。
- 输出归一:一个 source 形状、一种日期格式、一套错误码;厂商的 author/warnings/failed_results 都折进同一处。
- 不向厂商索要答案或逐条正文:Tavily 的 include_answer 与 Exa 的 contents.highlights 都关闭,content 只承载降级 notice,正文一律走 web_fetch。

安装

dsh plugin --profile web add github:nhhc-lxr/dsh-web-tool-provider

设置页

Settings → Plugins → 网页工具后端,一页三块:

┌ 后端选择 ─────────────────────────┐ │ web_search [ Tavily ▾ ] │ │ web_fetch [ Firecrawl ▾ ] │ ├ API 密钥 ─────────────────────────┤ │ Tavily [已配置] ✎ 🗑 │ │ Exa [未配置] [____] ✓ │ │ Firecrawl [已配置] ✎ 🗑 │ └──────────────────────────────────┘

没有保存按钮:两个下拉改动即存。密钥显式保存(避免输一半就被写进凭据库):已配置的行隐藏输入框,点铅笔才展开,同时在输入框左边显示剩余额度。

额度查询直连厂商接口(不经 ctx.web、不经工具层):

| 厂商 | 接口 | 剩余额度 |
| Tavily | GET /usage | account.plan_limit - plan_usage(limit 为 null 表示不限) |
| Firecrawl | GET /v2/team/credit-usage | 直接给 remainingCredits |
| Exa | — | 无余额接口(要 service key + 团队开通,且只给美元消费额),页面显示「无额度接口」 |

密钥解析顺序:插件配置里的字面量 → 凭据库 → 环境变量(TAVILY_API_KEY / EXA_API_KEY / FIRECRAWL_API_KEY),每次调用重新解析。字面量密钥不会被写进状态文件。

配置(YAML,可选)

界面只动后端与通用选项;下面的字段只从 profile 的 cordis.patch.yml 读取,作为首次运行的默认值:

| 层 | 字段 |
| search | backend、includeDomains、excludeDomains |
| fetch | backend、fallbackToHttp |
| providers.tavily | baseURL、timeoutMs、maxChars、topic、searchDepth、apiKey、apiKeyEnv |
| providers.exa | baseURL、timeoutMs、maxChars、searchType、apiKey、apiKeyEnv |
| providers.firecrawl | baseURL、timeoutMs、maxChars、version、mainContent、maxAge、apiKey、apiKeyEnv |

后端与通用选项存在插件自管状态文件(<profile>/.web-tool-provider/state.json,回退 $DSH_HOME、~/.dsh);状态文件优先于 Config。

输出契约

SearchResult = { content?: string; sources: { url; title?; snippet?; publishedAt? }[]; truncated: boolean }
FetchResult = { url: string; statusCode: number; body: { kind: 'text' | 'html'; content: string }; truncated: boolean }

- snippet 单行、≤400 字;author 以 · 作者 附在末尾。
- publishedAt 一律 YYYY-MM-DD;Tavily 需显式请求 include_published_date 才有,Firecrawl 只有少数结果带。
- Exa 没有 snippet:不请求 contents 之后,它的结果只剩链接、标题和日期。
- content 只装降级 notice(我们不向厂商要答案);抓取降级也会附 > provider notice: fell back ...。
- 错误码:WEB_PROVIDER_UNAUTHORIZED / _QUOTA_EXCEEDED / _RATE_LIMITED / _BAD_REQUEST / _UPSTREAM / _UNREACHABLE / _EMPTY / _CREDENTIAL_MISSING、WEB_ABORTED、WEB_INVALID_URL、WEB_BLOCKED_URL。

各后端的实际请求参数

| | 搜索 | 抓取 |
| Tavily | max_results=5、search_depth(basic)、topic(general)、include_published_date | /extract |
| Exa | numResults=5、type(auto),无 contents | /contents(text: true) |
| Firecrawl | limit=5、sources=['web'] | /v2/scrape(markdown、onlyMainContent、48h 缓存) |

这些都能在 YAML 里覆盖,见上一节。

行为

- web_search 多 query = 多次厂商调用(工具层并发 fan-out 后合并)。
- 抓取结果一律 text:三家给的都是 markdown/文本,标成 html 会让工具层再转一遍。
- 抓取降级:厂商报错/额度/无密钥/空正文/超时 → 本地抓取并附带 notice;目标页 4xx 是结果不降级;abort 不降级。
- 搜索不降级:选中的后端没配密钥就报 WEB_PROVIDER_CREDENTIAL_MISSING。

本地抓取只做协议白名单、明文内网/回环地址拦截、逐跳重定向校验与字节上限,没有官方 dsh-web-fetch-http 的 DNS 解析+公网校验+连接钉扎。要那层保护就关掉 fallbackToHttp。

开发

- index.js:两层设置 + 归一化层 + 两个 provider + 两条 Host 路由,零第三方依赖。
- client.js:设置页(两个下拉 + 通用选项 + 三家密钥)。
- node test/smoke.mjs:20 项离线测试。

改完代码需要重启一次 Harness 才会加载新的 host 实现;设置页刷新页面即可。

License

MIT
预览分享卡片长什么样 ↓nhhc-lxr/dsh-web-tool-provider
分享 · DeepSeek Harness Hub
nhhc-lxr/dsh-web-tool-provider

切换搜索与抓取引擎,统一结果格式并管理密钥

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部