模块定位
当一个 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 | flowchart TD |
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.mddocs/subsystems/subagent.mdpackages/jobs/README.mddocs/subsystems/jobs.mdpackages/workflow/README.mddocs/subsystems/workflow.md