DeepSeek Harness 中文多智能体插件「百工」:天枢统筹 12 位专家,证据门禁、多层模型路由与回退、内嵌…
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/zhairy/dsh-agent-swarm.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
生态插件
可安装,未声明 dsh 能力
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-agent-swarm(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.19.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/15 20:11:15
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 88 处,展示前 74 条)
- 读取本地文件src/artifacts.ts:30
export const getWorkspaceId = async (workspace: string, profile = ''): Promise<string> => getValueDigest({ workspace: await realpath(workspace), profi - 读取本地文件src/artifacts.ts:34
const root = await realpath(workspace) - 读取本地文件src/artifacts.ts:52
try { canonical = await realpath(path) } - 读取本地文件src/artifacts.ts:58
try { if (!isInside(root, await realpath(parent))) { addUnknown(label, '父目录链接指向工作区外'); return }; break } - 读取本地文件src/artifacts.ts:66
const info = await lstat(canonical).catch(() => undefined) - 读取本地文件src/artifacts.ts:69
const children = await readdir(canonical).catch(() => undefined) - 写入本地文件src/event-journal.ts:140
mkdirSync(dirname(path), { recursive: true, mode: 0o700 }) - 读取本地文件src/event-journal.ts:141
let loaded = existsSync(path) ? parseAndValidate(readFileSync(path, 'utf8'), input.rootSessionId) : { events: [], issues: [], validBytes: 0 } - 读取本地文件src/event-journal.ts:141
let loaded = existsSync(path) ? parseAndValidate(readFileSync(path, 'utf8'), input.rootSessionId) : { events: [], issues: [], validBytes: 0 } - 写入本地文件src/event-journal.ts:144
writeFileSync(path, prefix === '' ? '' : `${prefix}\n`, { encoding: 'utf8', mode: 0o600 }) - 写入本地文件src/event-journal.ts:161
appendFileSync(path, line, { encoding: 'utf8', mode: 0o600 }) - 读取本地文件src/evidence-assessment.ts:193
const root = await realpath(cwd) - 读取本地文件src/evidence-assessment.ts:195
const target = await realpath(resolve(root, path)) - 读取本地文件src/evidence-assessment.ts:200
const privateRoot = await realpath(resolve(root, denied)).catch(() => resolve(root, denied)) - 读取本地文件src/evidence-assessment.ts:208
const beforePath = await stat(target) - 读取本地文件src/evidence-assessment.ts:210
if (!before.isFile() || before.size > policy.maxSourceBytes || before.dev !== beforePath.dev || before.ino !== beforePath.ino || await realpath(resolv - 读取本地文件src/evidence-assessment.ts:222
const afterPath = await stat(target) - 写入本地文件src/evidence.ts:391
mkdirSync(dir, { recursive: true }) - 写入本地文件src/evidence.ts:393
appendFileSync(path, `${JSON.stringify(line)}\n`, 'utf8') - 读取本地文件src/evidence.ts:409
text = readFileSync(path, 'utf8') - 写入本地文件src/feature-session.ts:546
await mkdir(healthDirectory, { recursive: true, mode: 0o700 }) - 读取本地文件src/feature-session.ts:547
const metadata = await lstat(healthDirectory) - 读取本地文件src/feature-session.ts:554
try { raw = await readFile(healthPath, 'utf8') } catch (error) { - 写入本地文件src/feature-session.ts:574
await mkdir(historyDirectory, { recursive: true, mode: 0o700 }) - 读取本地文件src/feature-session.ts:575
const metadata = await lstat(historyDirectory) - 发起网络请求src/index.ts:96
const fetchImpl: typeof fetch = (input, init) => globalThis.fetch(input, init) - 发起网络请求src/index.ts:121
return { fetch: (request: Request) => handler.fetch(request, quotaPeer as never) } - 发起网络请求src/jev.ts:286
const response = await deps.fetch(`${baseUrl}${path}`, { - 读取本地文件src/memory-handoff.ts:88
try { original = await lstat(pending, { bigint: true }) } catch (error) { if (missing(error)) return undefined; fail('FILE_READ') } - 读取本地文件src/memory-handoff.ts:95
try { metadata = await lstat(directory, { bigint: true }) } catch { fail('DIRECTORY_READ') } - 读取本地文件src/memory-handoff.ts:123
const current = await lstat(pending, { bigint: true }) - 写入本地文件src/memory-handoff.ts:129
await rename(pending, destination) - 读取本地文件src/memory-handoff.ts:131
const moved = await lstat(destination, { bigint: true }) - 写入本地文件src/message-bus.ts:94
await mkdir(directory, { mode: 0o700 }).catch((error: unknown) => { if ((error as NodeJS.ErrnoException)?.code !== 'EEXIST') throw error }) - 读取本地文件src/message-bus.ts:95
const metadata = await lstat(directory) - 读取本地文件src/message-bus.ts:103
const metadata = await lstat(path).catch(() => undefined) - 读取本地文件src/message-bus.ts:105
const raw = await readFile(path, 'utf8') - 发起网络请求src/network.ts:88
await deps.fetch(url, { method: 'HEAD', signal: controller.signal, redirect: 'manual' }) - 读取本地文件src/preset-registration.ts:33
const raw = await readFile(new URL('../presets/declarations.json', moduleUrl), 'utf8') - 读取本地文件src/project-discovery.ts:21
const root = await realpath(cwd) - 读取本地文件src/project-discovery.ts:22
const privateRoots = await Promise.all((options.privateRoots ?? []).map(async (path) => { try { return await realpath(path) } catch { return path } }) - 读取本地文件src/project-discovery.ts:24
try { directoryRoot = await realpath(join(root, input.path ?? '.')) } - 读取本地文件src/project-discovery.ts:35
for await (const entry of await opendir(directory)) { - 发起网络请求src/quota.ts:303
export const createSubscriptionQuotaInvoker = (getHandler: () => { fetch(request: Request): Promise<Response> } | ((request: Request) => Promise<Respo - 发起网络请求src/quota.ts:309
const response = await (typeof handler === 'function' ? handler(request) : handler.fetch(request)) - 读取本地文件src/rpc.ts:156
asset ??= readFile(require.resolve('mermaid/dist/mermaid.min.js')).then((value) => { - 读取本地文件src/service.ts:1120
readFile: deps.readFile ?? (async (path) => new Uint8Array(await readFile(path))), - 读取本地文件src/skills.ts:62
text = readFileSync(path, 'utf8') - 删除本地文件src/state-store.ts:93
try { await handle.writeFile(content, 'utf8'); await handle.sync() } catch (error) { await unlink(temporary).catch(() => undefined); throw error } fin - 写入本地文件src/state-store.ts:94
try { await rename(temporary, join(directory, name)); await syncDirectory(directory) } catch (error) { await unlink(temporary).catch(() => undefined); - 删除本地文件src/state-store.ts:94
try { await rename(temporary, join(directory, name)); await syncDirectory(directory) } catch (error) { await unlink(temporary).catch(() => undefined); - 读取本地文件src/state-store.ts:102
const metadata = await lstat(path) - 读取本地文件src/state-store.ts:104
raw = await readFile(path, 'utf8') - 读取本地文件src/state-store.ts:110
if (await readFile(path, 'utf8') !== raw) return false - 删除本地文件src/state-store.ts:111
await unlink(path) - 读取本地文件src/state-store.ts:200
const metadata = await lstat(ownerPath, { bigint: true }) - 删除本地文件src/state-store.ts:202
await unlink(ownerPath) - 读取本地文件src/state-store.ts:213
const existingFile = async (path: string): Promise<boolean> => lstat(path).then(() => true, () => false) - 读取本地文件src/state-store.ts:219
const metadata = await lstat(snapshotPath) - 写入本地文件src/state-store.ts:264
await mkdir(snapshotDirectory, { recursive: true, mode: 0o700 }) - 删除本地文件src/state-store.ts:284
await unlink(join(snapshotDirectory, entry)).catch(() => undefined) - 删除本地文件src/state-store.ts:287
await unlink(join(directory, 'snapshot.json')).catch(() => undefined) - 写入本地文件src/state-store.ts:291
await mkdir(directory, { recursive: true, mode: 0o700 }) - 读取本地文件src/tools.ts:45
version = (JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) as { version?: string }).version ?? 'unknown' - 执行外部命令来自配置/变量src/util/git.ts:15
execFile(command, args, { cwd, maxBuffer: 16 * 1024 * 1024, windowsHide: true }, (error, stdout) => { - 读取本地文件src/util/workspace-lease.ts:51
try { raw = await readFile(ownerPath(state), 'utf8') } catch (error) { return (error as NodeJS.ErrnoException)?.code === 'ENOENT' } - 读取本地文件src/util/workspace-lease.ts:56
if (await readFile(ownerPath(state), 'utf8') !== raw) return false - 删除本地文件src/util/workspace-lease.ts:57
await unlink(ownerPath(state)) - 写入本地文件src/util/workspace-lease.ts:64
await mkdir(state.ownerDirectory, { recursive: true, mode: 0o700 }) - 读取本地文件src/util/workspace-lease.ts:65
if ((await lstat(state.ownerDirectory)).isSymbolicLink()) throw new WorkspaceLeaseError('LEASE_INVALID', 'Owner directory cannot be a symlink') - 删除本地文件src/util/workspace-lease.ts:101
await unlink(ownerPath(state)) - 删除本地文件src/util/workspace-lease.ts:108
if (waiter.signal?.aborted) { await unlink(ownerPath(state)); waiter.reject(new WorkspaceLeaseError('ABORTED', 'Lease cancelled before execution')); c - 读取本地文件src/util/workspace-lease.ts:126
const canonical = await realpath(cwd) - 读取本地文件src/workflow.ts:14
const value = JSON.parse(readFileSync(require.resolve('mermaid/package.json'), 'utf8')) as { version?: unknown }
扫描于 2026/11/3(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cosmokit@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 调度十二位中文专家
- 证据门禁验收
- 多层模型路由与回退
README
由 DeepSeek 最新模型翻译生成dsh-agent-swarm
中文 · English
DeepSeek Harness(DSH)的多智能体插件:「天枢」主持 12 位中文专家(谋定、枢机、算衡、探微、博闻、观象、铸剑、行舟、疾风、御史、复核、妙笔),用任务卡、门禁和真实证据决定是否验收;模型路由按你的订阅配置多层回退,故障时立即切到可用备用,最后一个可用模型短时故障时在预算内等待恢复。
- 适配 DSH 0.2.0 / 0.2.1(>=0.2.0-rc.2 <0.2.2-0,推荐 0.2.1-rc.3)与 Node.js 22.12 及以上
- 新建会话选「百工模式」即可使用;Jev API key 可选
3.1.8 的变化
- 子智能体「模型与恢复」改为黄色圆角按钮,失败后可从此入口调整模型并安全继续任务。
- 修复模型目录的零参数 RPC 被误传取消信号而失败的问题。供应商、模型和推理强度始终使用下拉框;目录加载失败可刷新,目录外选项无法提交。
- Google Antigravity 的独立模型额度按模型处理并保留实际重置时间。Argon 耗尽不影响仍可用的 Flash,其他模型的 0% 用量不能证明当前模型还有额度。
- 保留现有自动跨模型回退。DSH 0.2.2-alpha.2 的真实恢复测试未通过,本版明确排除 0.2.2,继续使用已验证宿主。
展开完整文档(README 剩余 1 节)
dsh-agent-swarm
中文 · English
DeepSeek Harness(DSH)的多智能体插件:「天枢」主持 12 位中文专家(谋定、枢机、算衡、探微、博闻、观象、铸剑、行舟、疾风、御史、复核、妙笔),用任务卡、门禁和真实证据决定是否验收;模型路由按你的订阅配置多层回退,故障时立即切到可用备用,最后一个可用模型短时故障时在预算内等待恢复。
- 适配 DSH 0.2.0 / 0.2.1(>=0.2.0-rc.2 <0.2.2-0,推荐 0.2.1-rc.3)与 Node.js 22.12 及以上
- 新建会话选「百工模式」即可使用;Jev API key 可选
3.1.8 的变化
- 子智能体「模型与恢复」改为黄色圆角按钮,失败后可从此入口调整模型并安全继续任务。
- 修复模型目录的零参数 RPC 被误传取消信号而失败的问题。供应商、模型和推理强度始终使用下拉框;目录加载失败可刷新,目录外选项无法提交。
- Google Antigravity 的独立模型额度按模型处理并保留实际重置时间。Argon 耗尽不影响仍可用的 Flash,其他模型的 0% 用量不能证明当前模型还有额度。
- 保留现有自动跨模型回退。DSH 0.2.2-alpha.2 的真实恢复测试未通过,本版明确排除 0.2.2,继续使用已验证宿主。
- 本机市场的下载源与 scope 目录误报已单独修复;这些主机配置不随插件包自动安装,详见 升级与回退。
3.1.7 的变化
- 本版是审计与稳定性版本:修复门禁、状态恢复、授权等待、路由恢复与 Jev 端点的正确性问题,并移除从未接入运行时的进化治理任务视图与只读面板。
- 验算门禁只认标注 proof 的已证实结论;复核里任何失败命令都会否决之前的通过;性能验收只接受最后一次编辑之后的最新测量,验收复评读取最近的委派。
- 状态恢复会丢弃日志末尾未确认的半条记录;授权准入按需释放、已答复的旧决定按需回收,critical 结算失败会在下一次进入时受控对账;长任务的在途等待不再累加到上限而把任务判为耗尽。
- 所有 Jev 直通工具发送前替换常见密钥格式,复评脱敏改为线性匹配并整体替换认证方案与组合凭据;非 https(本机回环除外)的 baseUrl 会被拒绝;approvals=deny 覆盖写入或命令时,原生 Codex/Claude 委派改走 API 并记录原因。
- 控制面板轮询不再清掉失败提示,推理强度变化不再误报为切换模型;移除不可用的 maxTokens / maxCostUsd 配置。
- 公开仓库 main 恢复“仅插件”形态;3.1.6 的全部修复已并入本版(3.1.6 未单独创建 GitHub Release)。
3.1.3 的变化
- 百工设置按五类选项卡组织,备用模型链支持拖拽、按钮和键盘排序。
- 修复订阅耗尽与人工换模竞态,恢复委派会重新取得当前任务的执行身份。
- 真实用户问答进入可恢复等待;服务端验收凭证与全历史结构守卫阻止无证据完成和重复空转。
- 适用范围与存储兼容保持向后兼容;内部实施记录只在源码仓库的 GitHub 历史中维护。
3.1.2 的变化
- 原生“任务进度”Tab集中六个图表视角,按需查看任务、版本、节点状态和证据流;rc.3窄屏可从“更多视图”进入。
- 聊天与Tab共享只读读取,支持取消、过期提示、连接隔离和失败恢复;关闭视图不停止长期任务。
- 技能/工具候选保留来源与隔离元数据,不能通过文本复核激活或自动执行。
- 吸收 Ruflo 的工作区、只读投影与来源化候选设计;内部迭代记录不进入发布包。
3.1.1 的变化
- 规划审核会话识别为百工子会话,实际模型由宿主请求记录展示;模型与恢复面板区分实际调用和后续选择。
- 一次性审核可选择下一请求模型,当前请求不中断;连续专家保留取消、沉寂确认和安全继续流程。
- 失效上下文引用返回当前任务授权索引,重新选择 ref/digest 即可继续读取;不恢复旧版本权限。
- 文件发现支持相对子目录、有界索引与输出;宿主搜索容量溢出和 Fetch 404 保留原错误并说明恢复方式。
- 已复核经验的适用条件参与有界检索;自我进化按发布说明分阶段提供。
- 真正需要人工决定时,天枢调用 ask_user_question,不以重复思考代替授权交互;未答复不表示同意。
3.1.0 的变化
| 变化 | 说明 |
| 长会话不再从某条消息后整段消失 | GitHub Issue #1:swarm-model-call 在分页或长会话的事件窗口缺少 request/header 时不再从 start() 返回 undefined。它返回继承上一状态的隐藏占位,渲染层丢弃该节点,宿主事件订阅器不会中断;下一条调用也不会误报「切换模型」。普通会话同样受保护。 |
| thinking 协议错误不再重复命中 | DeepSeek 返回 The content[].thinking ... must be passed back 时归类为 protocol_incompatible,当前请求立即回退并隔离该路由,避免同一会话反复调用同一不兼容模型。 |
| 目标受阻时给出可执行恢复处方 | swarm_status 新增 blockedRecovery:区分协议不兼容、路由耗尽、规划服务故障、连续无进展、缺门禁和验证缺口,给出推荐角色与下一步。天枢按处方最多做一次只读诊断或对应专家修复,不靠重复改卡、重复评分或重放业务写入恢复。 |
| pnpm 11 本地 tarball 安装说明 | 使用 minimumReleaseAgeIgnoreMissingTime: true,只跳过 registry 中没有发布时间信息的本地包;minimumReleaseAgeExclude 只接受精确版本,不能写 semver range。 |
| 原生 Agent Team 只读镜像(默认关闭) | 启用 DSH 原生 Agent Team 后,可在会话头部查看已有成员、共享任务、实时状态、owner、依赖和写入范围,并打开成员会话。镜像不创建成员、不修改共享任务、不调用 spawn_teammate 或原生 complete;百工仍是唯一任务、证据、租约和执行控制器。 |
| 本地 tarball 可直接 link 安装 | 新增 scripts/install-profile.mjs,校验并解包发布包后以内容摘要目录和 link: 接入 profile,避免 pnpm 回查未发布的 registry 版本。四层自我进化仍只提供分阶段路线,3.1.0 不自动修改提示、工具或工作流。 |
3.0 的变化
| 变化 | 说明 |
| 铸剑等专家不再频繁「路由链耗尽」 | 链上没有可切换的模型时,最后一个可用模型的网络/服务端/限流类临时故障按 5 秒起、封顶 60 秒退避重试;其他模型被隔离但即将到期、或正由其他专家探测恢复时等它。发起请求时共用的订阅路由刚被另一位专家的失败隔离,也在预算内等待,不再直接失败。等待与断网等待共用每个请求的 agents.networkWaitMs 预算(默认 10 分钟,每个请求最多等 32 次),用尽才结束,并在结果里列出每条路由的状态;等待期间人工换的模型醒来后照用。订阅模型池以 AUTH 报告的耗尽按认证失效处理,其他 AUTH 按状态码细分;池与认证冷却按宿主恢复时间隔离(至多 30 分钟重探);重新登录或普通目录/配置更新不会使隔离提前到期。登录后等待冷却,或在已有「模型与恢复」面板请求受控重试;重试仍按策略判定,不能绕过供应商 resetAt 或他人持有的半开探测。 |
| 按设置的语言输出 | 支持在专家执行设置中按服务商多选排除默认语言要求,天枢最终汇总保持默认语言。未排除时,每个预设都带 - Language: 强制使用{$language}回答与思考(代码、变量名、命令、路径与专业术语保持原文)。,运行时替换成「设置 → 百工 Agent」里选的语言,并在系统提示末尾追加用该语言书写的要求;换模型后照样生效。DSH 0.2.1 起专家子会话与原生 Codex / Claude Code 后端也使用按语言生成的委派 persona。已有探测中最终回复按设置语言输出;尽管语言要求已注入,DSH 显示的可见推理仍可能为英文,不能保证其始终遵循设置,见 docs/使用.md。 |
| 工程规范写入全部角色 | 不过度工程化、不过度精简、不盲目重构、安全第一、异常带上下文日志、每项改动附可执行验证;铸剑/疾风另有 C.T.I.V. 流程、命名与测试要求,行舟/复核有终端安全规则,御史按四个维度和固定模板审查。 |
| 任务卡不再因流程草稿被打回 | 天枢给的流程草稿缺少必需门禁(例如资金逻辑要求的 G_MATH_VERIFY)时由宿主自动补齐节点,不再报「workflow 缺少必需门禁」;与门禁顺序冲突的草稿依赖被绕过,其余业务先后保留。 |
| 观察模式不再自动规划审核 | 一次长期目标实测中,自动审核耗时与全部专家执行相当且 94 次只通过 2 次;现在只在强制模式自动审核,观察模式按需调用 swarm_review_plan。 |
| 规划审核设置可视化 | 「设置 → 百工 Agent → 任务流程与规划审核」可改流程模式、自动审核、requireJev、修正轮数、通过阈值与 planningReview.timeoutMs(默认 0 不限,正整数毫秒为显式上限,非法值拒绝)。 |
| 长期运行更稳 | 模型错误不再暂停持久专家(取消、打断、回合被拦下仍暂停),续跑期间不提供会打断自动恢复的「继续」;写入正常完成先等本委派登记的宿主后台作业收尾,取消时请求停止并等待确认。结束或释放通知只触发重查,未确认副作用仍保留租约阻断;不保证宿主未跟踪或逃逸的系统进程已经停止,详见 任务流程与验证。 |
| 代码精简 | 移除死代码与重复实现,移除 PRD、规划与证据类文档和一次性脚本。 |
安装
装好后重启 DSH(systemd 托管时:systemctl --user restart dsh-web.service)。
- 插件市场(dsh-market):搜索 dsh-agent-swarm 一键安装。
- 预构建包:
dsh plugin --profile <profile> add https://github.com/zhairy/dsh-agent-swarm/releases/latest/download/dsh-agent-swarm.tgz
- 从源码:
git clone https://github.com/zhairy/dsh-agent-swarm.git && cd dsh-agent-swarm
npm install # prepare 会构建 lib/
dsh plugin --profile <profile> add "$(pwd)"
模型 provider、Jev、原生 Codex / Claude Code 与 dsh-llm-fallbacks 共存的设置见 docs/安装.md。
使用
在「百工模式」会话里用自然语言描述目标和验收条件,天枢会:
1. swarm_task_card 建任务卡(目标、验收、范围、风险标志、性能预算),生成 Mermaid 流程;规则与衡鉴(Jev)给出硬门禁。
2. swarm_delegate 把自包含的子任务交给专家:自动选择模型路由、限制工具权限、校验结构化交付,衡鉴复评交付可信度。
3. swarm_status 查看门禁、证据与路由;swarm_accept 逐项核对证据后验收,缺证据返回 blocked。
另有 7 个 Jev 判断工具(jev_check、jev_classify、jev_score、jev_match、jev_screen、jev_ask、jev_health)和 jev-judgments、typesafe-ai 两个技能,在插件内直接调用,不需要外部 MCP。详见 docs/使用.md、docs/角色.md、docs/任务流程与验证.md。
| 委派结果与专家会话 | Jev API key | 专家会话与重试 | 模型设置 |
| 委派结果 | Jev API key | 会话策略 | 模型设置 |
设置 → 百工 Agent
| 卡片 | 写入 swarm-core | 内容 |
| Jev 模型 API Key | DSH 凭据存储 | 保存、清除、测试连接;密钥不写入配置文件 |
| 百工工具审批 | approvals | 继承宿主 / 请求审批 / 拒绝,按写入、Shell、外部 MCP、Jev 工具选择作用域 |
| 专家会话与重试 | agents | 默认交付语言、会话策略、重试、提示风格、模型调用显示、断网等待(链尾保持预算)、天枢恢复时间 |
| 任务流程与规划审核 | workflow、planningReview | 流程模式、自动审核、Jev 要求、修正轮数、阈值、timeoutMs |
| 纯函数数学算子 | math | 算子组、数值模式与计算规模 |
| 各角色模型链 | routes | 每层服务商、模型、推理强度;可升级角色另配容灾升级 |
组成
宿主层(cordis.patch.yml) swarm-core agentSwarm 服务:任务卡与门禁、委派、路由状态(回退 / 链尾保持 / 首选恢复)、衡鉴、账本、写入守卫 swarm-codex* 原生 Codex / Claude Code 后端实例(安装官方 bundle 后启用)预设层(presets/.patch.yml,13 个)百工模式(天枢):标准工具 + swarm_ 编排工具 + jev_* 工具 12 个专家预设:按权限裁剪的工具;委派时作为子会话的组合(DSH 0.2.1 起)每个预设都挂 runtime 行:改写路由、处理失败回退、解析语言占位符、安装委派 persona 浏览器端(client/ → lib/client.js)设置页、聊天中的「调用模型」行、任务流程图、持久专家的模型与恢复控制
开发(仅源码仓库)
公开源码树包含插件源码、构建脚本和用户文档,不附维护测试、沙箱或同步脚本。
| 命令 | 作用 |
| npm run build | 编译 src/ 到 lib/ 并生成浏览器端 bundle |
| npm run typecheck | 类型检查(仅 src/) |
| npm run gen:presets -- --dsh "$(npm root -g)/@deepseek-ai/dsh/node_modules" | 以 DSH 的 standard 预设为底重新生成 13 个预设 |
| npm run doctor -- --profile | 只读检查本机环境(不输出密钥) |
| npm run pack:release | 构建、校验入口依赖闭包并打包发布物 |
升级、回退与卸载见 docs/升级与回退.md。
许可证
MIT,见 LICENSE。内嵌的 Jev 工具改编自 jev-mcp 0.2.1(MIT),skills/typesafe-ai 收录自 TypeSafe AI(MIT),详见 THIRD-PARTY-NOTICES.md。
DeepSeek Harness(DSH)的多智能体插件。编排者「天枢」带领 12 位中文命名的专家(需求、架构、数学、代码探索、研究、视觉、复杂实现、命令执行、小改动、独立评审、验证、文案),只凭证据接活:任务卡、硬门禁和真实命令结果。每个角色都有一条多层模型链,由你的订阅搭成;失败立即切到可用的备份,最后一个可用模型短暂断线时,在预算内等待恢复。
- 支持 DSH 0.2.0 / 0.2.1(>=0.2.0-rc.2 <0.2.2-0,推荐 0.2.1-rc.3),运行于 Node.js 22.12 或更新版本
- 在「百工模式」(Agent Swarm)预设下开启会话;Jev API key 可选
3.1.9 新增
- 服务商复选框让专家请求沿用模型默认语言,而最终宿主总结遵循配置的输出语言。显式指定的任务语言保持不变。
- 语言策略跟随实际服务商,在续接会话发生回退和默认变更后依然生效。
- 订阅池传输错误保留网络恢复语义;本地冷却消息说明如何刷新订阅用量,不再声称当前配额已耗尽。
- 缺失的 Gemini 工具思考签名归类为协议不兼容,避免反复请求同一条不兼容路由。
3.1.8 新增
- 子代理模型与恢复入口是一个圆角黄色按钮,附带恢复指引。
- 修复了零参数模型目录 RPC 把中止信号当作业务参数接收的问题。服务商、模型和推理强度改用目录支撑的下拉框,目录错误可重试,提交前会做校验。
- Google Antigravity 配额失败只影响出问题的模型,并保留上报的重置时间。Argon 路由耗尽不会阻塞可用的 Flash 路由。
- 保留现有的自动跨模型回退。DSH 0.2.2-alpha.2 未通过恢复集成测试,所以本次发布明确排除 0.2.2 系列。
- 下载源和 npm-scope 的诊断修复已单独在部署主机上完成;安装本插件不会改变另一台机器的市场配置。
3.1.7 新增内容
- 本次是审计与稳定性版本:修复了门禁、状态恢复、授权等待、路由恢复和 Jev 端点中的正确性问题,并移除了从未接线的演化治理任务视图和只读面板。
- 验证门禁只接受标记为 proof 的已证实声明;评审中任一命令失败都会否决此前的通过;性能验收只接受最后一次编辑之后的最新测量;验收评审读取最近的委派记录。
- 恢复流程会丢弃未确认的半写日志尾部;授权准入会被释放,旧的已答复决策按需回收;长任务中连续的进行中等待不再耗尽任务;关键结算失败会在下次进入时对账。
- 每个 Jev 直接工具在发送前都会替换常见密钥格式;评审脱敏以线性时间匹配,并整体替换认证方案和组合凭据;非 https 的 baseUrl(回环地址除外)会被拒绝;在写入或命令的 approvals=deny 下,原生 Codex/Claude 委派改用 API 工具链,并记录原因。
- 控制面板轮询不再清除失败通知;推理强度变更不再被报告为模型切换;移除了不可用的 maxTokens / maxCostUsd 设置。
- 公开 main 回到仅含插件的目录树;3.1.6 的全部修复都包含在此处(3.1.6 没有单独的 GitHub Release)。
3.1.3 新增内容
- 设置项分类,回退路由支持无障碍的拖拽、按钮和键盘排序。
- 配额耗尽和模型变更期间的回退更安全;恢复的委派会获取新的执行绑定。
- 可恢复的用户决策等待、服务端签发的验收回执,以及有界结构循环检测。
- 运行时守卫的作用域和兼容性保持向后兼容;内部实现记录保留在源仓库的 GitHub 历史中。
3.1.2 新增内容
- 原生任务进度视图汇集六种图表视角,支持任务选择和版本绑定的证据。在窄屏 rc.3 布局下,它可能出现在「更多视图」下。
- 共享只读加载新增取消、过期快照和连接隔离,同时不中断长时间运行的工作。
- 工具和技能提案仍以隔离的元数据形式存在;文本评审无法激活或执行它们。
- 采纳 Ruflo 启发的 workspace、读投影和来源原则,但不新增运行时;内部迭代记录不进入发布包。
3.1.1 新增内容
- 规划评审子会话显示宿主观测到的模型;控件区分实际尝试与下一次请求的选择。
- 一次性评审者可以选择下一次请求的模型,而不打断进行中的请求。常驻专家保留取消、结算和安全续接能力。
- 过期的上下文引用返回当前授权索引,不会恢复旧权限。
- 文件发现支持有边界的相对目录扫描;搜索溢出和 Fetch 端点失败保留错误状态,并提供恢复指引。
- 评审过的经验可以匹配有边界的适用性文本。自我进化按发布说明描述的阶段交付。
- Tian Shu 使用 ask_user_question 处理必要的人工决策;沉默从不授予权限。
3.1.0 新增内容
| 变更 | 详情 |
| 长对话不再停止渲染 | GitHub Issue #1:当分页/长事件窗口没有 request/header 时,swarm-model-call 不再从 start() 返回 undefined。隐藏占位符继承之前的状态,并由渲染器丢弃,因此宿主事件订阅保持完整;下一次尝试不会被误报为模型切换。普通会话受同一契约保护。 |
| 思考协议失败被隔离 | The content[].thinking ... must be passed back 归类为 protocol_incompatible;当前请求立即故障转移,路由被隔离,而不是在同一会话中反复重试。 |
| 受阻目标获得恢复处方 | swarm_status 现在针对协议不兼容、路由耗尽、规划服务失败、无进展、缺少门禁和验证缺口返回 blockedRecovery。Tian Shu 使用推荐的角色和下一步动作一次,不重复等价的卡片、分数或业务变更。 |
| pnpm 11 tarball 指引 | 安装文档使用 minimumReleaseAgeIgnoreMissingTime: true,只跳过没有 registry 发布时间元数据的本地包。minimumReleaseAgeExclude 只接受精确版本,拒绝 semver 范围。 |
| 只读原生 Agent Team 镜像(默认关闭) | 启用原生 DSH Agent Team 后,会话头部可以显示现有成员、共享任务、实时状态、负责人、依赖和写入范围,并可打开成员会话。它从不创建成员、编辑任务、调用 spawn_teammate 或原生 complete;swarm 仍是唯一任务、证据、租约和执行控制器。 |
| 基于链接的本地 tarball 安装器 | scripts/install-profile.mjs 校验 release tarball 并解包到按摘要寻址的本地 bundle,再用 link: 把它接上,未发布的版本因此不必查 registry。四层自进化仍是分阶段路线图;3.1.0 不会自动修改提示词、工具或工作流。 |
3.0 有哪些新变化
| 变化 | 详情 |
| 不再误报「route chain exhausted」 | 没有其他路由可用时,最后一个可用模型遇到瞬时网络、服务器或限流故障会重试,退避从 5 s 递增到 60 s;即将恢复的隔离路由,或正被另一个专家探测的路由,会等待。共享订阅路由刚被另一个专家隔离时发起的请求也会等待,而不是直接失败。等待共用每请求的 agents.networkWaitMs 预算(默认 10 分钟,每请求最多 32 次等待);预算耗尽后请求才结束,并列出每条路由的状态。等待期间你选定的模型会在等待结束时生效。以 AUTH 报告的订阅池耗尽算认证失败,其他 AUTH 错误按状态分类;订阅池与认证的冷却时间跟随宿主的恢复时间(重新探测前最多 30 分钟)。重新登录或常规的模型目录、配置更新不会提前解除隔离。登录后,等冷却结束,或在现有 Model & recovery 面板里请求受控重试;重试资格按策略判定,不能绕过服务商的 resetAt,也不能绕过另一个请求的半开探测。 |
| 用你配置的语言回复 | 每个预设都带 - Language: 强制使用{$language}回答与思考…;运行时把 {$language} 替换成 Settings → Agent Swarm 里选的语言,并追加一条用该语言写的规则,切换模型后依然生效。在 DSH 0.2.1+ 上,委派的专家和原生 Codex / Claude Code 后端也会得到用该语言生成的委派人设。观察到的探测中,最终回复遵循了该设置;尽管注入了语言指令,DSH 展示的推理内容仍可能是英文,所以不保证一定遵循设置。见 docs/使用.md(中文)。 |
| 每个角色的工程规则 | 不过度设计,不过度简化,不盲目重构,安全优先,记录 I/O 错误,每处改动都要有可运行的验证;实现者拿到 C.T.I.V.、命名与测试规则,执行者拿到终端安全规则,审查者拿到固定的四维模板。 |
| 工作流草稿会被修复,而不是被拒绝 | 缺少必需的 gate 节点(例如财务逻辑的 G_MATH_VERIFY)时,宿主会插入该节点,而不是让任务卡失败;与 gate 顺序矛盾的草稿边会被绕过,其他业务顺序全部保留。 |
| 咨询模式下不再自动审查计划 | 在长时间运行的目标里,自动审查花掉的时间与全部专家工作相当,94 次里只通过 2 次。现在只有强制模式才自动运行;咨询模式按需审查,通过 swarm_review_plan 触发。 |
| 在 UI 里配置计划审查 | 设置 → Agent Swarm →「任务工作流与计划审查」可修改工作流模式、自动审查、requireJev、修复轮数、通过阈值和 planningReview.timeoutMs(默认 0 = 不限;正整数毫秒表示保留显式上限;非法值会被拒绝)。 |
| 长时间运行更稳定 | 模型报错不再暂停常驻专家(取消、中断和阻塞的轮次仍会暂停),自动重试挂起期间不再提供「继续」。正常写入完成会等待委派注册的宿主任务落定;取消会请求停止并等待确认。结束或释放通知触发复查,而不是释放;未确认的副作用会让租约保持阻塞。这不保证未跟踪或已脱离的 OS 进程已经停止。见 任务流程与验证(中文)。 |
| 代码库更精简 | 删除死代码和重复代码,以及 PRD、计划与证据文档和一次性脚本。 |
安装
之后重启 DSH(使用 systemd:systemctl --user restart dsh-web.service)。
- dsh-market:搜索 dsh-agent-swarm。
- 发布包 tarball:
dsh plugin --profile <profile> add https://github.com/zhairy/dsh-agent-swarm/releases/latest/download/dsh-agent-swarm.tgz
- 从源码安装:
git clone https://github.com/zhairy/dsh-agent-swarm.git && cd dsh-agent-swarm
npm install # prepare builds lib/
dsh plugin --profile <profile> add "$(pwd)"
服务商、Jev、原生 Codex / Claude Code,以及与 dsh-llm-fallbacks 共存,见 docs/安装.md(中文)。
使用
在 Agent Swarm 会话里描述目标和验收标准。天枢随后会:
1. 用 swarm_task_card 创建任务卡(目标、验收、范围、风险标记、性能预算)和 Mermaid 工作流;规则和 Jev 分诊会加上硬性关卡;
2. 用 swarm_delegate 委派自包含的子任务,它会挑选模型路由、限制工具、校验结构化交付物,并让 Jev 评估其可靠性;
3. 用 swarm_status 检查关卡、证据和路由,用 swarm_accept 验收,缺少证据时返回 blocked。
七个内置 Jev 判断工具(jev_check、jev_classify、jev_score、jev_match、jev_screen、jev_ask、jev_health)和 jev-judgments、typesafe-ai 技能都在插件内运行,不需要外部 MCP 服务器。见 docs/使用.md、docs/角色.md 和 docs/任务流程与验证.md(中文)。
设置 → Agent Swarm
| 卡片 | swarm-core 键 | 用途 |
| Jev API key | DSH 凭据存储 | 保存、清除并测试密钥;密钥不会写入配置文件 |
| Swarm 工具审批 | approvals | 对写入、shell、外部 MCP 和 Jev 工具分别设置 inherit / ask / deny |
| 智能体会话与重试 | agents | 默认输出语言、会话策略、重试、提示词风格、模型调用显示、网络等待(同时也是最后路由的保持预算)、天枢模型恢复 |
| 任务工作流与规划审查 | workflow、planningReview | 工作流模式、自动审查、Jev 要求、修复轮数、阈值、timeoutMs |
| 纯数学运算符 | math | 运算符分组、数值模式与限制 |
| 按角色配置的模型链 | routes | 每一层的服务商、模型与推理强度;可升级角色的升级链 |
开发(仅限源码检出)
公开源码树包含插件源码、构建脚本和用户文档;不包含维护测试、沙箱和同步脚本。
| 命令 | 用途 |
| npm run build | 把 src/ 编译到 lib/,并构建浏览器 bundle |
| npm run typecheck | 只对 src/ 做类型检查 |
| npm run gen:presets -- --dsh "$(npm root -g)/@deepseek-ai/dsh/node_modules" | 从 DSH 的标准预设重新生成 13 个预设 |
| npm run doctor -- --profile | 只读环境检查(绝不打印密钥) |
| npm run pack:release | 构建、校验入口依赖闭包并打包发布 tarball |
升级、回退与卸载:docs/升级与回退.md。
许可证
MIT,见 LICENSE。内置的 Jev 工具改编自 jev-mcp 0.2.1(MIT),skills/typesafe-ai 来自 TypeSafe AI(MIT);见 THIRD-PARTY-NOTICES.md。
专家默认语言排除
在「设置 → 百工 Agent → 专家执行」的「专家默认语言排除名单」中多选服务商。勾选后,该服务商的专家过程使用模型默认语言;每次实际请求和模型回退都会重新匹配。任务明确指定的语言仍然保留,天枢面向用户的最终汇总继续遵循默认交付语言。此选项不保证模型内部推理使用英语,也不改变供应商的规则或使用限制。
旧配置的排除名单为空;保存后立即作用于新的请求。旧会话里已有的用户指令和历史消息不会被改写;需要完全移除旧的语言要求时,请新建专家委派。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
zhairy/dsh-agent-swarm
DeepSeek Harness 中文多智能体插件「百工」:天枢统筹 12 位专家,证据门禁、多层模型路由与回退、内嵌…
相关插件 · 其他
模型破甲清洗HunYiSage/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,993已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,269已汉化DSH
70.8
这是你的仓库?认领条目