飞行中转向:无需重启即可重定向长时运行的智能体
观察一个开发者使用代理型 IDE 二十分钟,你会看到同样的小剧场上演三次。代理开始了一个长任务。在两次工具调用后,用户意识到他们想要一个函数式组件而不是类,或者想要 v2 接口而不是 v1,亦或是想用 Vitest 而不是 Jest 编写测试。他们手中只有一个杠杆:红色的停止按钮。他们按了下去。代理在编辑中途阵亡。他们复制并粘贴上一个提示词,加上修正,然后为前八分钟的工作支付了两次费用。
中止按钮是错误的交互设计。它将“我想调整计划”和“我想丢弃这次运行”视为同一种动作。在实践中,它们就像方向盘和弹射座椅一样迥异,而将两者混为一谈,正是为什么许多代理产品在任务耗时超过一屏输出时就显得脆弱不堪的原因。
解决方案不是更好的进度条或更自信的模型。它是一套架构接缝(architectural seams),让用户能够在不丢弃正确工作的情况下引入新信息;以及一套 UX 词汇,将航向修正、覆盖与取消区分开来,让用户无需思考就能选出正确的操作。
仅支持中止的 UI 是伪装下的分布式系统 Bug
大多数代理 UI 继承了请求-响应式 Web 应用的形态。你提交一个提示词,流(stream)回传,你看着它落地。反向流动的唯一控制信号只有 HTTP 连接本身——掐断套接字,你就杀死了运行。当工作单元能塞进单个响应时,这种模型没问题。但当工作单元是一个包含十几次工具调用的十五分钟计划,而用户在第七分钟有了新信息时,它就崩溃了。
根源在于缺少一个通道。令牌流和事件向下发送给客户端;但在运行结束前,几乎没有任何东西向上回传。当用户最终按下 Escape 键时,他们触碰到的是一个无状态的 HTTP 边界,该边界必须同时销毁流和推理流水线。这里不存在“继续运行但听我指挥”的原语。因此,产品发布时将“停止”作为唯一选项,每一次修正都变成了重启。
到 2026 年,交付真正的“飞行中转向”的团队——从 GitHub Copilot 的代理模式工作到 Codex 风格的编辑器——都得出了相同的诊断:你需要一个持久的双向通道、一个明确的在途运行标识(in-flight run identity),以及服务器上的一个接收转向输入的地点,以便代理在行动之间能获取这些输入。如果没有这三样东西,每一次中断都是一场与取消语义的竞态,用户的修正通常会比工具调用晚到一步。
