前言¶
DeepSeek Harness(DSH)内置了 web_search 和 web_fetch 两个联网工具,模型按原有方式发起查询或 URL 请求即可。默认 bundle 里 web_fetch 是关闭的:本地 HTTP 抓取后端没有 SSRF 防护,模型选中的 URL 会直连你机器能访问的任何地址,包括内网。
如果你需要让智能体稳定读取网页正文,又不想在本地打开模型指定的连接,@firecrawl/dsh-firecrawl 提供了一条替代路径:把搜索和抓取都交给 Firecrawl 的基础设施,Harness 进程只向 API 提交请求并拿回 markdown,不直接连模型选的 URL。
这是什么¶
@firecrawl/dsh-firecrawl 是 Firecrawl 团队维护的 DSH 联网插件,分类为「联网工具」。它不新增工具名,而是把 Harness 的 ctx.web 能力缝(capability seam)上的 web_search 与 web_fetch 分别指向 Firecrawl 的搜索与抓取后端。
当前版本 0.1.0,MIT 许可证,支持 @deepseek-ai/dsh@0.1.0-rc.6,Node.js 要求 ^22.19.0 || >=24.0.0。DSH 仍处于开发者预览阶段,后续 Harness 版本升级可能需要同步更新插件。
核心功能¶
搜索(web_search)¶
插件注册 searchProvider: firecrawl,调用 Firecrawl /v2/search 接口。默认只搜 web 源;可在配置里加 news 以获取带发布日期的新闻结果。可选开启 scrapeContent,对每个结果再抓正文 markdown 作为摘要,信息更完整,但会消耗更多额度并增加延迟。
抓取(web_fetch)¶
插件注册 fetchProvider: firecrawl,调用 Firecrawl /v2/scrape 接口,默认输出 markdown、只保留正文(onlyMainContent: true)。相比 Harness 自带的本地抓取,Firecrawl 侧提供 JS 渲染、反爬处理和 PDF 解析,这也是 base bundle 默认不启用本地 web_fetch 时,该插件能补上抓取能力的原因。
安全边界¶
Harness 进程不向模型指定的 URL 发起直连;它把 URL POST 给 Firecrawl API,由 Firecrawl 基础设施去取页面。这降低了本地 SSRF 风险,但 Firecrawl 仍能抓取模型请求的任意公网 URL——并非你事先白名单过的地址。若这一行为不符合部署策略,可通过配置把 web_fetch 关掉,只保留搜索。
安装与启用¶
开始前准备:
- pnpm 10 或更新版本;
- Firecrawl API Key;
- DSH 里已配置好的模型提供商。
无需全局安装 dsh,下面命令通过 npx 固定使用 @deepseek-ai/dsh@0.1.0-rc.6。
先在运行 Harness 的终端里导出 API Key:
export FIRECRAWL_API_KEY="fc-your-key"
把插件装进 web profile:
npx --yes @deepseek-ai/dsh@0.1.0-rc.6 \
plugin --profile web add @firecrawl/dsh-firecrawl
停掉正在运行的 Harness 进程,再重新启动:
npx --yes @deepseek-ai/dsh@0.1.0-rc.6 web
建议走 npm 包安装。若必须从 Git 安装,pnpm 11 会拦截 Git 依赖的 prepare 构建脚本,需按 README 把带 commit SHA 的依赖键写入 ~/.dsh/profiles/web/pnpm-workspace.yaml 的 allowBuilds,步骤较繁琐。
验证安装¶
检查合并后的 profile 配置:
npx --yes @deepseek-ai/dsh@0.1.0-rc.6 \
--profile web --dump-config | \
grep -E 'searchProvider: firecrawl|fetchProvider: firecrawl|@firecrawl/dsh-firecrawl'
预期能看到 searchProvider 和 fetchProvider 均为 firecrawl,以及两个插件条目 web-search-firecrawl 与 web-fetch-firecrawl。内置的 web-search-deepseek 同时存在是正常的,实际搜索由 searchProvider 决定。
再向智能体提一个需要实时网页信息的问题(例如询问 Firecrawl 近期 changelog)。对话记录里出现 web_search 或 web_fetch 卡片,说明工具已生效。
典型用法与配置¶
默认配置即可工作。需要调参时,编辑 ~/.dsh/profiles/web/cordis.patch.yml(用户层覆盖优先级最高)。
搜索示例——同时搜网页与新闻,并抓取每条结果的正文摘要:
- id: web-search-firecrawl
config:
sources: [web, news]
scrapeContent: true
maxCharsPerResult: 4000
抓取示例——强制新鲜抓取、使用 stealth 代理应对反爬:
- id: web-fetch-firecrawl
config:
proxy: stealth
maxAgeMs: 0
若只想保留搜索、关闭抓取:
- id: tool-web
config:
fetch: false
API Key 应放在环境变量 FIRECRAWL_API_KEY 中,不要写进 cordis.patch.yml(该文件以明文存储)。
卸载插件:
npx --yes @deepseek-ai/dsh@0.1.0-rc.6 \
plugin --profile web remove @firecrawl/dsh-firecrawl
卸载后需重启 Harness。
适用场景与注意¶
适合谁: 已在用 DSH web profile、需要联网搜索和网页正文读取,且愿意用 Firecrawl 额度换取 JS 渲染与反爬能力的开发者。
运行权限: 插件随当前 DSH 进程加载,继承该进程的环境与网络访问范围。安装前建议阅读 源码仓库 与 MIT 许可证,确认符合你的安全与合规要求。
常见报错:
WEB_PROVIDER_CONFIGURED_UNAVAILABLE:启动 Harness 的终端未设置FIRECRAWL_API_KEY。WEB_PROVIDER_AMBIGUOUS:多个搜索 provider 可用但缺少searchProvider锁定,需恢复为firecrawl。- provider 仍是
deepseek-official:重启 Harness,并检查你自己的cordis.patch.yml是否覆盖了searchProvider。
模型自行决定是否调用 web_search;若回答未联网,换用明确需要当前信息的提示词再试。
结尾¶
@firecrawl/dsh-firecrawl 不改动 Harness 的工具接口,只替换 web_search 和 web_fetch 的后端实现。对需要稳定联网、又不想在本地直连模型指定 URL 的场景,它把抓取和搜索统一托管到 Firecrawl,同时补上了 base bundle 默认关闭的 web_fetch 能力。