DeepSeek Harness 的 DSH plugin 后台任务:run_in_background 与 jobId

插件开发发布于 2026-10-02作者: DeepSeek Plugin 插件市场
DSH pluginDeepSeek Harness后台任务run_in_backgroundctx.jobs
DeepSeek Harness 的 DSH plugin 工具用 producer 控制 run_in_background,并以 ctx.jobs.start({ kind, label, owner, run }) 注册后台任务,成功分支返回 { kind: 'background', jobId }。

DSH plugin 让工具跑后台任务的办法是:用 producer 配置控制 run_in_background,在分支里调用 ctx.jobs.start({ kind, label, owner: exec.agent, run }) 注册任务,成功后返回类型化句柄 { kind: 'background', jobId }。 适合长耗时工作;发布 id 之后你必须改用任务自有的取消信号,而不是 exec.signal——这是很多 DSH插件 最容易踩错的一处。这与 工具插件开发 讲的前台契约是同一套工具模型的两个分支。

DSH plugin 的后台任务怎么开:producer 控制 run_in_background

后台能力不是工具自己开线程,而是由 producer 配置控制 run_in_background,把工作交给任务运行时(来源)。 判断依据很直接:

  1. 工作是否长耗时 — 需要等待很久、又要让调用方立刻拿到句柄的场景。预期:走后台任务,而不是让前台调用阻塞。
  2. 是否需要在执行中查看输出 — 希望过程中能拉取或接收输出追加。预期:后台任务提供 output 源与推送通道。
  3. 是否需要独立于调用的生命周期 — 调用被取消后工作仍应继续。预期:后台任务生命周期归 job_kill、owner dispose 与服务 teardown,而不是调用方。

注册表在进入 producer 主体前会把已预先中止的调用判为失败:此时没有任务,其 id 无法满足成功输出 schema(来源)。

DSH plugin 怎么注册后台任务:ctx.jobs.start 与类型化句柄

用 ctx.jobs.start({ kind, label, owner: exec.agent, run }) 注册任务,成功分支返回类型化规范句柄(来源)。 按三步落地:

  1. 声明后台分支 — 在 producer 里判断是否需要后台执行。预期:只有长耗时路径进入该分支。
  2. 调用 ctx.jobs.start — 传入 { kind, label, owner: exec.agent, run }。预期:运行时校验 owner 与任务控制器可用后开始工作。
  3. 返回类型化句柄 — 返回 { kind: 'background', jobId }。预期:调用方拿到 id,而不是等人读文本。

为什么强调类型化句柄:Native 渲染器可以保留 started background job bash-1 这类供人阅读的自然语言,但 PTC mode 绝不能通过解析该文本取得 id——程序只能读 jobId 字段,工具主体也不该迫使调用方从自然语言里解析 id 与字段。

DSH plugin 后台任务的 id、取消与输出怎么管

ctx.jobs.start() 发布 id 后,应使用任务自有的取消信号,而不是 exec.signal(来源)。 关键约定:

  • 取消语义一变:之后取消外层调用只会停止等待本次调用,不会终止已经发布的工作。
  • 生命周期归属:任务生命周期归 job_kill、owner dispose 与服务 teardown 所有。
  • spec 提供的能力:同步 cancel、在资源清理后 settle 且不 reject 的 done,以及拉取式 output 源或经 starter 收到的 JobHandle 推送的追加。
  • 输出读取:面向模型的消费式读取由 dsh-tool-jobs 从输出环渲染。
  • 前台仍然耦合信号:前台工作仍与 exec.signal 耦合,这点没变。

写完请自检三项:你写出的后台分支是否返回了 jobId 字段而非依赖文本;发布 id 后你是否改用任务自有取消信号;owner 是否设为 exec.agent 以便正确清理。想要现成的任务类工具实现对照,可在 DSH Plugin Hub 找同类插件。

常见问题

DSH plugin 的后台任务什么时候该用?和前台工具有什么区别?

DSH plugin 的后台任务用于长耗时工作:由 producer 配置控制 run_in_background,把工作交给任务运行时,前台调用立即拿到类型化句柄而不是等结果。前台工作仍与 exec.signal 耦合,后台工作则在任务发布 id 后改用任务自有的取消信号。

DSH plugin 怎么用 ctx.jobs.start 注册一个后台任务?

DSH plugin 在 producer 分支里调用 ctx.jobs.start({ kind, label, owner: exec.agent, run }) 注册任务。运行时会在 run() 启动前校验 owner 与任务控制器是否可用,随后提供 id、会话围栏、通用控制工具、通知与 owner 清理。

DSH plugin 后台任务的 jobId 从哪里取、成功分支返回什么?

DSH plugin 后台任务成功后返回类型化规范句柄 { kind: 'background', jobId },从字段里取 id。Native 渲染器可以保留 started background job bash-1 这类供人阅读的文本,但 PTC mode 绝不能通过解析该文本取得 id。

DSH plugin 后台任务发布后还能用 exec.signal 取消吗?

DSH plugin 后台任务在 ctx.jobs.start() 发布 id 后不能再靠 exec.signal 取消,必须改用任务自有的取消信号。此后取消外层调用只会停止等待本次调用,不会终止已发布的工作;任务生命周期归 job_kill、owner dispose 与服务 teardown 所有。

DSH plugin 的后台任务谁来清理、怎么读取输出、owner 又该怎么设?

DSH plugin 后台任务的 spec 提供同步 cancel、在资源清理后 settle 且不 reject 的 done,以及拉取式 output 源或经 JobHandle 推送的追加。面向模型的消费式读取由 dsh-tool-jobs 从输出环渲染,owner 清理由运行时负责。

相关术语

run_in_background
run_in_background 是 DSH plugin 的 producer 配置,用于把长耗时工具工作交给任务运行时;开启后成功分支返回类型化后台句柄而非最终结果。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/adding-a-tool
ctx.jobs.start
ctx.jobs.start 是 DSH plugin 注册后台任务的入口,接受 { kind, label, owner, run },发布任务 id 并提供会话围栏、控制工具、通知与 owner 清理。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/adding-a-tool
JobHandle
JobHandle 是 DSH plugin 后台任务的类型化句柄,成功后台分支以 { kind: 'background', jobId } 形式返回,并可经 starter 获得推送式输出追加。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/adding-a-tool
producer
producer 是 DSH plugin 工具里负责产出规范返回值的分支;后台形态下它由 run_in_background 配置控制,注册表会在进入其主体前把已预先中止的调用判为失败。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/adding-a-tool

来源