Files
DevFlow/docs/02-架构设计/aichat-async-approval-concept.md
绝尘 bf8e105440 新增: todo 标 Wave2 完成 + docs 落地 aichat 审查报告/构想
- todo: AR-2/3/4 标完成 + 已完成区加 WF-F(含审查误判记录)
- docs 落地 3 份历史遗留(todo/memory 指针此前断链):aichat-review-2026-06-14.md(审查报告,todo AR 段引用)+ aichat-async-approval-concept.md + aichat-info-density-concept.md(构想)
- task-advance-concept.md 为 Wave2 agent 越权自主产出,保留未追踪待评估
2026-06-14 15:52:58 +08:00

65 lines
3.8 KiB
Markdown

# 构想:对话 AI 异步审批 — 2026-06-14
> 性质:功能升级构想,未实现。记录用户提出的方向 + 可行性评估。
## 构想
对话 AI 的对话与审批改成**异步审批**:审批 pending 时不卡住整个对话,用户可继续聊别的,审批挂着随时处理。
## 痛点:当前同步审批卡住对话
当前审批是同步阻塞模型:
1. LLM 返回 Medium/High `tool_calls``process_tool_calls`(`audit.rs:170-191`)推 `pending_approvals` + 占位 `tool_result`("需要用户审批,等待确认")→ agentic loop `return`(`agentic.rs:184-192`),**`generating` 保持 true**。
2. 等待期间:`session.generating = true` → 新 `ai_chat_send` 直接 `Err("AI 正在生成中")`(`commands.rs:45`)→ 前端 `sendMessage` 把新消息入队(`useAiSend.ts:36`),`streaming = true` 输入框变停止按钮。
3. 用户必须先审批(或 stop)才能继续对话。**整个对话被审批阻塞。**
典型困扰:AI 提出待审批操作,用户想先问个别的(比如"等等,这个项目之前是不是建过?"),被阻塞,必须先处理审批。
## 难点分析
异步审批的真正难点不在 UI,而在 **agent loop 的语义**:
- 同步模型:LLM 发 tool_call → 占位 tool_result → loop 挂起 → 审批后 tool_result 替换为真实结果 → LLM 据真实结果生成下一步。上下文连贯。
- 异步模型:若审批 pending 时对话继续,LLM 已基于"占位结果"生成后续 → 审批结果回流时上下文已前进 → 不一致。
核心瓶颈是 `AiSession` 单例 + `generating` 单标志互斥(防并发混乱)。异步审批 + 并发对话需要 AiSession 多实例化或 sub-session——正是 [[aichat-arch-extensibility]] 记录的"剩四空壳/AiSession 单例未动"部分,属 B 路线。
## 方案分两档
### 档位一:轻量 — 跨对话异步(推荐先做)
审批 pending 的对话挂起(释放 generating 锁),用户**切到别的对话**继续聊,审批在原对话挂着,通过后结果回流原对话。
- 触及:AiSession 从单例 → 多对话独立状态(每对话一个活跃 loop 槽)。
- 不触及:同对话内 agent loop 语义不变(同对话内审批仍阻塞)。
- 复杂度:中等,是 B 路线(AiSession 多实例化)的一部分。
- 价值:解决"审批时想干别的"主诉求(切对话即可),不破坏 agent 语义。
### 档位二:完整 — 同对话异步
审批不阻塞同一对话,用户在同一对话里继续发消息,审批通过后工具结果作为新上下文回流。
- 触及:agent loop 语义重设计——LLM 上下文如何处理"待执行工具"(标记转审批?LLM 基于"已转人工"假设继续?)。
- 可能形态:审批转独立审批队列/通知中心,对话流遇到待审批工具不阻塞,告知"有 N 个待审批"后继续;审批通过后台执行工具,结果追加为新消息。
- 复杂度:高,接近重做 agent loop。
- 风险:LLM 上下文一致性、工具结果时效性、多任务并发安全。
## 评估
| 维度 | 档位一(跨对话异步) | 档位二(同对话异步) |
|------|---------------------|----------------------|
| 解决主诉求 | ✅ 切对话即可继续 | ✅ 同对话继续 |
| 架构改动 | AiSession 多实例化 | agent loop 语义重设计 |
| 与 B 路线 | 一部分 | 接近独立重做 |
| 风险 | 中(并发状态管理) | 高(上下文一致性) |
| 建议 | 先做 | 评估后定 |
**建议**:作为 B 路线一部分,先做档位一(跨对话异步),需先完成 AiSession 多实例化。档位二待 agent 能力升级时再评估。
## 关联
- 触及 [[aichat-arch-extensibility]] 记录的 AiSession 单例瓶颈。
- 与 [[aichat-roadmap-ab-split]] B 路线(补决策/并发能力)相关。
- 当前同步审批的其他问题(审批态 stop 卡死、新建对话破坏 session)见 `aichat-review-2026-06-14.md` H2/H3,异步化时一并解决。