基于 Rust 实现的AI 智能体调度框架,包括:智能体任务编排, 核心思路是将复杂目标拆解为一系列有序、可控、可评估的子任务,通过系统性的逻辑设计,确保每一步都清晰、稳定、可复用。 核心编排模式:顺序编排、MapReduce、DAG(有向无环图)、共识模式(让多个Agent独立处理同一任务,再通过投票等方式整合结果)、分层编排、制作者-检查者模式、基于Actor模型的并发编排
CortexFlow 是一个 Rust 实现的 AI 智能体调度框架。它把复杂目标拆成有序的子任务,按依赖关系编排执行。
| 模式 | 说明 | 对应策略 |
|---|---|---|
| 顺序编排 | 线性依次执行 | SequentialStrategy |
| DAG 编排 | 按有向无环图的依赖关系执行 | DAGStrategy |
| MapReduce | 分发到多个执行器后聚合结果 | 规划中 |
| 共识模式 | 多 Agent 独立处理同一任务,投票整合 | 规划中 |
| 分层编排 | 嵌套子 DAG 实现层级化编排 | 规划中 |
| 制作者-检查者 | 一个 Agent 生产、另一个验证 | 规划中 |
| 领域 | 选型 |
|---|---|
| 异步运行时 | Tokio (features = ["full"]) |
| 序列化 | serde + serde_json + toml |
| 错误处理 | thiserror + anyhow |
| 异步 trait | async-trait |
| 并发原语 | parking_lot(同步锁) |
| 时间与 ID | chrono + uuid |
| 异步工具 | futures |
| LLM 客户端 | async-openai(可选) |
| 可观测性 | tracing + tracing-subscriber(可选) |
# 格式化
cargo fmt
cargo clippy -- -D warnings
cargo clippy --tests -- -D warnings
cargo test --lib --tests
cargo test
src/
├── lib.rs # 库入口,重新导出常用类型
├── main.rs # 二进制入口
├── dag/ # DAG 编排核心
│ ├── mod.rs
│ ├── dag_impl.rs # DAG 数据结构
│ ├── builder.rs # DAGBuilder 流式构建器
│ ├── node.rs # DAGNode 节点
│ ├── edge.rs # DAGEdge 边
│ └── executor.rs # DAGExecutor 并行执行器
├── task/ # 任务抽象与执行
│ ├── mod.rs
│ ├── task_trait.rs # Task / TaskExecutor trait
│ ├── task_input.rs # TaskInput
│ ├── task_output.rs # TaskOutput
│ ├── task_result.rs # TaskResult
│ ├── task_metadata.rs # TaskMetadata
│ ├── simple_task.rs # SimpleTask 简易实现
│ └── registry.rs # TaskRegistry 注册表
├── strategy/ # 可扩展编排策略
│ ├── mod.rs # StrategyType 枚举
│ ├── strategy_trait.rs # OrchestrationStrategy trait
│ ├── dag_strategy.rs # DAG 编排策略
│ ├── sequential_strategy.rs # 顺序编排策略
│ ├── factory.rs # StrategyFactory 工厂
│ └── registry.rs # StrategyRegistry 注册表
├── execution/ # 执行计划与引擎
│ ├── mod.rs
│ ├── engine.rs # ExecutionEngine
│ ├── plan.rs # ExecutionPlan / ExecutionNode
│ ├── state.rs # ExecutionState / ExecutionStatus / ExecutionPhase
│ └── report.rs # ExecutionReport / ReportGenerator
├── orchestrator/ # 框架门面
│ ├── mod.rs
│ ├── orchestrator.rs # Orchestrator 编排器
│ └── builder.rs # OrchestratorBuilder 构建器
├── context/ # 执行上下文
│ ├── mod.rs
│ ├── context.rs # ExecutionContext / ContextSnapshot / ContextLog
│ └── scope.rs # ContextScope 作用域隔离
├── config/ # 框架配置管理
│ ├── mod.rs
│ ├── framework_config.rs # FrameworkConfig
│ └── manager.rs # ConfigManager
├── llm/ # LLM 客户端封装
│ ├── mod.rs
│ ├── client.rs # LLMClient / LLMClientTrait / MockLLMClient
│ ├── config.rs # LLMConfig / LLMProvider(含 custom() 快捷构造)
│ ├── message.rs # Message / ChatRequest(请求级参数覆盖)
│ ├── registry.rs # LLMClientRegistry(多模型注册表)
│ ├── response.rs # LLMResponse / TokenUsage
│ └── token_tracker.rs # TokenTracker(自动集成)
├── error_recovery/ # 错误处理与恢复
│ ├── mod.rs
│ ├── retry.rs # RetryPolicy
│ ├── handler.rs # ErrorHandler
│ ├── compensation.rs # Compensation / CompensationChain
│ └── recovery.rs # ErrorRecovery
├── observability/ # 可观测性
│ ├── mod.rs
│ ├── tracer.rs # Tracer / TracerImpl / Span / TraceReport
│ └── metrics.rs # MetricsCollector / Metric
└── error/ # 统一错误类型
└── mod.rs # Error / Result
┌──────────────────────────────────────────────┐
│ Orchestrator(编排层) │ 统一入口,DAG 构建、策略注册、LLM/可观测性集成
├──────────────────────────────────────────────┤
│ Strategy(策略层) │ DAG / Sequential 策略实现 + 工厂 + 注册表
├──────────────────────────────────────────────┤
│ Execution(执行层) │ ExecutionEngine + ExecutionPlan + 状态机 + 报告
├──────────────────────────────────────────────┤
│ DAG(图编排层) │ DAG / DAGBuilder / DAGExecutor / Node / Edge
├──────────────────────────────────────────────┤
│ Task(任务层) │ Task trait / TaskExecutor / TaskRegistry / SimpleTask
├──────────────────────────────────────────────┤
│ 基础设施层 │
│ ┌────────┐ ┌────────┐ ┌───────────┐ │
│ │ Error │ │Context │ │ Config │ │
│ └────────┘ └────────┘ └───────────┘ │
│ ┌────────┐ ┌────────┐ ┌───────────┐ │
│ │ LLM │ │Observab│ │ Recovery │ │
│ └────────┘ └────────┘ └───────────┘ │
└──────────────────────────────────────────────┘
orchestrator ──→ strategy, dag, context, task
│ │ │
│ │ └──→ error
│ └──→ execution ──→ dag, context, error
│ │
│ └──→ strategy
│
├──→ config ──→ error
├──→ llm ──→ error
├──→ observability
└──→ error_recovery ──→ context, error
dag ──→ context, task, error
task ──→ error
context ──→ error
定义有向无环图结构、构建器与执行器,负责任务依赖关系建模与并行调度。
DAG/DAGBuilder— DAG 数据结构与流式构建器,支持添加节点、边及拓扑验证DAGNode/DAGEdge— 节点(携带任务 ID 与标签)与边(支持标签标记数据流语义)DAGExecutor— 按拓扑层并行执行节点,自动收集上游输出传递给下游,支持进度回调与取消NodeExecutionResult— 节点执行结果(成功/失败、输出、耗时、时间戳)
定义 Task trait、任务注册表、输入输出与元数据,是框架中最小可调度单元。
Task(trait) — 任务核心接口,定义 execute/validate/description 等方法TaskExecutor— 任务执行器,协调验证→执行→后处理流程TaskRegistry— 任务注册表,支持按 ID/名称查找与动态注册TaskInput/TaskOutput/TaskResult— 任务的输入数据、输出数据与执行结果TaskMetadata— 任务元数据(ID、名称、描述、标签)SimpleTask— 基于Box<dyn Fn>的简易任务实现
定义编排策略接口及 DAG/Sequential 等内置实现,支持通过工厂和注册表扩展。
OrchestrationStrategy(trait) — 策略核心接口,定义 execute/validate/plan/rollback 方法DAGStrategy— DAG 编排策略,按拓扑排序分层并行执行SequentialStrategy— 顺序执行策略,按拓扑排序逐个执行(并发数为 1)StrategyFactory— 策略工厂,按StrategyType创建策略实例StrategyRegistry— 策略注册表,支持动态注册与按名称/类型查找StrategyType— 策略类型枚举(Dag/Sequential/MapReduce/Consensus/Hierarchical/ProducerChecker)
管理执行状态、调度节点、生成执行报告。
ExecutionEngine— 执行引擎,根据策略和 DAG 生成执行计划并驱动执行ExecutionPlan/ExecutionNode— 执行计划与节点,描述执行顺序与并行层级ExecutionState/ExecutionStatus/ExecutionPhase— 执行状态机(Pending→Running→Completed/Failed)ExecutionReport/TaskReport— 执行报告,汇总各节点结果与耗时ReportGenerator— 从执行结果自动生成报告,支持 Display 格式化输出
协调 DAG 构建、策略选择、执行引擎等组件,提供统一的高层 API。
Orchestrator— 编排器主体,整合 DAG→Strategy→ExecutionEngine 的完整流程,支持多模型注册与 Token 聚合OrchestratorBuilder— 构建器,支持链式配置框架参数、策略、多模型注册(with_llm)、任务注册表等
提供作用域隔离的键值存储、上下文快照与日志,支持父子作用域数据继承与覆盖,集成 LLM 客户端访问。
ExecutionContext— 执行上下文,提供 get/set/remove 操作,支持作用域层级;集成get_llm()/default_llm()按名称获取 LLM 客户端ContextScope— 作用域隔离,子作用域可覆盖父作用域数据但不影响父级ContextSnapshot— 上下文快照,保存某一时刻的完整状态,支持回滚ContextLog— 上下文变更日志,记录 set/remove 操作历史
支持 JSON/TOML 格式的配置加载、验证与运行时管理。
FrameworkConfig— 框架配置结构体(max_workers、default_timeout、策略类型、日志级别等)ConfigManager— 配置管理器,支持从文件/字符串加载配置,提供验证与默认值填充
大语言模型客户端封装,支持多提供商、多模型管理、请求级参数覆盖与自动 Token 追踪。
LLMClient/LLMClientTrait— LLM 客户端及 trait,支持聊天补全、流式输出与请求级参数覆盖LLMConfig/LLMProvider— 配置(API Key、模型、Base URL)与提供商枚举(OpenAI/Anthropic/Azure/Ollama/Custom)LLMConfig::custom()— 快捷构造器,用于任何 OpenAI 兼容 API(火山引擎豆包、DeepSeek 等)ChatRequest— 请求级别参数覆盖(model、temperature、max_tokens),无需创建新客户端LLMClientRegistry— 多模型注册表,按名称注册、查找、设置默认,聚合 Token 追踪Message— 消息类型(System/User/Assistant),支持内容与工具调用LLMResponse/TokenUsage— 响应结构与 Token 使用量统计TokenTracker— Token 消耗自动追踪器,累计 prompt/completion/total token 与成本估算(LLMClient 自动集成)MockLLMClient— 测试用 Mock 客户端,可预设响应与延迟chat_structured— 结构化输出函数,将 LLM 响应反序列化为指定类型
提供任务执行过程中的错误处理和恢复机制,整合重试、错误分类与补偿操作。
RetryPolicy— 重试策略,支持固定间隔、指数退避,可配置抖动和可重试错误码ErrorHandler— 错误处理器,自动分类可恢复/不可恢复错误,支持错误码到动作的映射Compensation(trait) — 补偿操作 trait,支持同步/异步函数式补偿和补偿链CompensationChain— 补偿链,按注册逆序依次执行补偿操作(Saga 模式)ErrorRecovery— 统一管理器,整合重试+错误处理+补偿,提供execute_with_retry方法
提供分布式追踪与指标收集能力。
Tracer(trait) /TracerImpl— 追踪接口与实现,支持 Span 创建与嵌套Span/SpanStatus/SpanEvent— 追踪单元,记录开始/结束时间、状态(Ok/Error)与事件TraceReport— 追踪报告,汇总一次执行的所有 Span 数据MetricsCollector/Metric— 指标收集器,支持 Counter/Gauge/Histogram 三种类型
定义框架统一的错误类型和处理机制,涵盖 18 种错误场景。
Error(enum) — 统一错误枚举(TaskExecution/TaskNotFound/DAGValidation/DAGCycle/LLMCall/Config/Context/Strategy/Serialization/Timeout/Cancelled/Resource/Validation/Internal/IO/JSON/TOML/Other)Result<T>— 框架结果类型别名- 提供
is_recoverable()可恢复性判断与error_code()错误码体系
用户请求
│
▼
Orchestrator::execute_dag()
├── 1. DAGBuilder 构建 DAG
├── 2. dag.validate() 校验合法性
├── 3. ExecutionContext 创建执行上下文
├── 4. DAGExecutor 并行执行节点
│ ├── Kahn 算法:入度为 0 的就绪节点入队
│ ├── 按层并行,受 max_parallelism 限制
│ ├── 上游输出 → 下游输入(单上游直传,多上游合并为 Object)
│ ├── 进度回调 + 取消检查(AtomicBool)
│ └── NodeExecutionResult 收集
└── 5. 汇总结果 → ExecutionResult
| 决策 | 理由 |
|---|---|
| 策略运行时注册机制 | strategy/registry.rs, 新增 StrategyRegistry,支持 register()/create()/unregister()/is_registered(),默认注册 DAG 和 Sequential 两种策略 |
| LLM 流式输出 | llm/client.rs, LLMClientTrait 新增 stream_chat() 方法,返回 Receiver<Result>,默认回退到普通 chat |
| LLM 重试/超时 | LLMClient.chat_with_config() 内置了超时(tokio::time::timeout)和指数退避重试,只有可恢复错误才重试 |
| 上下文快照/恢复 | context/context.rs, xecutionContext 新增 snapshot()/restore()/clear(),ContextSnapshot 支持序列化 |
| 决策 | 理由 |
|---|---|
| 注册机制 | strategy/registry.rs |
| 验证完整性 | strategy/factory.rs |
| 任务间数据传递 | DAGExecutor 的 node_outputs + ExecutionProgress + 进度回调 |
| 结构化输出 | llm/client.rs |
| Token追踪 | llm/token_tracker.rs |
| 宏简化 | TaskRegistry(task/registry.rs),支持验证、元数据、标签/名称查找 |
| 作用域隔离 | 增强 ContextScope 父子隔离(context/scope.rs, context/context.rs),ExecutionContext::snapshot()/restore() |
| tracing集成 | TracerImpl, MetricsCollector, ReportGenerator, ExecutionProgress |
| 环境变量覆盖、热更新 | ConfigManager::load_with_env_override(), reload(), 改进错误信息(config/manager.rs, config/framework_config.rs) |
| src/task/registry.rs | TaskRegistry 独立实现 |
| src/llm/token_tracker.rs | Token 消耗追踪 |
| tests/task/ | 任务模块集成测试 |
| tests/error_recovery/ | 错误恢复集成测试 |
| tests/context/ | 上下文集成测试 |
| tests/config/ | 配置集成测试 |
| tests/llm/ | LLM集成测试 |
| 决策 | 理由 |
|---|---|
| tests/_common/ 目录 | Cargo 不会自动发现子目录中的文件,避免被编译为独立 test crate |
| #[path] 属性引入 | 每个测试模块通过 #[path = "../../_common/fixture_loader.rs"] 共享代码,无需复制 |
| #![allow(dead_code)] | fixture_loader 中部分类型只在特定测试 crate 中使用,全局允许避免警告 |
| JSON + TOML 双格式 | config 模块天然需要测试两种解析格式 |
| 类型化的 fixture | DAG/LLM/Task 有对应的 Rust struct,编译时检查 JSON schema 匹配 |
| serde_json::Value 灵活解析 | context 等简单场景直接用 Value 解析,避免过度类型化 |
| 决策 | 理由 |
|---|---|
| LLMConfig::custom() | 为 OpenAI 兼容 API(豆包、DeepSeek 等)提供快捷构造,替代手动构建 struct |
| ChatRequest 激活 | 已定义的 ChatRequest 集成到 LLMClientTrait,支持请求级别覆盖 model/temperature/max_tokens |
| LLMClientRegistry | HashMap 注册表替代单 Option<Arc<dyn LLMClientTrait>>,支持按名称注册/查找/默认设置 |
| Orchestrator 多模型集成 | Builder 新增 with_llm()/with_default_llm() 链式注册,保持 with_llm_config() 向后兼容 |
| TokenTracker 自动集成 | LLMClient.chat_with_config 成功后自动 record,LLMClientRegistry 共享 tracker 聚合统计 |
| ExecutionContext LLM 访问 | DAG 任务通过 ctx.get_llm("name")/ctx.default_llm() 获取客户端,无需 Arc 克隆 |
| build_override_config 独立函数 | 从 trait 方法提取为独立函数,保持 LLMClientTrait 的 dyn 兼容性 |