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)」。
它怎么工作(一句话版)
- 你在顶栏把当前会话切到想当 leader 的模型;
- 在「插件」页 → 已安装插件 → 工作链 的配置卡片里配好 members(name / provider / model)和模式(rotate / team);
- 对 agent 说「用工作链做 XXX」(或直接让它调
work_chain); - 插件按模式派活:
- rotate:按
maxParallel分批拉起一次性子代理(模型=成员配置),跑完一批立刻释放; - team:为每个成员在团队名册里建/复用 teammate,按各模型运行;
- rotate:按
- 成员把完整结果写到
.workchain/<runId>/<member>.md;rotate 模式下由 leader 代成员把摘要写进任务板; - 插件收集结果(任务板摘要 + 结果文件)交回 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/assemblewaterfall(与官方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/assemblewaterfall),不 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)」;
- v0.5.0 起 provider / model 是下拉菜单:选项来自 DSH 当前已配置的供应商与其模型(不再是文本输入);新增行与默认成员默认为
- 组合包开关:关闭后工具和配置接口一起卸载,
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 空闲即复用的完整工作流工具:
- 建 worker 池:按配置(或参数
members)保证一组常驻 teammate 存在——同名复用并重锁模型,缺的空槽新建(受设置里智能体上限约束); - 入队任务:本次调用传入
tasks[](可带key和depends_on做依赖/DAG),创建到团队任务板; - 空闲即派活:把
ready的待办任务reassign给空闲 worker 并发消息(被reassign后任务已是 in_progress,worker 不需要再 claim); - 等完成:等到至少一条完成(或再也无法推进/超时)就返回给 Lead 验收,同时返回 worker 状态、剩余待办、进行中任务;
- Lead 验收后继续:需要返工/补充就在下一次调用里传新
tasks(depends_on引用之前的key),不需要补充就传空tasks继续把剩下的派出去; - 收尾:队列清空时返回
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(工具输出摘要同结构)的内容固定是:
- 一句总评 + 0~10 分;
- 按影响从大到小排序的问题清单,每条写清「现象 → 为什么不好看 → 怎么改」,修改具体到颜色 / 间距 / 字号 / 层级 / 动效 / 对齐;
- 2~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 一致,安装/卸载都走插件管理器。
No comments yet. Be the first to write one.