- routing.md: 移除Store/lib列表+5节模板 (330→131行) - chat.md: 添加集成契约+不变量 (180→134行) - butler.md: 移除重复→引用memory/hands-skills (215→150行) - hands-skills.md: 5节模板+契约+不变量 (281→170行) - pipeline.md: 添加契约+重组 (157→154行) - data-model.md: 添加契约+双库架构图 (181→153行) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
7.2 KiB
title, updated, status, tags
| title | updated | status | tags | |||
|---|---|---|---|---|---|---|
| Pipeline DSL | 2026-04-22 | active |
|
Pipeline DSL
从 index 导航。关联模块: hands-skills chat
1. 设计决策
WHY DAG 执行器: 工作流步骤之间存在数据依赖,DAG (有向无环图) 通过拓扑排序自动推导执行顺序,支持无依赖节点的并行执行,比线性管道更灵活、更高效。
WHY YAML 模板: 声明式定义 + 可版本控制。非技术用户可直接编辑 YAML 文件调整步骤和参数,无需重新编译。模板可随项目仓库同步、diff、review。
WHY 18 模板覆盖 8 行业: 管家模式面向行业垂直场景。每个行业目录包含该领域典型工作流(如汕头设计的供应链采集、医疗的政策合规),用户可直接使用或定制。
WHY v2 解析器: v1 仅支持线性步骤序列,v2 引入 DAG 依赖声明 (depends_on 字段),支持复杂分支和并行。v1 解析器保留用于向后兼容。
WHY ActionRegistry: Pipeline 步骤与具体执行逻辑解耦。action_type 字符串映射到注册的处理函数,新增步骤类型只需注册新 action,不改动执行器核心。
2. 关键文件 + 数据流
核心文件
| 文件 | 职责 |
|---|---|
crates/zclaw-pipeline/src/executor.rs |
DAG 执行器 — 拓扑排序 + 并行执行 |
crates/zclaw-pipeline/src/parser_v2.rs |
YAML v2 解析器 (11 tests) |
crates/zclaw-pipeline/src/parser.rs |
YAML v1 解析器 (兼容) |
crates/zclaw-pipeline/src/state.rs |
运行状态管理 |
crates/zclaw-pipeline/src/intent.rs |
Pipeline 意图匹配 |
crates/zclaw-pipeline/src/trigger.rs |
定时/事件触发器 |
desktop/src/lib/pipeline-client.ts |
前端 Pipeline 客户端 |
desktop/src/store/workflowBuilderStore.ts |
工作流编辑器状态 |
desktop/src/components/pipeline/ |
Pipeline UI 组件 |
desktop/src-tauri/src/pipeline_commands/ |
12 个 Tauri 命令 (4 文件) |
pipelines/ |
18 个 YAML 模板 (8 目录) |
架构流程
用户选择模板 (Workflow 面板)
→ pipeline-client.ts: invoke('pipeline_load_template')
→ parser_v2: 解析 YAML → PipelineDefinition (steps + depends_on)
→ executor: 构建 DAG → 拓扑排序 → 检测循环依赖
→ 并行执行无依赖节点:
→ ActionRegistry.resolve(action_type) → 具体 Handler
→ Handler 执行 → step_result (output + status)
→ 有依赖节点等待前驱完成 → 执行
→ 全部完成 → PipelineRun.status = Completed
→ 前端轮询 progress 或 Tauri Event 推送状态
集成契约
| 方向 | 接口 | 说明 |
|---|---|---|
| Called by ← UI | pipelineStore.ts / workflowBuilderStore.ts |
工作流面板交互: 列出模板、创建/运行/取消 Pipeline |
| Calls → runtime | Tauri invoke (discovery 12 命令) | pipeline_commands/ 转发到 DAG executor |
| Calls → skills/hands | ActionRegistry.resolve(action_type) |
Pipeline 步骤可能调用 Skill 或 Hand 执行具体动作 |
| Called by ← chat | intent_router.rs |
聊天消息意图匹配到 Pipeline 模板 |
| Calls → memory | 记忆检索 (via runtime) | Pipeline 执行时可检索历史记忆增强步骤上下文 |
3. 代码逻辑
运行状态
enum RunStatus { Pending, Running, Completed, Failed, Cancelled }
DAG 执行流程详解
- 解析阶段:
parser_v2.rs将 YAML 反序列化为PipelineDefinition,包含steps: Vec<StepDef>和每个 step 的depends_on: Vec<String> - 构建阶段:
executor.rs将 steps 映射为 DAG 节点,建立邻接表 (step_id → [依赖的 step_ids]) - 排序阶段: Kahn 算法拓扑排序,检测循环依赖 — 若排序后节点数 < 总节点数,说明存在环,返回错误
- 执行阶段: 按拓扑序逐层执行,同层无依赖节点并行。每步通过
ActionRegistry解析action_type到具体 Handler - 完成阶段: 全部步骤成功 →
Completed;任一步骤失败 → 整体Failed;用户可随时Cancel
Tauri 命令分布
| 文件 | 命令数 | 命令 |
|---|---|---|
| discovery.rs | 8 | list/get/run/progress/cancel/result/runs/refresh |
| crud.rs | 3 | create/update/delete |
| intent_router.rs | 1 | route_intent |
| presentation.rs | 2 | analyze_presentation/pipeline_templates |
前端 invoke 匹配: 8 个调用对应 8 个 discovery 命令。另有 2 个 @reserved (orchestration_execute/orchestration_validate,无前端 UI)。
模板分布 (18 YAML, 8 目录)
pipelines/
├── _templates/ (2) — article-summary, competitor-analysis
├── design-shantou/ (4) — 汕头玩具/服装: 通信/竞品/供应链/趋势
├── education/ (4) — 课堂/教案/研究→测验/学生分析
├── healthcare/ (3) — 数据报告/会议纪要/政策合规
├── legal/ (1) — 合同审查
├── marketing/ (1) — 营销活动
├── productivity/ (1) — 会议摘要
└── research/ (1) — 文献综述
不变量
DAG 节点必须有明确的依赖关系,循环依赖会在 topological sort 阶段被检测并报错。 模板 YAML 结构不重复 — 每个行业目录的模板聚焦该领域特有场景。
测试链路
| 功能 | 测试文件 | 测试数 |
|---|---|---|
| YAML 解析 v2 | parser_v2.rs | 11 |
| DAG 执行 | executor.rs | 2 |
| 意图匹配 | intent.rs | 5 |
| 状态管理 | state.rs | 6 |
| 触发器 | trigger.rs | 5 |
| 类型 | types.rs + types_v2.rs | 4 |
| 解析 v1 | parser.rs | 5 |
| 引擎上下文/阶段 | engine/ | 8 |
| 演示 | presentation/ | 13 |
| 合计 | 13 文件 | 59 |
4. 活跃问题 + 注意事项
| 优先级 | 问题 | 说明 |
|---|---|---|
| P2 | Pipeline+Skill E2E 通过率 37.5% | Tauri IPC 可用但参数格式问题,非核心链路 |
| P3 | Deepseek 中继任务卡 processing | Provider Key 禁用后已有任务不自动清理 |
| — | pipeline_create 反序列化 | BUG-L2 已修复 (04-17 回归),需持续关注 |
注意事项: Pipeline 步骤中的 action_type 必须在 ActionRegistry 中注册,未注册的 action 会导致步骤 Failed。模板 YAML 的 depends_on 字段引用的 step_id 必须存在,否则解析阶段报错。前端 workflowBuilderStore.ts 负责编辑器状态,但 CRUD 操作通过 pipeline-client.ts 调用 Tauri 命令,不直接操作文件系统。
5. 变更日志
最近 5 条与 Pipeline 相关的变更。完整日志见 log。
| 日期 | 变更 |
|---|---|
| 2026-04-21 | Phase 0+1 修复: Skill 工具调用桥接 complete_with_tools() + Hand 字段映射 runId |
| 2026-04-17 | E2E 回归: pipeline_create 反序列化 BUG-L2 修复 |
| 2026-04-16 | 3 项 P0 修复 + 5 项 E2E Bug 修复,Pipeline Tauri 命令数校正 |
| 2026-04-09 | Pipeline+Hands 双交付,DAG 执行器稳定化 |
| 2026-04-01 | 17 YAML 模板 + DAG 执行器初始版本 |
关联模块
- hands-skills — Pipeline 步骤可能调用 Hand/Skill 执行具体动作
- chat — Pipeline 可通过聊天意图匹配触发 (
intent_router.rs) - memory — Pipeline 执行时可检索记忆增强上下文