dsh-firecrawl:为 DeepSeek Harness 接入 Firecrawl 联网搜索与抓取

前言

DeepSeek Harness(DSH)内置了 web_searchweb_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_searchweb_fetch 分别指向 Firecrawl 的搜索与抓取后端。

当前版本 0.1.0,MIT 许可证,支持 @deepseek-ai/dsh@0.1.0-rc.6,Node.js 要求 ^22.19.0 || >=24.0.0。DSH 仍处于开发者预览阶段,后续 Harness 版本升级可能需要同步更新插件。

核心功能

插件注册 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 关掉,只保留搜索。

安装与启用

开始前准备:

  1. pnpm 10 或更新版本;
  2. Firecrawl API Key
  3. 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.yamlallowBuilds,步骤较繁琐。

验证安装

检查合并后的 profile 配置:

npx --yes @deepseek-ai/dsh@0.1.0-rc.6 \
  --profile web --dump-config | \
  grep -E 'searchProvider: firecrawl|fetchProvider: firecrawl|@firecrawl/dsh-firecrawl'

预期能看到 searchProviderfetchProvider 均为 firecrawl,以及两个插件条目 web-search-firecrawlweb-fetch-firecrawl。内置的 web-search-deepseek 同时存在是正常的,实际搜索由 searchProvider 决定。

再向智能体提一个需要实时网页信息的问题(例如询问 Firecrawl 近期 changelog)。对话记录里出现 web_searchweb_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_searchweb_fetch 的后端实现。对需要稳定联网、又不想在本地直连模型指定 URL 的场景,它把抓取和搜索统一托管到 Firecrawl,同时补上了 base bundle 默认关闭的 web_fetch 能力。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜