DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Ben Dsh Crawl4ai — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
B

ben-dsh-crawl4ai

Ben Dsh Crawl4ai

基于 Crawl4AI 的 DeepSeek Harness 网页抓取提供程序——web_fetch 通过您自己的 Crawl4AI 服务器渲染 JavaScript 密集型页面,并返回整洁的 Markdown。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:arale-soft/ben-dsh-crawl4ai#cb1bcce0d28c77a9e75d8ffe85f0196e4a26122b
README兼容性版本

兼容性与来源证明

Ben Dsh Crawl4ai 以 ben-dsh-crawl4ai 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/13

版本

0.1.0stable
2026/10/13

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/16
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 search-research 分类下经过校验的插件。

Free Searchdsh-free-searchDeepSeek Harness 的免费网页搜索:24 个引擎(Bing/DuckDuckGo/AnySearch/SearXNG/Exa/Tavily/Keenable/Firecrawl/Parallel 无需密钥;通过 MCP 使用 Zhihu 全局/站内搜索,以及 Perplexity/SerpBase/DeepSeek/You.com/Baidu/Kimi/Aliyun/Doubao,需密钥;OpenAI/Gemini/ClaudeDejadsh-dejaDeepSeek Harness 的 deja-vu 记忆:其他 40 个编码代理的会话历史,可搜索,并在每个步骤前调用——本地索引,无需 LLM。Builtin Browserdsh-builtin-browser适用于 DeepSeek Harness 的共享真实浏览器插件:安装即用——可由人类接管的可见原生浏览器,并由代理通过 CDP 驱动。DOM 级交互(兼容 React/Vue)、按任务隔离会话、Cookie 持久化(dsh_browser_auth)、CBladebrobladebro面向 AI 智能体的隐蔽高效代理式浏览器驱动。工具少、控制全面、真正隐匿,并最大限度提高令牌效率。

README

ben-dsh-crawl4ai

A Crawl4AI-backed WebFetchProvider for the DeepSeek Harness web capability seam (ctx.web).

Crawl4AI drives a real browser, so a page that a plain HTTP fetch sees as an empty <div id="app"> arrives here as rendered Markdown — including the code blocks, tables, and lazily-loaded text that only exist after JavaScript runs.

This is an implementation package: it registers a provider into ctx.web and does not register a model-facing tool. @deepseek-ai/dsh-tool-web owns web_fetch — its schema, its prompt guidance, and its result card — so installing this package makes that existing tool render pages through Crawl4AI instead of a plain fetch.

Provider idben-crawl4ai
Registersctx.web.registerFetchProvider(...)
Configureson the Plugins page, on this package's ben-crawl4ai row
Requiresa reachable Crawl4AI server (0.9.x tested)

English | 中文

Install

dsh plugin --profile <name> add github:you/ben-dsh-crawl4ai   # or an absolute path

The package declares dsh.bundle, so the install also activates it: the bundle patch inserts the provider row and selects it on the web row.

Developing in place (link: installs need one extra step)

dsh plugin add <absolute path> records the dependency as link:<path>, which makes node_modules/ben-dsh-crawl4ai inside the profile a junction back to your working copy. Node resolves a module's import specifiers from its real path, so the walk up for @deepseek-ai/… starts in your working copy and never reaches the profile's resolution root — and a published plugin, which pnpm materializes inside the profile, does not have this problem.

One command reproduces that reachability:

node scripts/link-harness-deps.mjs

It junctions each package named in peerDependencies from the harness's own install into this directory's node_modules, preferring the profile tier so this plugin shares the harness's module instances rather than copies. Re-run it after changing peerDependencies. It defaults to $DSH_PROFILE_DIR/../node_modules, which the harness sets for its child processes; pass --root <node_modules> otherwise.

Configuration

Everything lives on Plugins → this package → the ben-crawl4ai row → Configure. The page stages what you type and writes only on Save, through the shell's own settings surface (ctx.configForms), so an edit reaches the next web_fetch without a restart.

FieldMeaning
Crawl4AI URLServer root, e.g. http://crawl4ai.internal:11235. Unset or not http(s) makes the provider report unavailable, and web_fetch says so instead of failing every call.
Auth header namee.g. Authorization or X-API-Key. Blank sends no authenticating header.
Auth header valueSent as that header's value. Rendered masked; blank sends no authenticating header — the name and the value take effect together.

Both header fields are independent, so a deployment can use any header name or none at all.

The values are stored in the active profile's patch ($DSH_HOME/profiles/<profile>/cordis.patch.yml), in plain text. This is a fetch back end reading its own token, not a per-user credential, and the masked control keeps it off the screen rather than out of the file. Two further fields stay off the page because they are deployment concerns, edited in YAML instead:

KeyDefaultMeaning
timeoutMs60000Resource backstop for one crawl. Keep it below the model-facing tool budget (tool-web's timeoutMs) so a slow server surfaces as a provider failure.
maxContentChars200000Cap on the Markdown returned for one page; a longer page sets truncated.

A patch row replaces the targeted row's whole config, so restate every key you want to keep.

Provider selection is required

The bundle patch sets web.fetchProvider: ben-crawl4ai, and that is not politeness: @deepseek-ai/dsh-web-fetch-http is mounted alongside this package and its available() is unconditionally true, so two fetch providers are usable at once. The seam auto-selects only when exactly one is, and otherwise fails every call with WEB_PROVIDER_AMBIGUOUS.

A patch replaces the whole config of the row it targets, and a profile patch is applied after every bundle layer — so if you also pin searchProvider on the web row, restate fetchProvider: ben-crawl4ai there too.

The server contract

One fetch is POST <base>/crawl with {"urls": ["<url>"]} and the configured header. The response is Crawl4AI's { success, results: [ … ] }, and the first result supplies the final URL (redirected_url over url), the target's own status_code, and its markdown object, from which fit_markdown is preferred and an empty fit_markdown falls through to raw_markdown (the server returns fit_markdown: "" unless a fit filter was requested).

A server that does not serve /crawl (an older build, or a proxy that exposes only part of the API) answers 404/405 and is retried once against /md, which returns the same content without the target's status or final URL.

A non-2xx target page is a result, not an error — the status is part of the fetched resource, so it is returned with whatever body Crawl4AI extracted. A throw is reserved for failing to retrieve the page at all.

Errors

Failures are WebErrors the tool layer renders in a tool result.

SituationCode
Caller cancelledWEB_ABORTED
timeoutMs elapsedWEB_FETCH_TIMEOUT
Requested URL is not absolute http(s)WEB_INVALID_URL
No Crawl4AI URL configuredWEB_PROVIDER_ERROR (and available() is false)
Server refused the request (401/403)WEB_PROVIDER_ERROR, naming the auth header
Server unreachable, 5xx, or a non-JSON bodyWEB_PROVIDER_ERROR
Server produced no result or no contentWEB_PROVIDER_ERROR

Tests

node --test test/crawl4ai.test.mjs test/client.test.mjs   # offline

crawl4ai.test.mjs covers the HTTP contract and mapping against a stubbed fetch. client.test.mjs evaluates the browser bundle with the module loader stubbed, so a stray @deepseek-ai/* import, an unknown primitive name, or a slot key that does not match the inserted row fails the suite instead of breaking the Web UI.

Two suites need a live server and skip without one:

$env:CRAWL4AI_URL='https://ca.example:1443'
$env:CRAWL4AI_AUTH_HEADER_NAME='Authorization'
$env:CRAWL4AI_AUTH_HEADER_VALUE='Bearer …'
node --test test/seam.test.mjs          # registers into the REAL ctx.web and fetches
node --test test/crawl4ai.test.mjs      # includes a live crawl

seam.test.mjs is the end-to-end one: it mounts @deepseek-ai/dsh-web, applies this plugin, and dispatches a fetch through the seam, covering selection by id, the unavailable gate, and that a volatile row edit reaches the very next call.

Known limitations

  • Markdown only. The seam's body kinds are html and text; this provider always returns text, so dsh-tool-web's HTML-to-Markdown step is skipped rather than applied twice.
  • No crawl tuning. crawler_config is not exposed: scan depth, caching, filters, and screenshots are Crawl4AI features this seam's request shape has nowhere to put.
  • The Crawl4AI server holds the page cache. cache is left at its default, so a repeat fetch may answer from the server's cache.
  • /md loses the target's status. On the fallback path a successful conversion is reported as HTTP 200 by construction.

License

MIT