返回知识库
0

第七章:Agent 编排

本章目标:帮助你理解 Subagent 委托机制、Worker Thread 运行时、Workflow 工作流、Preset 预设编排和调度机制。阅读本章后,你应该能回答"多个 Agent 如何协作"以及"如何编排复杂的 Agent 工作流"。


7.1 Subagent 委托

7.1.1 概念

Subagent 允许一个 Agent 将任务委托给另一个 Agent。这是 dsh 实现多 Agent 协作的核心机制。

预览
源码

委托任务

委托任务

委托任务

结果返回

结果返回

结果返回

主 Agent

Subagent 1

Subagent 2

Subagent 3

graph TB
    A[主 Agent] -->|"委托任务"| B[Subagent 1]
    A -->|"委托任务"| C[Subagent 2]
    A -->|"委托任务"| D[Subagent 3]
    B -->|"结果返回"| A
    C -->|"结果返回"| A
    D -->|"结果返回"| A

7.1.2 Subagent 架构

预览
源码

依赖

Subagent 能力

subagent/ (Service Definition)

subagent-local/ (Provider)

subagent-codex/ (Provider)

tool-subagent/ (Consumer)

core/agent

core/agent-loop

graph TB
    subgraph "Subagent 能力"
        A["subagent/ (Service Definition)"]
        B["subagent-local/ (Provider)"]
        C["subagent-codex/ (Provider)"]
        D["tool-subagent/ (Consumer)"]
    end

    subgraph "依赖"
        E["core/agent"]
        F["core/agent-loop"]
    end

    A --> B
    A --> C
    D --> A
    B --> E
    B --> F

7.1.3 创建 Subagent

// 通过 ctx.agents 创建 Subagent
const subagent = ctx.agents.create({
  sessionId: generateSessionId(),
  meta: {
    origin: 'subagent',
    delegationDepth: parentAgent.options.delegationDepth + 1
  }
})

// 向 Subagent 发送任务
subagent.inbox.insert({
  role: 'user',
  content: '请帮我分析这段代码'
})

// 等待结果
const result = await subagent.waitForCompletion()

7.1.4 Subagent 工具

// tool-subagent 将 Subagent 能力暴露为模型工具
ctx.tools.register({
  name: 'subagent',
  description: 'Delegate a task to a subagent',
  parameters: {
    type: 'object',
    properties: {
      task: { type: 'string', description: 'The task to delegate' },
      model: { type: 'string', description: 'Model to use' }
    },
    required: ['task']
  },
  async execute(input, context) {
    const subagent = ctx.agents.create({
      sessionId: generateSessionId(),
      meta: { origin: 'subagent' }
    })
    
    subagent.inbox.insert({
      role: 'user',
      content: input.task
    })
    
    const result = await subagent.waitForCompletion()
    return result
  }
})

7.2 Worker Thread 运行时

7.2.1 概念

Worker Thread 允许 Subagent 在独立的线程中运行,避免阻塞主 Agent 循环。

预览
源码
Subagent AgentWorker Thread主线程Subagent AgentWorker Thread主线程spawn(agentConfig)创建 Agent 实例执行任务结果返回结果
sequenceDiagram
    participant Main as 主线程
    participant Worker as Worker Thread
    participant Agent as Subagent Agent

    Main->>Worker: spawn(agentConfig)
    Worker->>Agent: 创建 Agent 实例
    Worker->>Agent: 执行任务
    Agent-->>Worker: 结果
    Worker-->>Main: 返回结果

7.2.2 WorkerRun

// 来自 packages/workflow/workflow-worker-thread/src/host.ts
class WorkerRun {
  /** 启动 Worker */
  async start(): Promise<void> {
    this.worker = new Worker(this.workerPath, {
      workerData: this.config
    })
    
    this.worker.on('message', (message) => {
      this.handleMessage(message)
    })
    
    this.worker.on('error', (error) => {
      this.handleError(error)
    })
  }
  
  /** 向 Worker 发送消息 */
  post(message: WorkerMessage): void {
    this.worker.postMessage(message)
  }
  
  /** 处理 Worker 消息 */
  private handleMessage(message: WorkerMessage): void {
    // 处理结果、状态更新等
  }
}

7.2.3 Worker 通信协议

// Worker 通信消息类型
type WorkerMessage =
  | { type: 'task'; task: string; config: AgentConfig }
  | { type: 'result'; result: TaskResult }
  | { type: 'status'; status: AgentStatus }
  | { type: 'error'; error: Error }
  | { type: 'cancel' }

7.3 Workflow 工作流

7.3.1 概念

Workflow 允许定义复杂的多步骤工作流,每个步骤可以是不同的 Agent 或工具调用。

预览
源码

Workflow

开始

步骤 1: 分析

步骤 2: 实现

步骤 3: 测试

步骤 4: 部署

结束

graph TB
    subgraph "Workflow"
        A[开始] --> B[步骤 1: 分析]
        B --> C[步骤 2: 实现]
        C --> D[步骤 3: 测试]
        D --> E[步骤 4: 部署]
        E --> F[结束]
    end

7.3.2 Workflow 架构

预览
源码

依赖

Workflow 能力

workflow/ (Service Definition)

workflow-worker-thread/ (Provider)

tool-workflow/ (Consumer)

subagent/

graph TB
    subgraph "Workflow 能力"
        A["workflow/ (Service Definition)"]
        B["workflow-worker-thread/ (Provider)"]
        C["tool-workflow/ (Consumer)"]
    end

    subgraph "依赖"
        D["subagent/"]
    end

    A --> B
    C --> A
    B --> D

7.3.3 定义 Workflow

// 来自 packages/workflow(概念性)
interface Workflow {
  /** Workflow 名称 */
  name: string
  /** 步骤定义 */
  steps: WorkflowStep[]
  /** 配置 */
  config: WorkflowConfig
}

interface WorkflowStep {
  /** 步骤名称 */
  name: string
  /** 步骤类型 */
  type: 'agent' | 'tool' | 'condition' | 'parallel'
  /** 配置 */
  config: Record<string, unknown>
  /** 依赖的步骤 */
  dependsOn?: string[]
}

7.3.4 执行 Workflow

// 执行一个 Workflow
const workflow = ctx.workflow.get('code-review')
const result = await workflow.execute({
  files: ['src/index.ts', 'src/utils.ts']
})

// Workflow 执行流程:
// 1. 分析代码(使用 Subagent)
// 2. 生成审查意见(使用 Subagent)
// 3. 应用修复(使用工具)
// 4. 验证结果(使用测试)

7.4 Preset 预设

7.4.1 概念

Preset 允许从 cordis.yml 文件定义预配置的 Agent 组合。每个 Preset 是一个完整的 Cordis 配置。

预览
源码

Preset

cordis.yml

插件列表

配置

工具集

graph TB
    subgraph "Preset"
        A["cordis.yml"] --> B[插件列表]
        A --> C[配置]
        A --> D[工具集]
    end

7.4.2 Preset 架构

预览
源码

Preset 能力

preset/ (Service Definition)

preset-local/ (Provider)

tool-preset/ (Consumer)

graph TB
    subgraph "Preset 能力"
        A["preset/ (Service Definition)"]
        B["preset-local/ (Provider)"]
        C["tool-preset/ (Consumer)"]
    end

    A --> B
    C --> A

7.4.3 定义 Preset

# presets/code-reviewer/cordis.yml
- id: code-reviewer
  name: Code Reviewer
  plugins:
    - '@deepseek-ai/dsh-tools'
    - '@deepseek-ai/dsh-fs'
    - '@deepseek-ai/dsh-shell'
  config:
    systemPrompt: |
      你是一个代码审查专家。你的任务是:
      1. 分析代码质量
      2. 检查潜在问题
      3. 提供改进建议
    tools:
      - file_read
      - file_write
      - bash

7.4.4 使用 Preset

// 加载 Preset
const preset = ctx.preset.get('code-reviewer')

// 创建使用 Preset 的 Agent
const agent = ctx.agents.create({
  sessionId: generateSessionId(),
  preset: 'code-reviewer'
})

7.5 Agent 团队(实验性)

7.5.1 概念

Agent Teams 是一个实验性的协调接缝,提供:

  • 持久化名册:团队成员管理

  • 任务板:任务分配和跟踪

  • 邮箱:成员间通信

预览
源码
graph TB
    subgraph "Agent Teams"
        A["ctx.agentTeams"] --> B[名册]
        A --> C[任务板]
        A --> D[邮箱]
    end

    subgraph "团队成员"
        E[Agent 1] --> A
        F[Agent 2] --> A
        G[Agent 3] --> A
    end
graph TB
    subgraph "Agent Teams"
        A["ctx.agentTeams"] --> B[名册]
        A --> C[任务板]
        A --> D[邮箱]
    end

    subgraph "团队成员"
        E[Agent 1] --> A
        F[Agent 2] --> A
        G[Agent 3] --> A
    end

7.5.2 团队协作

// 创建团队
const team = ctx.agentTeams.create({
  name: 'development-team',
  members: ['architect', 'developer', 'reviewer']
})

// 分配任务
team.tasks.assign({
  title: '实现用户认证',
  assignee: 'developer',
  priority: 'high'
})

// 成员间通信
team.mailbox.send({
  from: 'architect',
  to: 'developer',
  content: '请使用 JWT 方案'
})

7.6 编排模式

7.6.1 串行编排

预览
源码
graph LR
    A[Agent 1] --> B[Agent 2] --> C[Agent 3]
graph LR
    A[Agent 1] --> B[Agent 2] --> C[Agent 3]
// 串行执行
const result1 = await agent1.execute(task1)
const result2 = await agent2.execute(result1)
const result3 = await agent3.execute(result2)

7.6.2 并行编排

预览
源码
graph TB
    A[Agent 1] --> D[合并结果]
    B[Agent 2] --> D
    C[Agent 3] --> D
graph TB
    A[Agent 1] --> D[合并结果]
    B[Agent 2] --> D
    C[Agent 3] --> D
// 并行执行
const [result1, result2, result3] = await Promise.all([
  agent1.execute(task1),
  agent2.execute(task2),
  agent3.execute(task3)
])

7.6.3 条件编排

预览
源码
graph TB
    A[条件判断] -->|"是"| B[Agent 1]
    A -->|"否"| C[Agent 2]
graph TB
    A[条件判断] -->|"是"| B[Agent 1]
    A -->|"否"| C[Agent 2]
// 条件执行
if (condition) {
  await agent1.execute(task)
} else {
  await agent2.execute(task)
}

7.6.4 循环编排

预览
源码
graph TB
    A[开始] --> B[执行任务]
    B --> C{条件满足?}
    C -->|"否"| B
    C -->|"是"| D[结束]
graph TB
    A[开始] --> B[执行任务]
    B --> C{条件满足?}
    C -->|"否"| B
    C -->|"是"| D[结束]
// 循环执行
while (!condition) {
  await agent.execute(task)
}

7.7 调度机制

7.7.1 调度架构

预览
源码
graph TB
    subgraph "调度能力"
        A["schedule/ (Service Definition)"]
        B["schedule-local/ (Provider)"]
        C["tool-schedule/ (Consumer)"]
    end

    A --> B
    C --> A
graph TB
    subgraph "调度能力"
        A["schedule/ (Service Definition)"]
        B["schedule-local/ (Provider)"]
        C["tool-schedule/ (Consumer)"]
    end

    A --> B
    C --> A

7.7.2 调度任务

// 定时任务
ctx.schedule.add({
  name: 'daily-report',
  cron: '0 9 * * *',  // 每天早上 9 点
  async execute() {
    await generateDailyReport()
  }
})

// 一次性任务
ctx.schedule.addOnce({
  name: 'remind-deploy',
  delay: 3600000,  // 1 小时后
  async execute() {
    await sendNotification('记得部署')
  }
})

7.8 小结

概念一句话解释
SubagentAgent 将任务委托给另一个 Agent
Worker Thread在独立线程中运行 Subagent
Workflow复杂的多步骤工作流
Preset从 cordis.yml 定义的预配置 Agent 组合
Agent Teams实验性的团队协调机制
调度定时和一次性任务调度

下一步第八章:上下文与人类协作——深入理解用户交互、Sandbox Escalation、Context Guard Plan 机制。

DeepSeek-Harness / 07-Agent 编排 0 0 iliuqi
2026-09-04T07:48:53.236995571Z 2026-09-04T07:57:22.307458292Z