实验
统一运行时流式处理重构计划
目标
为 main、subagent 和 acp 提供一个共享的流式处理管道,使所有运行时获得完全相同的合并、分块、交付顺序和崩溃恢复行为。
背景原因
- 当前行为分散在多个特定于运行时的处理路径中。
- 格式化/合并的修复可能只在一个路径中生效,而在其他路径中依然存在。
- 交付一致性、重复抑制和恢复语义更难以推理。
目标架构
单一管道,运行时特定适配器:
- 运行时适配器仅发出规范事件。
- 共享流组装器合并并最终确定文本/工具/状态事件。
- 共享通道投影器一次性应用通道特定的分块/格式化。
- 共享交付账本强制执行幂等发送/重放语义。
- 出站通道适配器执行发送并记录交付检查点。
规范事件契约:
turn_startedtext_deltablock_finaltool_startedtool_finishedstatusturn_completedturn_failedturn_cancelled
工作流
1) 规范流式处理契约
- 在核心中定义严格的事件模式 + 验证。
- 添加适配器契约测试,保证每个运行时发出兼容的事件。
- 尽早拒绝格式错误的运行时事件,并提供结构化诊断信息。
2) 共享流处理器
- 用一个处理器替换特定于运行时的合并器/投影器逻辑。
- 处理器负责文本增量缓冲、空闲刷新、最大分块拆分和完成刷新。
- 将 ACP/main/subagent 配置解析移至一个辅助程序中,防止配置漂移。
3) 共享通道投影
- 保持通道适配器简单:接受最终确定的块并发送。
- 将 Discord 特定的分块特性仅移至通道投影器。
- 在投影之前,保持管道与通道无关。
4) 交付账本 + 重放
- 添加每个回合/每个分块的交付 ID。
- 在物理发送前后记录检查点。
- 重启时,幂等地重放待处理分块并避免重复。
5) 迁移与切换
- 阶段 1:影子模式(新管道计算输出,但旧路径发送;进行对比)。
- 阶段 2:按运行时逐个切换(按风险顺序,先
acp,然后subagent,然后main,或反之)。 - 阶段 3:删除遗留的特定于运行时的流式处理代码。
非目标
- 本次重构不改变 ACP 策略/权限模型。
- 除投影兼容性修复外,不进行通道特定功能扩展。
- 不重新设计传输/后端(除非为实现事件对等性所需,否则 acpx 插件契约保持不变)。
风险与缓解措施
- 风险:现有 main/subagent 路径出现行为回归。缓解措施:影子模式差异对比 + 适配器契约测试 + 通道端到端测试。
- 风险:崩溃恢复期间发生重复发送。缓解措施:持久化交付 ID + 交付适配器中的幂等重放。
- 风险:运行时适配器再次出现分歧。缓解措施:为所有适配器要求共享契约测试套件。
验收标准
- 所有运行时通过共享流式处理契约测试。
- Discord ACP/main/subagent 对于微小增量产生等效的间距/分块行为。
- 崩溃/重启重放不会为同一交付 ID 发送重复分块。
- 遗留的 ACP 投影器/合并器路径已被移除。
- 流式处理配置解析是共享的且与运行时无关。