- 编辑器:/workflows 库页 + /workflow/<name> 编辑器(Vue Flow 画布,开始/结束/阶段/审核/分支五类节点,白前进/蓝通过/红驳回三色语义连线,dagre 自动排版) - 落盘:modules/workflow_manager.py;host 存运行态根 workflows/,web/docker 存 users/<user>/personal/workflows/;源码树 workflows/ 为内置种子,用户库同名覆盖、内置不可删 - REST:GET/PUT/DELETE /api/workflows[/<name>],保存时后端强制 error 级结构校验 - 路由根治:新增 isConversationIndependentRoute() 统一谓词(URL 派生),收敛全部 9 处对话接管/URL 写回判断点,根治 /workflows 下地址栏被拽回对话的问题 - 深色主题 token 提亮(surface-soft/card/muted 去近黑色阶)
142 lines
9.0 KiB
Markdown
142 lines
9.0 KiB
Markdown
# 工作流(Workflow)功能设计方案
|
||
|
||
> 状态:设计讨论中(2026-08-18 更新,纳入阶段汇报工具 / 非线性路由 / 可视化编辑决策)。
|
||
> 调研依据:`workflow_research/external_products/agentic_workflow_research.md`(外部产品)、`workflow_research/code_mount_points/code_mount_points.md`(代码挂载点)。
|
||
|
||
## 1. 功能定义
|
||
|
||
用户把「一套既定流程:工作方式 → 验证方式 → 结束方式」存为一个**工作流**(workflow),之后在任何普通对话中激活它,让主智能体复用现有循环与执行引擎按流程推进;阶段结束/整体结束时可由审核智能体软审核。
|
||
|
||
核心原则(外部调研共识):**结构在边上,自主在节点内**——工作流只约束阶段拓扑与进出契约,阶段内主智能体完全自主(自由调工具、跑脚本)。
|
||
|
||
## 2. 已拍板的设计决策
|
||
|
||
| 决策点 | 结论 |
|
||
|---|---|
|
||
| 运行方式 | **不做独立模式/特殊 URL/新对话类型**,只能在正常对话中激活 |
|
||
| 激活入口 | **/ 菜单(slash 菜单)** 人工激活 + **AI 工具 `activate_workflow`** 自主激活 |
|
||
| 阶段边界 | **显式化**:AI 调**阶段汇报工具**声明阶段完成(期间汇报触发审核与推进;无后续阶段时该汇报即停止信号) |
|
||
| 阶段模型 | **非线性**:阶段间为候选路由集(结构约束候选、AI 自主选择、审核把关),非纯线性 |
|
||
| 可视化编辑 | 拖拽画布编辑器(类似 ComfyUI 流程图)纳入设计范围,编辑对象是 WORKFLOW.md 的阶段拓扑 |
|
||
| 与目标模式关系 | **不互斥**:工作流可以是目标模式中的一个小步骤;目标模式后续将重做,本期不考虑两者冲突 |
|
||
| 审核配置 | **独立**:`workflow_review.json`(走 resolve_deploy_config 回退链)+ frontmatter `review_mode` 自声明 |
|
||
| 前后端通信 | **轮询**(复用 task 轮询 session_data 快照链路,不新增 websocket 通道) |
|
||
| 状态隔离 | **对话级状态**,多对话可同时激活不同工作流,进度互不串扰 |
|
||
| 硬校验 | 不做步骤级硬校验;归档时只做结构校验(frontmatter 合法、阶段 id 唯一、路由目标存在) |
|
||
| 存储形态 | 工作流文件夹 = `WORKFLOW.md`(frontmatter 结构 + 自然语言正文)+ `scripts/`(已验证脚本)+ `references/`(可选),与 skill 对齐 |
|
||
|
||
## 3. 存储与落盘位置
|
||
|
||
| 模式 | 用户工作流库 | 说明 |
|
||
|---|---|---|
|
||
| host | `~/.astrion/astrion/host/workflows/` | 统一,不按用户拆(对齐 `CUSTOM_SKILLS_DIR`) |
|
||
| docker/web | `users/<user>/personal/workflows/` | 每用户私有,多项目共享(对齐 `infer_private_skills_dir`) |
|
||
|
||
- 源码树 `workflows/` 只放内置示例种子,双源合并。
|
||
- 归档工具 `create_workflow`:校验 → `shutil.move` → 已存在拒绝覆盖(复用 `archive_skill_directory` 模式)。
|
||
- 运行时状态:`{workspace.data_dir}/workflow_states/<conversation_id>.json`(对话级,对齐已修复的 goal 对话级方案)。
|
||
|
||
## 4. WORKFLOW.md 格式(非线性候选路由)
|
||
|
||
```markdown
|
||
---
|
||
name: code-review-pipeline
|
||
description: 代码评审标准流程
|
||
review_mode: active # 审核智能体是否可调用只读 run_command 取证
|
||
max_stage_rounds: 20 # 单阶段最大轮数,防死循环
|
||
entry: explore # 入口阶段
|
||
stages:
|
||
- id: explore
|
||
name: 代码探索
|
||
goal: 理解改动范围与相关模块
|
||
review: false
|
||
next: [review] # 候选路由集:AI 汇报时从中选择下一站
|
||
- id: review
|
||
name: 逐项评审
|
||
goal: 按 checklist 评审每个文件
|
||
review: true # 阶段汇报先触发审核
|
||
review_prompt: 检查是否遗漏边界条件和安全问题
|
||
next: [report, explore] # 审核通过后可进报告,也可回探索补充
|
||
- id: report
|
||
name: 输出报告
|
||
goal: 生成结构化评审报告
|
||
review: true
|
||
next: [] # 空 = 终点,汇报即触发整体结束
|
||
end_conditions: 报告落盘且审核通过
|
||
---
|
||
|
||
# 工作方式 / 验证方式 / 结束方式(自然语言正文,随阶段上下文注入)
|
||
```
|
||
|
||
- **路由语义**:`next` 是候选集(结构约束);AI 在阶段汇报工具中传 `next_stage_id` 自主选择;审核智能体可否决路由选择(打回时附带建议去向)。
|
||
- **结构校验**(归档时):name/description/entry/stages 齐全、id 唯一、next 引用存在、entry 可达终点。
|
||
- `position` 字段(可选)仅记录画布坐标,供可视化编辑器使用,不影响执行。
|
||
|
||
## 5. 运行时机制(复用现有引擎 + 显式阶段边界)
|
||
|
||
### 主路径:阶段汇报工具驱动
|
||
|
||
```
|
||
对话激活工作流 → 注入入口阶段上下文(goal + 工作方式 + 候选路由)
|
||
↓
|
||
主智能体正常跑(现有引擎不变,自由调工具、跑 scripts/)
|
||
↓
|
||
AI 调 report_workflow_stage(summary, next_stage_id?) ← 阶段边界显式声明
|
||
↓
|
||
当前阶段 review=true?──否──→ 校验 next_stage_id 在候选集 → 推进,注入新阶段上下文
|
||
│是
|
||
↓
|
||
WorkflowReviewAgent 审核(active 模式可只读取证)
|
||
├─ pass → 推进(next 为空 → 整体结束审核 → done,停止)
|
||
└─ retry → 工具结果返回整改反馈,本阶段继续
|
||
```
|
||
|
||
### 兜底:无 tool_calls 拦截(降级为提醒)
|
||
|
||
主循环 `if not tool_calls:` 分支仍保留工作流检查,但语义降为**提醒**:工作流活跃且当前阶段有产出却未汇报时,注入「你还有进行中的工作流阶段 X,请用阶段汇报工具汇报或继续推进」提示并 continue 一轮;连续提醒无响应则按空转保护停止。阶段推进的主路径永远是显式汇报。
|
||
|
||
### 其他
|
||
|
||
- **结束**三种:汇报至终点点(done)、撞边界(max_stage_rounds / 空转)、用户取消(slash 菜单或 deactivate)。
|
||
- **压缩维持**:状态落盘 + `handle_task_with_sender` 入口重注入当前阶段上下文(对齐 goal 重注入模式)。
|
||
- **编排模块**:新增 `server/workflow_flow.py`(仿 `server/goal_flow.py`)。
|
||
- **审核智能体**:`modules/workflow_review_agent.py`(fork `goal_review_agent.py`),内部工具 `report_workflow_stage_status`(pass/retry/complete);配置 `resolve_deploy_config("workflow_review.json")`。
|
||
- **与目标模式并存**:不互斥;目标模式后续重做时统一考虑两者关系。
|
||
|
||
## 6. 通信与前端
|
||
|
||
- **轮询链路**(现成):sender 事件 → `session_data` 快照 → REST 轮询透传 → 前端 `taskPolling/lifecycle.ts` case 消费。
|
||
- 新增事件:`workflow_progress` / `workflow_review_progress` / `workflow_completed` / `workflow_stopped`,快照自带 `conversation_id`(对齐 goal 修复后的过滤机制)。
|
||
- **激活**:slash 菜单新增 `workflows` 模式(数据 `GET /api/workflows`);`POST /api/workflow/activate|deactivate`。
|
||
- **进度展示**:仿 goal 进度组件——当前阶段名 · 已完成阶段列表 · 审核状态 · 轮数。
|
||
- **状态 API**:`GET /api/workflow/status?conversation_id=` 供轮询/刷新恢复。
|
||
|
||
## 7. 可视化拖拽编辑器(设计讨论中)
|
||
|
||
- **技术选型**:Vue Flow(项目为 Vue 3,React Flow 的 Vue 移植,API 同构)。
|
||
- **编辑对象**:WORKFLOW.md frontmatter 的 stages 拓扑;节点 = 阶段,边 = next 候选路由;`position` 仅存坐标,与执行解耦。
|
||
- **与 AI 生成协同**:AI `create_workflow` 生成归档 → 画布打开可视化/微调;画布编辑 → 序列化回 WORKFLOW.md。
|
||
- **页面形态与一期范围**:待定(见 §9)。
|
||
|
||
## 8. 新增工具与文件清单
|
||
|
||
| 项 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| `create_workflow` | AI 工具 | 生成并校验归档(仿 create_skill) |
|
||
| `read_workflow` | AI 工具 | 读工作流定义(仿 read_skill) |
|
||
| `activate_workflow` / `deactivate_workflow` | AI 工具 | 开启/退出当前对话的工作流 |
|
||
| `report_workflow_stage` | AI 工具 | **阶段汇报**:期间汇报触发审核推进;无后续阶段时即停止信号 |
|
||
| `report_workflow_stage_status` | 审核智能体内部工具 | pass/retry/complete(仿 report_goal_status) |
|
||
| `modules/workflows_manager.py` | 模块 | 校验/归档/目录合并(仿 skills_manager) |
|
||
| `modules/workflow_state_manager.py` | 模块 | 对话级状态落盘(对齐 goal_state_manager 对话级方案) |
|
||
| `modules/workflow_review_agent.py` | 模块 | 阶段/整体审核 |
|
||
| `server/workflow_flow.py` | 模块 | 编排:激活/注入/汇报处理/推进/兜底提醒 |
|
||
| `server/tasks/workflows.py` | REST API | 列表/激活/状态/画布读写 |
|
||
| `prompts/workflow.txt` | 提示词 | 工作流上下文模板 |
|
||
|
||
## 9. 待确认
|
||
|
||
- 可视化编辑器页面形态:独立路由页面(如 `/workflows` 库 + 编辑器)还是对话内弹层/抽屉?
|
||
- 编辑器一期范围:完整拖拽编辑(增删节点/连线/改参数/保存)还是先做只读可视化 + 文本编辑?
|
||
- 兜底提醒的容忍轮数(建议连续 2 轮无响应转空转停止)。
|