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

插件合集 CREAIT-nl/dsh-plugins

DeepSeek Harnessv0.1.2
CREAIT-nl69 天前有提交已提供中文文档扫描:含敏感能力

为自托管模型补齐研究、限额与抓取能力

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
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 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。
此处其他所有内容均为原创。
预览分享卡片长什么样 ↓CREAIT-nl/dsh-plugins
分享 · DeepSeek Harness Hub
CREAIT-nl/dsh-plugins

为自托管模型补齐研究、限额与抓取能力

这是你的仓库?认领条目

回到顶部