DeepSeek Harness Subagent、Jobs、Workflow:长任务与多 Agent 协作
JotaroRD

模块定位

当一个 Agent 需要把工作拆给子 Agent、后台任务或工作流引擎时,不能把所有东西都塞进当前 turn。DeepSeek Harness 用三个能力家族处理这类问题:

  • packages/subagent/*
  • packages/jobs/*
  • packages/workflow/*

Subagent

Subagent family 让 agent 把工作委托给 child agent。多个 provider 可以共存。

Provider 类型包括:

  • fresh in-process child。
  • 从 parent completed history fork 出 child。
  • ACP child。
  • Codex app-server child。
  • Claude Code child。
  • DSH SDK child。

模型通过 tool-subagent、tool-subagent-control、tool-subagent-report 进行委托、控制和报告。

1
2
3
4
5
6
7
8
9
10
flowchart TD
A["parent agent"] --> B["tool-subagent"]
B --> C["ctx.subagents"]
C --> D["in-process provider"]
C --> E["ACP provider"]
C --> F["Codex/Claude provider"]
D --> G["child session"]
E --> G
F --> G
G --> H["report/control tools"]

Continuable background children

子 Agent 不一定同步完成。Continuable child 可以在后台继续跑,parent 后续用 control tools 收集状态或继续沟通。

这解决了长任务阻塞当前 turn 的问题,也避免把所有子任务输出一次性灌回上下文。

Jobs

packages/jobs 提供通用后台 job runtime 和 model-facing job_* 工具。它适合不一定是 child agent 的后台工作,例如长时间外部执行、可停止任务、可收集结果的作业。

Jobs 的核心价值是:把“后台运行、状态查询、停止、收集”做成统一能力,而不是每个工具自己造一套任务表。

Workflow

Workflow family 提供 workflow seam、worker-thread engine 和 model-facing workflow / ralph tools。

它适合更结构化的多步骤执行:

  • 有固定步骤。
  • 有中间状态。
  • 需要 worker isolation。
  • UI 需要展示 workflow run。

与 Session 的关系

Subagent、jobs、workflow 都不能绕过 session log。模型可见报告、控制结果、工具输出都要通过 durable events 或 tool results 进入上下文。后台 live state 可以存在内存,但一旦要被模型看到,就要可重建。

常见坑

第一,子 Agent provider 不等于工具。Provider 注册在 ctx.subagents,工具只是 Consumer。

第二,后台任务不能只靠内存状态向模型解释结果。

第三,child session ownership 要明确,避免 parent dispose 后 child 泄漏。

第四,workflow UI replay 要依赖 durable run projection,而不是 live worker object。

继续读源码

  • packages/subagent/README.md
  • docs/subsystems/subagent.md
  • packages/jobs/README.md
  • docs/subsystems/jobs.md
  • packages/workflow/README.md
  • docs/subsystems/workflow.md