DeepSeek Harness 长任务怎么办?DSH plugin 后台任务与 ctx.jobs 控制
DeepSeek Harness 用一套「后台任务运行时」管理长任务:bash、subagent 等生产方在 ctx.jobs 注册作业,JobId 形如 <kind>-N,状态有 running、stopping、completed、killed、failed 五种,模型侧可用 job_list、job_output、job_kill 查看与控制(来源)。
DeepSeek Harness 后台任务是什么:长任务与 ctx.jobs
当一项工作跑得久、不适合阻塞对话时,它会被注册成一个 job;运行时的职责是持有身份、访问控制、生命周期状态与输出环,而执行资源归生产方(来源)。 要点:
- 哪些算 job — 内置 kind 至少有
bash与subagent;JobKind派生自可声明合并扩展的 map,插件也能加自己的 kind。预期:跑构建、跑测试、长委派都会落到这里。 - id 形如
<kind>-N—JobId是品牌化 id,JobSpec.kind同时充当 id 前缀。预期:一眼看出这是哪类任务。 - 访问控制靠拥有者授权 —
JobSpec.owner声明拥有者会话;访问由它设栏,而非靠 id 保密。预期:把关照 id 当安全手段是错的。 - 生产方与运行时分工 —
JobSpec声明身份、拥有者会话、可选的拉取式output源与启动器;运行时做完预检后带JobHandle调用run(),提交注册后不再执行可能失败的步骤。预期:预检失败时什么都不会注册。
DeepSeek Harness 后台任务的状态与进度怎么看
JobStatus 取 running、stopping、completed、killed、failed 之一;生产方特有的事实在运行期间归入 JobView.progress,结算后归入 JobView.detail(来源)。 观察方式:
- 看实时进度 — 生产方用
JobHandle.updateProgress(line)替换实时进度行(例如3/10、当前阶段)。预期:进度是覆盖式的,结算时会清空。 - 看结算原因 — 结算后终态原因走
JobOutcome.detail。预期:任务为什么结束、失败在哪,看这里。 - 看输出环 — 生产方用
JobHandle.append(text)逐块追加输出,偏移按 UTF-8 字节推进。预期:模型侧读到的是环里的内容,outputLimitBytes限制每次完成通知或输出读取的字节上限,但它约束的是模型可见面、不影响观察者。 - 看完成回调 —
JobHooks.done在生产方释放资源时 resolve,而不是在工作完成时。预期:别把 done 当成「任务成功」的信号。
DeepSeek Harness 任务控制与清理:job_list、job_output、job_kill
模型侧有三个工具可用:job_list 列出任务、job_output 读取输出、job_kill 请求终止;终止必须同步、幂等并最终结算 done(来源)。 控制要点:
- 列出与读取 — 用
job_list找到目标任务,再用job_output读它的输出。预期:能在会话里直接追长任务的进展。 - 终止 — 用
job_kill请求终止,JobStatus会经过stopping走向killed。预期:终止是请求式的,等它真正结算。 - 拥有者销毁会连带取消 — owner 当前注册的 live Agent 一旦销毁,它的 job 会被取消并 await。预期:会话结束会带着它名下的任务一起收尾。
- 无主 job 更宽松 — 省略
owner会创建无主 job,对任何调用者开放直到服务销毁。预期:谨慎使用,这种任务不受会话围栏保护。 - 结算后写入会丢弃 — 结算后(生产方自行结束、被 kill 或注册表强制拆除)再写入不抛错,而是记录后丢弃。预期:生产方收尾的 flush 不会破坏自身清理路径。
想看看社区怎么用插件扩展长任务与任务面板,可以先进 DSH Plugin Hub 浏览。
注意事项与常见问题
- 别把任务 id 当密钥:访问控制依赖拥有者授权,id 本身不是保密手段。
done不等于成功:它只是资源释放的信号,结果要看结算状态与detail。- 输出上限是模型可见面的约束:
outputLimitBytes不改变环的保留策略。 - 长任务与子代理常常一起出现:委派出去的长任务也会变成 job,见《DeepSeek Harness 子代理怎么用》。
- 在 CI 等非交互场景里发起任务:注意退出语义,见《脚本和 CI 里怎么跑 dsh plugin 命令》。
常见问题
在 DeepSeek Harness 里,长时间运行的生产方会注册成 job,内置的 kind 至少有 bash 与 subagent;JobKind 派生自可声明合并扩展的 map,插件也能注册自己的 kind,注册表把每个 kind 当作不透明的 id 命名空间。
DeepSeek Harness 后台任务的 JobStatus 取 running、stopping、completed、killed、failed 之一;生产方特有的事实在运行期间归入 JobView.progress,结算后归入 JobView.detail。
DeepSeek Harness 面向模型的工具有 job_list、job_output 与 job_kill:前者列出任务,中间读取输出,后者请求终止。终止请求必须同步、幂等,并最终结算对应的 done。
DeepSeek Harness 后台任务的访问权限靠拥有者授权而非 id 保密:JobSpec 可声明 owner 会话,owner 当前注册的 live Agent 一旦销毁,其 job 会被取消并 await;省略 owner 则创建无主 job,对任何调用者开放直到服务销毁。
DeepSeek Harness 的 job 结算后(生产方自行结束、被 kill 或注册表强制拆除)再写入不会抛错,而是记录后丢弃,这样生产方收尾时的 flush 不会破坏自身的清理路径。
相关术语
- ctx.jobs
- ctx.jobs 是 DeepSeek Harness 的后台任务注册表服务,长时间运行的生产方通过它注册作业,运行时统一持有身份、访问控制、生命周期状态与输出环。— DeepSeek Harness 官方文档 - 后台任务运行时
- JobId
- JobId 是后台任务的品牌化标识,按 <kind>-N 生成;访问控制依赖拥有者授权而非 id 的保密性,因此不能把关照 id 当作安全手段。— DeepSeek Harness 官方文档 - 后台任务运行时
- JobStatus
- JobStatus 是任务的生命周期状态,取 running、stopping、completed、killed、failed 之一;运行期间的进度落在 JobView.progress,结算细节落在 JobView.detail。— DeepSeek Harness 官方文档 - 后台任务运行时
- JobHandle
- JobHandle 是交给生产方的作用面,提供 append 向输出环追加分块、updateProgress 更新实时进度行;它对应的方法都是同步的,且在该 job 整个生命周期内有效。— DeepSeek Harness 官方文档 - 后台任务运行时
来源
- DeepSeek Harness 官方文档 - 后台任务运行时· deepseek-harness
- DeepSeek Harness 官方文档 - 工具 Schema 目录· deepseek-harness