DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

Mutsum1-WY /

Mutsum1-WY/dsh-work-chain

Verified

DeepSeek Harness 的工作链插件:当前会话当 leader,多个可配置模型成员经内置 Agent Teams 任务板并行干活;另附只评审不改文件的审美顾问 aesthetic_advice。

★ 0 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@8b921669

dsh-work-chain(工作链)

把 当前会话当 leader、把多个指定模型的成员当手下,靠内置 Agent Teams(任务板/名册)做协调的 fan-out 工作流插件。适合「让几个不同模型并行干活、leader 汇总」的场景,比如:并行调研/多视角 review/分工写代码。

默认是 rotate(轮换)模式:每个成员是一个一次性子代理,干完自己的活就立刻释放,再拉下一个/下一批 —— 相当于「完成一个任务 → 删掉这个智能体 → 新建下一个」,因此不受团队常驻智能体数量上限限制,一个对话里也能反复用多种模型。也保留 team 模式:成员是常驻 Agent Teams 队友(出现在团队 UI、跨调用复用、受设置里智能体上限约束)。

v0.6.0 新增「审美顾问」:leader 可以用 aesthetic_advice 把成果(网页/界面、截图、URL 或文字描述)交给一个独立的审美评审子代理,拿回「总评分数 + 按影响排序的具体修改建议」;它只给建议、不改任何文件,开关/模型/审美偏好都在插件配置卡片里。详见下文「审美顾问(aesthetic_advice,v0.6.0)」。

它怎么工作(一句话版)

  1. 你在顶栏把当前会话切到想当 leader 的模型;
  2. 在「插件」页 → 已安装插件 → 工作链 的配置卡片里配好 members(name / provider / model)和模式(rotate / team);
  3. 对 agent 说「用工作链做 XXX」(或直接让它调 work_chain);
  4. 插件按模式派活:
    • rotate:按 maxParallel 分批拉起一次性子代理(模型=成员配置),跑完一批立刻释放;
    • team:为每个成员在团队名册里建/复用 teammate,按各模型运行;
  5. 成员把完整结果写到 .workchain/<runId>/<member>.md;rotate 模式下由 leader 代成员把摘要写进任务板;
  6. 插件收集结果(任务板摘要 + 结果文件)交回 leader 汇总。

leader 不是插件另开的进程,就是当前这个会话;它负责拆任务(可在 work_chain 的 subtasks 里传拆解结果)和最后汇总。

为什么能「每个 member 不同模型」

  • rotate 模式:直接调内置子代理服务 ctx.subagents.startActivation,在 request.agentOptions 里带 {provider, model},子代理就按指定模型运行;跑完 dispose() 释放。
  • team 模式:内置 spawn_teammate 没有模型参数,插件在 agent/created(serial)里认出刚创建的 teammate,在它的 scoped context 上挂 agent/request / system-prompt/assemble waterfall(与官方 installModelSelection 同套路),把每次模型请求固定为配置的 provider/model。

因此:

  • 两种模式下每个成员都用自己配置的模型运行;
  • rotate 成员是一次性的(跑完即删,不占团队槽位,也不跨调用复用);
  • team 成员是真正的 Agent Teams teammate(团队 UI、消息、任务板、跨调用复用);
  • 不 patch 任何共享服务方法,插件卸载/HMR 时相关监听/子代理一起回收。

注意:team 名册(list_agents)里显示的 model 可能仍是继承值;rotate 子代理跑完即释放,工具输出里的模型以成员配置与子代理自报为准。

依赖

  • DSH 0.2.1-rc.3(Desktop / Web profile);
  • 内置 Agent Teams 组合包已启用:@deepseek-ai/dsh-experimental-agent-team-profile(缺少它时本插件这一行不会激活)。
  • 宿主 llm 服务(DSH 内置):宿主半 index.js 的 inject 增加了 'llm'(浏览器半 dsh.client.inject 仍是 slots/locale,不需要 llm),用于 ctx.llm.listProviders() / ctx.llm.listModels() 读取成员下拉的供应商与模型目录;宿主未提供时插件会退回兜底目录(见下文);
  • 任意模型 provider;默认成员统一为 opencode-go / deepseek-v4.1-flash(v0.5.0 起,原 4 个不同模型的默认成员已全部改为 flash)。其它模型(如 deepseek-v4-pro / claude-haiku-5-5 / kimi-k3)需 provider 有有效凭据且 DSH LLM 可路由,minimax-* 等在 DSH LLM 里不可路由(会失败)时,除非你另外接了对应 provider。
  • 审美顾问(v0.6.0)不引入新的外部依赖:复用已注入的 subagents(拉起一次性评审子代理)与 agentTeams(校验调用者是 Lead),不需要额外安装包或新服务;但它的模型同样要求 provider 有有效凭据且 DSH LLM 可路由,不可路由时 aesthetic_advice 直接报错。

已知限制(实测)

  • team 模式槽位有限且不可回收:团队 teammate 总数 = 设置里的智能体上限(desktop 默认 8),名册不能删成员。team 模式每次调用会先复用同名成员、再用空余槽位;不够就跳过并报告。rotate 模式不受这个限制(一次性子代理,跑完释放);team 模式想扩员就新开一个对话或调大设置上限。
  • rotate 模式每批最多 8 个:受宿主 subagent.maxActiveSubagents(默认 8)限制,maxParallel 再大也只按 8 一批;成员超过一批时自动分多批串行跑(每批之间释放上一批)。
  • rotate 子代理不进入团队名册:它们能用文件/工具,但用不了团队任务/消息工具;任务板由 leader 代写摘要(出问题会删除该任务)。
  • 内置团队偶发 provisioning 竞态:spawnTeammate 可能报 initial prompt was not durably accepted(agent-team 的 checkpointInitialPrompt 竞态,与成员模型无关)。插件会自动换名字重试一次;仍失败时该成员标记为 派活错误,其余成员照常完成,失败任务会从任务板删除。
  • 任务板 description 的 16KB 上限 + 成员可能写不回摘要:个别模型调用 team_task_update 时参数可能丢失,此时任务板 description 仍是原始派活文本;插件会自动退回用结果文件内容做摘要(输出里 summarySource: file),结果不丢。
  • 成员的模型锁定靠 agent scoped event(agent/request + system-prompt/assemble waterfall),不 patch 任何共享服务;团队名册里显示的 model 可能仍是继承值,以工具输出的 actualModel 为准。
  • 复用旧成员偶尔会失败:如果被复用的成员处于异常状态(cold resume / 上一次 turn 失败),唤醒可能失败并表现为该成员超时;换用新会话最稳,失败成员不会自动清理。
  • GUI 配置卡片在页面 boot 时装配:如果安装/更新后当前页面没出现「工作链成员配置」卡片,刷新页面一次;仍没有就重启一次 DSH(客户端模块图在启动时扫描)。
  • 审美顾问是一次性子代理、跑完即释放(v0.6.0):不进团队名册、不占团队槽位,也不保留上下文——每次调用都是全新评审(同一对象想复测就再调一次);它的模型/provider 需 DSH LLM 可路由,不可路由时工具直接报错;建议落在 .aesthetic/<runId>/advice.md,该目录与 .workchain/、.workflow/ 同为运行时产物,需自行清理。

安装

插件管理器 →「添加插件」→「安装第三方插件」→ 本地目录填:

E:\凑鲸鱼\plugins\dsh-work-chain

安装完成后到「插件」页 → 已安装插件,打开 工作链:

  • 配置卡片:编辑 members(增删行、name/provider/model)、maxParallel、timeoutSeconds,保存即写 $DSH_HOME/work-chain/config.json,下一次调用生效,不用重装;
    • v0.5.0 起 provider / model 是下拉菜单:选项来自 DSH 当前已配置的供应商与其模型(不再是文本输入);新增行与默认成员默认为 opencode-go / deepseek-v4.1-flash;点「重新加载」会重新检测供应商与模型,无需重启。详见下文「成员模型下拉(v0.5.0)」;
    • v0.6.0 起配置卡片多了「审美顾问」栏:启用开关(启用审美顾问)+ 审美模型供应商/模型下拉(默认 opencode-go / deepseek-v4.1-flash,与成员下拉用同一份 provider catalog)+ 审美偏好 / 标准 textarea;改完点「保存」即写进 config.json 的 aesthetic,下一次调用生效,不用重装、不用重启。详见下文「审美顾问(aesthetic_advice,v0.6.0)」;
  • 组合包开关:关闭后工具和配置接口一起卸载,work_chain / work_flow / aesthetic_advice 都不可用;
  • 配置页数据接口:同源 GET/POST /plugin-api/work-chain/config(Host 的 webServer 提供,仅本机)。

成员模型下拉(v0.5.0)

插件页「工作链成员配置」卡片里,成员的 provider / model 是下拉菜单,选项来自宿主 DSH 当前的供应商与模型。

数据来源:宿主 index.js 通过 inject 的 llm 服务调用 ctx.llm.listProviders() 得到供应商列表,再对每个供应商调用 ctx.llm.listModels(id) 得到模型列表。GET /plugin-api/work-chain/config 返回体里新增 catalog 字段。

catalog 字段结构:

字段 类型 说明
available boolean 宿主是否成功提供目录(至少一个含模型的供应商);false 时为兜底目录
groups array 每个供应商一组:{id, name, models:[{id, name}]};模型列表为空的供应商会被跳过
failures array 单个供应商检测失败/超时的记录:{id, name, message},不影响其它供应商
defaultProvider string 默认选中的供应商 id
defaultModel string 默认模型 id,固定为 deepseek-v4.1-flash

默认选择规则:

  • 默认供应商:优先 opencode-go 且含 deepseek-v4.1-flash;否则任一含该模型的供应商;都没有则取第一组;
  • 新增行 / 默认成员:provider = defaultProvider,model = deepseek-v4.1-flash(若该供应商下没有此模型,则退回该组第一个模型);
  • 线上 config.json 里已存在的成员保持原值,不会被自动改写。

超时与失败降级:

  • 单个供应商的 listModels 超时为 8 秒(CATALOG_TIMEOUT_MS);超时或报错只进 failures,其它供应商照常展示;
  • 卡片上方会提示检测到的供应商数量,并列出失败的供应商 id。

兜底目录:宿主未提供 catalog(旧宿主或 llm 服务异常)时,客户端用「当前配置成员 + 默认成员 + 内置模型建议」合成兜底目录(available=false,卡片提示 providerFallback)。只有连目录都无法合成时,才退回原来的文本输入框。

边界:

  • 下拉只列出 DSH 当前已配置、可读到模型的供应商;没配置凭据的供应商不会出现(或出现在 failures 里);
  • 点「重新加载」会重新请求 catalog,不需要重启 DSH 或重装插件;
  • 下拉只决定配置的取值,真正能否运行仍取决于该 provider 的凭据与 DSH LLM 路由。

GET 返回体示例(节选):

{
  "members": [
    { "name": "pro", "provider": "opencode-go", "model": "deepseek-v4.1-flash" }
  ],
  "mode": "rotate",
  "maxParallel": 4,
  "timeoutSeconds": 600,
  "catalog": {
    "available": true,
    "groups": [
      {
        "id": "opencode-go",
        "name": "OpenCode Go",
        "models": [
          { "id": "deepseek-v4.1-flash", "name": "DeepSeek V4.1 Flash" },
          { "id": "deepseek-v4-pro", "name": "DeepSeek V4 Pro" }
        ]
      }
    ],
    "failures": [
      { "id": "some-provider", "name": "Some Provider", "message": "listModels timeout (8000ms)" }
    ],
    "defaultProvider": "opencode-go",
    "defaultModel": "deepseek-v4.1-flash"
  }
}

(以上 models 仅为示意,实际列表以 DSH 当前配置为准。)

用法

对 agent 说:

用工作链并行调研 DeepSeek Harness 的插件市场生态,三个成员分别看官方文档/GitHub/社区,最后汇总。

agent 会调用:

{ "task": "调研 DeepSeek Harness 插件市场生态并给出落地建议" }

也可以由 leader 先拆任务再调用(推荐,分工更准):

{
  "task": "给这个仓库做一次上线前 review",
  "mode": "rotate",
  "subtasks": [
    { "title": "安全审查", "prompt": "审查鉴权、注入、依赖风险", "member": "pro" },
    { "title": "性能", "prompt": "找性能瓶颈与优化点", "member": "kimi" },
    { "title": "文档与体验", "prompt": "检查 README/错误提示/首次体验", "member": "haiku" }
  ]
}

调用返回:runId、mode、team{maxMembers, limitSource, usedBefore, waveSize, skipped}、notes、每个成员的 taskId/状态/摘要/结果文件内容、是否超时、耗时;leader 据此做最终汇总。成员结果文件在 <cwd>/.workchain/<runId>/。

对话页「工作流模式」开关

对话输入框左侧有一个 工作流 开关按钮(conversation.input.left slot):

  • 开启:host 会在系统提示里注入一段「工作流模式已开启」的指令——本对话默认把任务拆成 tasks[] 用 work_flow 调度 worker、每轮验收、补任务,直到 done:true 再给最终结论;简单闲聊/单步问答仍可直接回答。
  • 关闭(默认):不注入,按普通对话方式工作。
  • 状态全局持久化在 $DSH_HOME/work-chain/config.json 的 workflowMode(所有对话共用),刷新页面后按钮状态从 GET /plugin-api/work-chain/workflow-mode 读取;切换用 POST {enabled}。
  • 插件卸载/关闭组合包后按钮消失,提示注入也随之移除。

work_flow:动态调度工作流(推荐用于多轮任务)

work_chain 是「一轮 fan-out」,而 work_flow 是由 Lead 反复调度、worker 空闲即复用的完整工作流工具:

  1. 建 worker 池:按配置(或参数 members)保证一组常驻 teammate 存在——同名复用并重锁模型,缺的空槽新建(受设置里智能体上限约束);
  2. 入队任务:本次调用传入 tasks[](可带 key 和 depends_on 做依赖/DAG),创建到团队任务板;
  3. 空闲即派活:把 ready 的待办任务 reassign 给空闲 worker 并发消息(被 reassign 后任务已是 in_progress,worker 不需要再 claim);
  4. 等完成:等到至少一条完成(或再也无法推进/超时)就返回给 Lead 验收,同时返回 worker 状态、剩余待办、进行中任务;
  5. Lead 验收后继续:需要返工/补充就在下一次调用里传新 tasks(depends_on 引用之前的 key),不需要补充就传空 tasks 继续把剩下的派出去;
  6. 收尾:队列清空时返回 done: true,由 Lead 做最终验收结论。

worker 全程复用:同一批 teammate 跨多次 work_flow 调用持续接活;worker 每次完成的摘要写在团队任务 description、全文写在 .workflow/<flowRun>/<taskId>.md。

{
  "task": "给项目做上线前整改",
  "tasks": [
    { "key": "audit", "title": "安全审计", "prompt": "审查鉴权/注入/依赖风险" },
    { "key": "fix",   "title": "整改建议", "prompt": "根据审计结果给整改清单", "depends_on": ["audit"] }
  ],
  "members": [ { "name": "pro", "provider": "opencode-go", "model": "deepseek-v4-pro" } ],
  "wait_seconds": 120,
  "max_assign": 2
}

返回值要点:assigned(本轮派发)、completedNow(本轮完成、待你验收)、remaining(待办/进行中)、counts、workers、done、notes。下一轮把验收意见变成新任务再调一次即可。

提示:worker 池在新对话里最容易一次建满(槽位从 0 开始);老对话槽位满时只能复用已有成员名,或到设置里调大智能体上限。

模式 行为 适合
rotate(默认) 每个成员 = 一次性子代理,按 maxParallel 分批拉起(每批最多 8),跑完一批立刻 dispose() 释放,再拉下一批。不受团队常驻智能体上限限制,同一对话可跑很多成员/模型。 想多模型并行、又不想被槽位卡住(推荐)
team 成员是常驻 Agent Teams teammate:出现在团队 UI、能读写任务板、跨调用同名复用;数量受设置里的智能体上限约束,槽位不足时跳过并报告。 需要成员持久化、团队可见/可干预

team 模式:智能体数量以「设置里的智能体上限」为准

  • 实时读取内置团队当前生效的 maxMembers(runtime = 运行中团队服务,设置改动热更新后立即跟随;退回 config 读 agent-team 配置行;最后回退 8)。
  • 规划顺序:同名 teammate 直接复用(不占新槽位)→ 还有空槽就按该成员模型新建 → 槽位已满则该成员跳过并报告(不换模型、不挪用其它成员)。
  • 槽位不够时:新开一个对话(团队成员从 0 开始),或到设置里把智能体上限调大;插件下一次调用/保存即跟随。

配置字段

位置 字段 说明
插件页 GUI / $DSH_HOME/work-chain/config.json members[] {name, provider, model};name 必须 lower-kebab-case 且唯一;最多 64 个(rotate 一次最多跑 16 个,team 模式按设置上限)
同上 members(默认值) 4 个成员,均为 opencode-go/deepseek-v4.1-flash:pro / haiku / kimi / ds-flash(v0.5.0 起全部为 flash,原为不同模型)
同上 mode rotate(默认)/ team
同上 maxParallel 1~8:rotate = 每批并发数;team = 提示并行度(实际并发还受宿主 subagent 并发上限约束)
同上 timeoutSeconds 30~3600,整条链的总等待预算(默认 600 秒)
同上 aesthetic {enabled, provider, model, styleNotes}(v0.6.0 审美顾问):默认 true / opencode-go / deepseek-v4.1-flash / '';styleNotes 是拼进审美顾问提示词的偏好文本,保存时截到 4000 字;enabled 只在显式 false 时关闭
work_chain 参数 mode 本次调用覆盖模式
同上 members 本次调用临时覆盖成员
同上 subtasks[] leader 拆好的分工;不传则每个成员独立做总任务
同上 timeout_seconds 本次调用覆盖等待预算

成员复用(仅 team 模式)

  • 同名成员复用:config 里 name 稳定的成员第二次调用会被直接复用(send_message 唤醒,不新建、不占槽位),并重新锁定成当前配置的模型;同一次调用里每个成员只会用一次。
  • 槽位不足则跳过:不会换模型、不挪用别的 teammate,只在输出里报告该成员被跳过;新开一个对话即可重置槽位。
  • 名册里 status=failed 的成员不复用;重名时插件会自动加后缀(-2、-r2)。
  • 建议成员名带模型特征(pro、haiku、kimi),配置改变时更好追踪。

rotate 模式的成员是一次性的(跑完即删),不参与复用;每次调用都是全新的子代理,因此即使团队槽位用满也能跑。

审美顾问(aesthetic_advice,v0.6.0)

一个独立的审美评审子代理:leader 把成果交给它,它按视觉/界面审美标准审一遍,给出可执行的修改建议。适合网页/界面(含设计稿截图)、游戏画面、图表、PPT/文档视觉排版等。

  • 独立:它看不到 leader 的上下文,只根据你传的 target / focus / context 和配置里的审美偏好自己去看(可以读文件、看图片、浏览网页);
  • 只给建议、不改文件:不会改代码、也不会改待审对象;完整建议写在 .aesthetic/<runId>/advice.md,工具输出只回给 leader 摘要 + 建议文件路径;
  • 一次性子代理:每次调用新建、跑完即释放(不进团队名册、不占团队常驻槽位);评审过程可能用到文件/截图/浏览器等工具,默认 180 秒预算,到点硬中断并返回已落盘的部分建议;
  • leader 专用:只有 Team Lead 能调用,teammate 调用会报「只能由 Team Lead 调用」;什么时候审、审完要不要采纳、这次用哪个模型,都由 leader(当前会话)决定;
  • 受插件页配置控制:启用开关关闭时调用会直接报错并提示去插件页开启;默认模型 opencode-go / deepseek-v4.1-flash,可在配置卡片改;「审美偏好 / 标准」会拼进它的提示词(留空则只用通用标准)。

参数

参数 类型 必填 说明
target string 是 要审的对象:文件路径、截图路径、URL,或一段描述
focus string 否 重点关注什么(如「配色」「间距与对齐」「字号层级」);不传走通用审美维度(构图/布局、配色、字体与字号层级、间距与对齐、一致性、动效与细节)
context string 否 背景:给谁看、要达到什么目的、已知约束
provider string 否 本次调用临时覆盖 provider(默认用配置值)
model string 否 本次调用临时覆盖模型(默认用配置值)
timeout_seconds number 否 本次等待预算,30~600 秒,默认 180;到点会硬中断,子代理已写进结果文件的部分建议照常返回
{
  "target": "E:/凑鲸鱼/apps/web/dist/index.html",
  "focus": "配色与字号层级",
  "context": "面向开发者的设置页,信息密度高,希望克制但不冷淡"
}

(也可以只传 target;target 是描述时,它会按描述评审,不会假装看到了不存在的文件。)

时间预算:timeout_seconds 会同时写进它的提示词(让它优先给结论、不要跑超出预算的长时间测评),并在宿主侧硬中断——到点仍未完成时返回 timedOut: true,它已经写进 advice.md 的部分建议照常返回;要更深的评审(如多分辨率真机截图)就把 timeout_seconds 调到 300~600。

它给出的建议结构

写进 advice.md(工具输出摘要同结构)的内容固定是:

  1. 一句总评 + 0~10 分;
  2. 按影响从大到小排序的问题清单,每条写清「现象 → 为什么不好看 → 怎么改」,修改具体到颜色 / 间距 / 字号 / 层级 / 动效 / 对齐;
  3. 2~4 条加分项(已经做得好的,或低成本见效的);
  4. 给 leader 的采纳建议:哪些必改、哪些可选,并说明理由。

返回字段

字段 说明
runId 本次评审 id(格式同 work_chain)
provider / model 本次使用的(配置值或参数覆盖后的)路由
actualProvider / actualModel 子代理自报的实际请求路由(读不到时缺省)
elapsedMs 耗时(毫秒)
timedOut 是否因超时/中断结束
error 有异常但已经拿到建议时附带的错误消息(没有则不出现)
file 建议文件绝对路径 <cwd>/.aesthetic/<runId>/advice.md
advice 建议正文(工具输出里截到 48000 字符,完整内容看文件)

工具输出给 leader 的首行是 【审美顾问】<provider>/<model> · <N>s · 建议文件 <path>,空行后是建议正文。

结果文件

  • 建议写在当前会话工作目录下的 .aesthetic/<runId>/advice.md;每次调用一个独立 runId 目录,互不覆盖;
  • 与 .workchain/、.workflow/ 一样是运行时产物,按需自行清理;关闭审美顾问不影响 work_chain / work_flow。

结果与任务板

  • 任务板:每次 work_chain 会为每个成员建一条团队任务(subject=分工标题)。team 模式由成员 claim → 编辑 description 写摘要 → complete;rotate 模式成员不在团队里,由 leader 代写(claim → edit 摘要 → complete,失败则删任务),进度仍可在团队任务板里看到。
  • 结果文件:成员把完整 Markdown 写在 .workchain/<runId>/<member>.md(工具输出会读回;太长会截断,完整内容看文件)。
  • 审美建议文件(v0.6.0):aesthetic_advice 的建议写在 <cwd>/.aesthetic/<runId>/advice.md,不经过团队任务板;工具输出给 leader 的是「首行路由/用时/文件路径 + 建议正文」。完整内容看文件。
  • 超时:到 timeoutSeconds 仍未完成会返回 timedOut: true 并打断仍在运行的成员,已完成的成员结果照常返回。

排障

现象 原因/处理
插件页看不到「工作链」配置卡片 组合包未启用 / 客户端半没加载:刷新页面;看组合包详情页诊断
配置页报 fetch 失败 宿主路由 /plugin-api/work-chain/config 未注册(组合包未启用)或页面来自旧缓存:刷新;必要时关闭再开启组合包
work_chain 报「需要内置 Agent Teams」 到插件页启用 @deepseek-ai/dsh-experimental-agent-team-profile,或确认当前会话是团队 Lead
报 只能由 Team Lead 调用 members 是 teammate,teammate 不能发起新的工作链;由 Lead 调用
aesthetic_advice 报「审美顾问已在插件页关闭」(v0.6.0) 到「插件」页 → 工作链配置卡片的「审美顾问」栏勾上「启用审美顾问」并保存,然后重新调用;也可检查 config.json 里 aesthetic.enabled 是否为 true
aesthetic_advice 报「只能由 Team Lead 调用」(v0.6.0) 当前会话不是 Lead(是 teammate/子代理):换成由你发起的会话(那就是 Lead)再调用
aesthetic_advice 返回 timedOut: true / 报「审美顾问调用失败」 模型不可路由(provider 无凭据)或超时:在配置卡片换一个可路由的审美模型,或把 timeout_seconds 调大(30~600);error 字段里是原始错误
某个成员 spawn 失败 模型/provider 在该会话不可用(opencode-go 需要有效凭据);在配置里换模型后重试;错误会写进该成员条目
全部成员都没跑起来 看 list_bundles 的 subagent-spawn-in-process 行是否活跃;maxMembers=16 是否已满
结果文件缺失但任务完成 成员偷懒没写文件;摘要仍在任务板里,工具输出会标 结果文件缺失
下拉里没有某个供应商 该供应商未在 DSH 设置中配置或凭据无效:到 DSH 设置里配置该供应商/凭据,然后在插件卡片点「重新加载」
provider 行显示 providerFallback / 当前值(非下拉选项) 宿主 catalog 没读到(宿主未更新或 LLM 服务异常):点「重新加载」;仍不行就重装组合包或重启 DSH
升级 DSH 后失效 本插件依赖 subagents.startActivation 的内部契约做模型透传;升级后先用一个成员做冒烟测试,必要时按新契约调整

卸载

插件页 → 已安装插件 → 工作链 → 卸载。配置留在 $DSH_HOME/work-chain/config.json(可手动删),成员结果留在各会话工作目录的 .workchain/ 下。

开发/自检

  • 改完先跑语法检查:node --check index.js、node --check client.js(两者都必须通过,且都是零第三方依赖的纯 JS);

  • 宿主:index.js(零第三方依赖,node --check index.js);

  • 浏览器半:client.js(注册 plugins.bundle.config 配置页,node --check client.js);

  • 冒烟脚本:可在 tmp 目录写一个临时脚本,覆盖 catalog 规范化/默认选择/下拉选项等纯函数(buildModelCatalog 与 client 的 interpretCatalog/pickDefaultProvider/providerSelectOptions),不写入仓库;

  • 审美顾问自检(v0.6.0):宿主半用 tmp/wc-aesthetic-dev/host-smoke.mjs(fake ctx + fake activation + 临时 DSH_HOME,覆盖默认配置/规范化/工具注册/参数 schema/execute 正常与覆盖/非 lead 拒绝/插件页关闭/styleNotes 生效/GET defaults/POST 回显);浏览器半用 tmp/wc-aesthetic-client/check.cjs(fake React 物化配置卡片,覆盖 aesthetic 的解析/规范化/校验/字典键/渲染/保存载荷)。两个脚本都在 tmp 下、不进仓库,跑完不污染真实配置;

  • 配置接口:GET/POST /plugin-api/work-chain/config(同源,仅本机 Web 服务提供)。

  • 测试约定(2026-10-27 起,用户要求):插件改动的冒烟测试只跑一个 ds-flash 成员(opencode-go/deepseek-v4.1-flash),不再跑多模型/多成员/压测;单成员一次约 20~30s。命令形态:

    { "mode": "rotate",
      "task": "冒烟测试:20 字内回答 1+1 并自报模型",
      "members": [ { "name": "ds-flash", "provider": "opencode-go", "model": "deepseek-v4.1-flash" } ],
      "timeout_seconds": 120 }
    

    只有改动涉及多成员调度(分波/借用/任务板结算)时,才按需补一次多成员测试。

  • 审美顾问的真机验证不需要成员:一次 aesthetic_advice 调用即可(target 传一个本地文件路径,timeout_seconds 给 60~120),它不占团队常驻槽位;上面的 fake ctx 冒烟脚本本身不消耗模型额度。

MIT License,见 LICENSE。第三方插件形态与 plugins/dsh-web-search-opencode 一致,安装/卸载都走插件管理器。

—/ 5

No ratings yet

Verified DSH bundle

Commit 8b92166973b8

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout