为自托管模型补齐研究、限额与抓取能力
36.6/100
综合分
5
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add CREAIT-nl/dsh-plugins该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 69 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-plugins @ 0.1.2
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 00:49:24
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 55 处,展示前 54 条)
- 发起网络请求gen-limit/client/client.cjs:84
return fetch(url, { headers: { accept: 'application/json' } }) - 发起网络请求gen-limit/client/client.cjs:268
fetch(CONFIG_ROUTE, { - 发起网络请求gen-limit/client/client.cjs:346
fetch(CONFIG_ROUTE, { - 发起网络请求gen-limit/lib/transport.js:167
const previous = getGlobalDispatcher(); - 发起网络请求gen-limit/lib/transport.js:170
routes.set(origin, new Agent({ - 发起网络请求gen-limit/lib/transport.js:177
setGlobalDispatcher(router); - 发起网络请求gen-limit/lib/transport.js:184
if (getGlobalDispatcher() === router) setGlobalDispatcher(previous); - 发起网络请求gen-limit/lib/transport.js:184
if (getGlobalDispatcher() === router) setGlobalDispatcher(previous); - 发起网络请求hookkit/lib/handlers.js:125
const response = await fetch(url, { - 发起网络请求research-mode/client/client.cjs:97
return fetch(url, { - 读取本地文件research-mode/lib/preset-install.js:53
if (!existsSync(path)) continue; - 读取本地文件research-mode/lib/preset-install.js:55
digest.update(file).update('\0').update(readFileSync(path)).update('\0'); - 读取本地文件research-mode/lib/preset-install.js:67
const parsed = JSON.parse(readFileSync(join(home, STATE_FILE), 'utf8')); - 写入本地文件research-mode/lib/preset-install.js:78
mkdirSync(dirname(path), { recursive: true }); - 写入本地文件research-mode/lib/preset-install.js:79
writeFileSync(path, `${JSON.stringify(state, null, 2)}\n`, 'utf8'); - 写入本地文件research-mode/lib/preset-install.js:87
mkdirSync(target, { recursive: true }); - 读取本地文件research-mode/lib/preset-install.js:88
for (const file of PRESET_FILES) writeFileSync(join(target, file), readFileSync(join(source, file)), 'utf8'); - 写入本地文件research-mode/lib/preset-install.js:88
for (const file of PRESET_FILES) writeFileSync(join(target, file), readFileSync(join(source, file)), 'utf8'); - 读取本地文件research-mode/lib/preset-install.js:100
if (!existsSync(source)) return results; - 读取本地文件research-mode/lib/preset-install.js:108
shipped = readdirSync(source, { withFileTypes: true }); - 发起网络请求tailnet-gateway/client/client.cjs:103
return fetch(url, { headers: { accept: 'application/json' } }) - 发起网络请求tailnet-gateway/client/client.cjs:294
return fetch(CONFIG_ROUTE, { - 执行外部命令固定命令tailnet-gateway/lib/tailnet.js:86
execFile( - 发起网络请求think-level/client/client.cjs:132
return fetch(url, { - 发起网络请求to-english/client/client.cjs:112
return fetch(url, { headers: { accept: 'application/json' } }) - 发起网络请求to-english/client/client.cjs:286
fetch(CONFIG_ROUTE, { - 发起网络请求to-english/client/client.cjs:301
fetch(TRANSLATE_ROUTE, { - 读取本地文件to-english/lib/reload.js:58
if (existsSync(join(dir, 'package.json'))) { - 读取本地文件to-english/lib/translate.js:145
entries = readdirSync(dir, { withFileTypes: true }); - 读取本地文件to-english/lib/translate.js:166
if (englishSiblings(entry.name).some((sibling) => existsSync(join(dir, sibling)))) continue; - 写入本地文件to-english/lib/translate.js:765
writeFileSync(probe, text, 'utf8'); - 执行外部命令来自配置/变量to-english/lib/translate.js:766
execFileSync(process.execPath, ['--check', probe], { stdio: 'pipe' }); - 删除本地文件to-english/lib/translate.js:772
try { unlinkSync(probe); } catch { } - 读取本地文件to-english/lib/translate.js:1068
size = statSync(file).size; - 读取本地文件to-english/lib/translate.js:1091
const original = readFileSync(file, 'utf8'); - 读取本地文件to-english/lib/translate.js:1135
if (!existsSync(backup)) copyFileSync(file, backup); - 写入本地文件to-english/lib/translate.js:1135
if (!existsSync(backup)) copyFileSync(file, backup); - 写入本地文件to-english/lib/translate.js:1136
writeFileSync(file, text, 'utf8'); - 读取本地文件to-english/lib/translate.js:1173
return hasCjk(readFileSync(f, 'utf8')); - 读取本地文件to-english/lib/watcher.js:48
const manifest = JSON.parse(readFileSync(join(packageDir, 'package.json'), 'utf8')); - 写入本地文件to-english/lib/wholefile.js:117
writeFileSync(probe, text, 'utf8'); - 执行外部命令来自配置/变量to-english/lib/wholefile.js:124
execFileSync(process.execPath, ['--check', probe], { stdio: 'pipe' }); - 删除本地文件to-english/lib/wholefile.js:130
try { unlinkSync(probe); } catch { } - 读取本地文件to-english/lib/wholefile.js:150
if (existsSync(manifest)) { - 读取本地文件to-english/lib/wholefile.js:152
return JSON.parse(readFileSync(manifest, 'utf8'))?.type === 'module' ? 'module' : 'commonjs'; - 读取本地文件to-english/lib/wholefile.js:229
const original = readFileSync(file, 'utf8'); - 读取本地文件to-english/lib/wholefile.js:275
if (!existsSync(backup)) copyFileSync(file, backup); - 写入本地文件to-english/lib/wholefile.js:275
if (!existsSync(backup)) copyFileSync(file, backup); - 写入本地文件to-english/lib/wholefile.js:276
writeFileSync(file, candidate, 'utf8'); - 发起网络请求tool-disclosure/client/client.cjs:113
return fetch(url, { headers: { accept: 'application/json' } }) - 发起网络请求tool-disclosure/client/client.cjs:288
fetch(CONFIG_ROUTE, { - 发起网络请求web-fetch/lib/index.js:260
async fetch(request, signal) { - 发起网络请求web-fetch/lib/index.js:276
response = await globalThis.fetch(target, { - 发起网络请求web-search-searxng/lib/index.js:316
response = await fetch(url, {
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 深度研究智能体预设
- 按模型限制生成
- 网页抓取与搜索
DeepSeek Harness 插件:把深度研究做成智能体预设、按模型限制生成、兼容 Claude Code 钩子,还有网页抓取/搜索工具。
README
由 DeepSeek 最新模型翻译生成dsh-plugins
DeepSeek Harness 的插件。一个仓库,九个包,以 @creait 名义独立发布。它们源于将 dsh 运行在自托管模型上的实践,每个都填补了 harness 留下的一个空白。
| 包 | 功能 | 原因 |
| hookkit@creait/dsh-hookkit | 配置驱动的生命周期钩子,包括上下文注入。在 YAML 中声明 event → handler → outcome。 | dsh 有这些接缝(agent/pre-step、tools/pre-execute、……),但要触及它们就得写一个插件。这将其变成了配置。 |
| gen-limit@creait/dsh-gen-limit | 按提供商/模型的并发上限,在子代理生成时和流式传输时强制执行,并带有设置卡片。 | 一块自托管 GPU 有真实的容量上限;子代理的扇出会撞上它。拒绝生成胜过让孩子不透明地死去。 |
| web-search-searxng@creait/dsh-web-search-searxng | 将 web_search 指向自托管的 SearXNG 实例,而不是原生路由。 | 无需将每个查询交给第三方即可搜索。
展开完整文档(README 剩余 1 节)
dsh-plugins
DeepSeek Harness 的插件。一个仓库,九个包,以 @creait 名义独立发布。它们源于将 dsh 运行在自托管模型上的实践,每个都填补了 harness 留下的一个空白。
| 包 | 功能 | 原因 |
| hookkit@creait/dsh-hookkit | 配置驱动的生命周期钩子,包括上下文注入。在 YAML 中声明 event → handler → outcome。 | dsh 有这些接缝(agent/pre-step、tools/pre-execute、……),但要触及它们就得写一个插件。这将其变成了配置。 |
| gen-limit@creait/dsh-gen-limit | 按提供商/模型的并发上限,在子代理生成时和流式传输时强制执行,并带有设置卡片。 | 一块自托管 GPU 有真实的容量上限;子代理的扇出会撞上它。拒绝生成胜过让孩子不透明地死去。 |
| web-search-searxng@creait/dsh-web-search-searxng | 将 web_search 指向自托管的 SearXNG 实例,而不是原生路由。 | 无需将每个查询交给第三方即可搜索。 |
| web-fetch@creait/dsh-web-fetch | 位于 ctx.web 之后的受保护本地抓取提供商,对解析后的地址进行 SSRF 拦截。 | dsh 完整实现了 web_fetch 但没有附带任何提供商,因此该工具存在但每次调用都失败。 |
| research-mode@creait/dsh-research-mode | 深度研究作为一种代理模式:一个固定的、经过审查的循环,负责规划、以自适应并行轮次进行研究、综合和审查。 | 模型每次调用都重写的循环会每次调用都重新犯同样的错误。将其作为预设发布也能让它不进入每个非研究的会话。 |
| think-level@creait/dsh-think-level | 按提供商和模型的推理努力级别,外加一个控件来为你所在的会话更改它。 | dsh 的努力级别下拉菜单是按会话的且不记忆任何地方,因此“这个模型应该努力思考”在每个新对话中都要重新输入。子代理则完全不会被询问。 |
| tool-disclosure@creait/dsh-tool-disclosure | 渐进式工具披露:一组延迟的工具只花费一行目录,直到模型用 tool_search 加载它。 | dsh 在每个请求中宣传每个已挂载的工具。一个 MCP 服务器的 24 个浏览器模式约 4.4k token,向每个会话收费,包括那些从不打开浏览器的会话。 |
| tailnet-gateway@creait/dsh-tailnet-gateway | 一个身份门控的环回网关:从你自己的 Tailscale 设备访问绑定到环回的 dsh,且设置、模型和插件实际可用。 | dsh 将其特权 /api 方法门控在请求看起来是环回上,而 --trusted-host 不会打开那扇门。在 tailnet 上,shell 会加载,但配置它的页面返回 403。 |
| to-english@creait/dsh-to-english | 使用你已配置好的模型,将市场安装的插件中的中文文案改写为英文,同时保护程序自身读取的中文内容。 | 市场上大部分内容都是用中文写的,而粗暴的查找替换会给你一个能读英文但不再工作的插件。 |
hookkit 是通用型的那一个:一个小型引擎,自身不附带任何 hook——13 个生命周期事件 × 3 种处理器类型(进程内工具、shell、HTTP)× 3 种结果(注入上下文、拒绝调用、即发即忘)。正是它让诸如记忆召回这样的功能成为一项配置变更,而非一个插件。其余的都是单一用途。tailnet-gateway 是唯一一个关乎能否访问 dsh 本身,而非你到达之后它能做什么的插件。web-search-searxng 和 web-fetch 都是同一个 ctx.web 接缝的提供者,并且可以组合使用:二者结合,让智能体无需第三方往返即可进行搜索和页面阅读。research-mode 需要挂载 web-fetch——没有它,其研究员只能局限于搜索摘要。to-english 是个异类:它作用于你安装的其他插件,而非作用于某个 harness 接缝。
安装
每个包都独立安装——你不需要其他包:
dsh plugin --profile web add @creait/dsh-hookkit
每个包都自带自己的 bundle 补丁,因此该命令会挂载对应条目,而不仅仅是记录依赖。挂载并不等于启用:两个 ctx.web 提供者会自行注册,然后等待被指向某个目标;hookkit 挂载时不声明任何 hook;而 tailnet-gateway 需要在其前面运行 tailscale serve。每个 README 都会说明哪些键能完成这项工作。
开发
这些包从你已安装的 harness 解析其 dsh 对等依赖,而非从注册表解析,因此你始终是针对实际运行的版本进行构建:
DSH="$(npm root -g)/@deepseek-ai/dsh/node_modules/@deepseek-ai"
mkdir -p node_modules/@deepseek-ai
for p in cordis dsh-llm dsh-settings dsh-web schemastery; do
ln -sfn "$DSH/$p" "node_modules/@deepseek-ai/$p"
done
然后:
pnpm test # 九个包共 756 个测试
不要在根目录运行 pnpm install——它会把那些符号链接替换为已发布的副本,而这些副本可能与你实际的 harness 不匹配。
要让某个检出目录针对一个正在运行的 harness 运行,请将该包目录链接到一个 profile 中:
// ~/.dsh/profiles/web/package.json
"dependencies": {
"@creait/dsh-hookkit": "link:/path/to/dsh-plugins/hookkit"
}
然后在 profile 中运行 pnpm install 并重启 dsh web。启动清单是在启动时构建的,因此添加插件需要重启——而编辑一个已链接的插件则不需要。
发布
各版本相互独立;只发布有变更的内容:
cd hookkit && npm publish --access public
pnpm publish-changed 会处理所有版本尚未出现在注册表上的包(先加上 --dry-run 查看计划)。带作用域的包
默认设为 restricted,因此 --access public 在包的首次发布时很重要。
注意事项
这九个包都绑定到 1.0 之前的内部 dsh 接缝,不保证兼容性。
peerDependencies 固定了每个包构建时所针对的版本;一次 harness 升级就可能改变它们。每个 README 都有一个“What breaks this”部分。
许可证
MIT。
research-mode 的循环设计移植自 dsh-deep-research
(MIT,Copyright (c) 2026 dsh2026);鸣谢见 research-mode/LICENSE。
此处其他所有内容均为原创。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
CREAIT-nl/dsh-plugins
为自托管模型补齐研究、限额与抓取能力
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个插件,给…
★ 850已汉化DSH
68.9
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 385已汉化DSH
67.9
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1
这是你的仓库?认领条目