CMDC Orchestrator

CMDC 多 Agent 编排引擎 — DAG 驱动的 Agent 协作。

cmdc_orchestratorcmdc 之上提供「图驱动」的多 Agent 编排能力:把 工作流描述成 DAG(节点 + 边),由执行器按拓扑顺序调度,并把上游节点的输出 自动注入到下游节点的 prompt 中。

理论基石参考 Agentic Design Patterns 第 2 / 3 / 7 / 12 / 15 章(路由、并行化、 多 Agent 协作、异常处理与恢复、Inter-Agent 通信)。

安装

monorepo 内部通过 path 依赖:

def deps do
  [
    {:cmdc_orchestrator, path: "../cmdc_orchestrator"}
  ]
end

核心概念

概念 说明
Orchestration 一个 DAG(有向无环图),定义节点和依赖
Node DAG 节点,6 种类型::agent / :aggregator / :router / :gate / :debate / :hierarchy
Edge 节点间的数据流依赖 %{from:, to:, branch?:}
Run 一次编排执行,按拓扑序分层并行调度
Runtime DAG 全程共享的运行时容器(v0.3+),管理 Agent 会话池与 SubAgent 生命周期

节点类型

:agent

启动一个 CMDC Agent 执行配置好的 prompt,自动把 dep_results 拼到 prompt 末尾作为「上游节点输出」上下文。

%{
  id: "research",
  type: :agent,
  config: %{
    prompt: "调研 AI Agent 最新进展",
    system_prompt: "你是研究员",
    max_turns: 5,
    mode: :standalone        # v0.3+::standalone | :pool | :subagent
  }
}

v0.3 新增:三种执行模式

mode 说明 适用场景
:standalone(默认) 每次 ephemeral 会话,不复用 单点任务,无需历史
:poolpool_key 共享会话,对话累积 Debater / 多轮审稿等需要"角色记忆"
:subagent 通过 Runtime 注册独立长生命周期会话 需要 SubAgent 监督和生命周期跟踪

:pool 模式可指定 config[:pool_key](默认 node.id);:subagent 模式 由 Runtime 在 DAG 结束时统一回收。

:aggregator

合并多个上游结果。三种策略:"concat" 拼接 / "merge" 合并 map / "vote" 多数 投票。

%{id: "merge", type: :aggregator, config: %{strategy: "concat"}}

:router

按策略分发到不同分支,配合边的 :branch 标签由 Executor 自动剪枝 (ADP 第 2 章 Routing)。三种策略:

# 1. rule —— 顺序匹配 pattern
%{
  id: "classify",
  type: :router,
  config: %{
    strategy: "rule",
    rules: [
      %{pattern: "技术", branch: "tech_branch"},
      %{pattern: "商业", branch: "biz_branch"}
    ]
  }
}

# 2. random —— 在 branches 中均匀随机
%{config: %{strategy: "random", branches: ["a", "b", "c"]}}

# 3. llm(v0.3+)—— LLM 选择 + fallback
%{
  id: "intent_router",
  type: :router,
  config: %{
    strategy: "llm",
    branches: ["weather", "news", "search"],
    fallback: "search",
    router_agent: %{name: "Router", model: "openai:gpt-4o-mini"}
  }
}

:gate

质量检查点,criteria 全部通过才继续,否则中止整个 DAG。

%{id: "review", type: :gate, config: %{criteria: ["accurate", "concise"]}}

:debate(v0.3 新增)

多 Agent 辩论 + Judge 模式,对应 ADP 第 7 章 Multi-Agent Collaboration。

%{
  id: "debate",
  type: :debate,
  config: %{
    topic: "Elixir vs Python on Agents?",
    debaters: [%{name: "ProElixir"}, %{name: "ProPython"}],
    judge: %{name: "Judge"},
    max_rounds: 3,
    consensus_fn: fn rounds -> length(rounds) >= 2 end  # 可选提前终止
  }
}

:hierarchy(v0.3 新增)

Manager → Workers → Synthesizer 三段式协作。

%{
  id: "hier",
  type: :hierarchy,
  config: %{
    goal: "为新 SaaS 制定市场调研报告",
    manager: %{name: "PM"},                                 # 可选
    workers: [%{name: "Researcher"}, %{name: "Analyst"}],
    synthesizer: %{name: "Writer"},                          # 可选
    worker_assign: :round_robin,                             # 或 :pairwise
    max_parallel: 4
  }
}

可选 :tasks / :split_fn 完全跳过 LLM 拆解,直接用静态子任务列表跑离线测试。

使用示例

dag = %CMDCOrchestrator.DAG{
  nodes: [
    %{id: "research", type: :agent, config: %{prompt: "调研 AI Agent"}},
    %{id: "write", type: :agent, config: %{prompt: "写一篇 800 字博客"}},
    %{id: "review", type: :gate, config: %{criteria: ["完整"]}}
  ],
  edges: [
    %{from: "research", to: "write"},
    %{from: "write", to: "review"}
  ]
}

{:ok, results} = CMDCOrchestrator.execute(dag,
  model: "openai:gpt-4o-mini",
  api_key: System.fetch_env!("OPENAI_API_KEY")
)

results["write"]

执行失败时返回结构化错误,方便上层 UI 聚焦失败点:

{:error, %{node_id: "review", reason: "门禁未通过: 完整", completed: %{...}}}

与 CMDC v0.2 的集成

:agent 节点支持透传 cmdc 0.2 的全部 Agent 选项::user_data / :prompt_mode / :plugins / :tools / :provider / :model 等。

v0.3 通过 Runtime 提供原生的会话池和 SubAgent 支持,无需用户手工管理 CMDC.SubAgent.Supervisor

计划中

开发

mix deps.get
mix test
mix format --check-formatted
mix compile --warnings-as-errors
mix credo --strict

路线图

详见 CHANGELOG.mdexample/multi_agent_debate_demo.exs

许可

Apache-2.0