You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
RFC:x-sdk Agent Interaction Runtime
1. 摘要
第一阶段已完成 Runtime 到 UI 的单向事件链路:
本 RFC 在原链路上增加三项能力:
AgentCommand:将批准、拒绝、工具重试和 Run 取消等用户意图发送回 Runtime。Agent Interaction Runtime:在useXChat中管理 agentActions、Command State 和连接状态。Checkpoint / Resume:复用现有 AgentState 和 Store,恢复会话状态并从游标续传事件。完成后的双向链路:
本 RFC 不新增
useAgent,不增加mode,不让 UI 直接 dispatch Runtime Event,也不改变普通 ChatProvider 行为。2. 第一阶段基线
以下能力已存在并直接复用:
agent/protocolagent/protocol/factory.tsagent/reducerprocessedEventIds、getAgentEntityKeydispatch、batch、reset、subscribereset恢复,不建新 Storechat-providers/AgentProvider.tsrunAgentProvider.tsvalidateAgentProviderEventsuseAgentChatRuntimeuseXChat({ provider })兼容基线:
AbstractChatProvider继续通过 XRequest 处理网络请求。AgentProvider不继承AbstractChatProvider,继续绑定独立 AgentTransport。isAgentProvider仍只通过provider.protocol.name === 'agent-event'判别。messages继续是兼容投影,结构化实体仍在agentState。3. 问题
3.1 没有用户意图协议
当前只有 Event。业务方如果在点击批准后直接 dispatch
approval.resolved,会把“用户请求批准”错误地当成“Runtime 已完成批准”。Runtime 可能拒绝、超时、已处理或执行失败,因此必须增加独立 Command。3.2 Provider 只支持启动 Run
当前 AgentProvider 可以:
但无法在一个活动 Run 中接收审批和重试命令,也没有声明命令能力。
3.3 useXChat 只有请求和 abort
当前 Agent 模式返回
agentState、onRequest、abort和isRequesting,没有:3.4 Transport 无法续传
当前
AgentTransport.open(request, signal)不暴露 cursor,也没有 resume 方法。发生断线后只能重新开始请求,无法判断遗漏或重复事件。4. 目标
approval.resolve、tool.retry、run.cancel三种 P0 命令。useXChat在 AgentProvider 模式返回稳定的 agentActions。5. 非目标
6. 总体设计
状态所有权:
7. AgentCommand Protocol
7.1 版本
Command 使用独立版本:
Command 与 AgentEvent 独立协商版本。新增 Command 不能静默改变第一阶段
AgentEvent 0.1的解释。7.2 Payload
7.3 信封
approvalId和toolCallId放在判别 payload 中,不再增加含义模糊的顶层targetId。7.4 工厂
工厂要求:
7.5 运行时校验
提供:
校验范围:
8. Command State
Command State 不进入 AgentState。它表示客户端提交过程,不表示 Runtime 实体结果。
Command key:
Interaction Runtime 同时维护:
UI 通过 action key 找到实体最近一次 Command:
状态转换:
约束:
9. Provider 扩展
9.1 能力声明
兼容规则:
commands缺失等价于空数组。resumable缺失等价于 false。9.2 错误分类与命令入口
设计理由:
AbstractChatProvider增加 executeCommand。useXChat直接 fetch。参考 AgentProvider 应优先复用自身 AgentTransport 或已有请求基础设施,不在 Hook 内实现网络请求。
9.3 runAgentCommand
执行步骤:
与 runAgentProvider 一致,onEvent 抛出的 Consumer 错误原样传播,不能被 transform 成 Provider 错误。
9.4 Sequence
AgentState.lastSequenceByRun[runId]。10. agentActions
10.1 API
agentActions 方法使用
useEvent保持引用稳定。调用时读取最新 Provider、session、AgentState 和 command store。10.2 前置校验
resolveApproval:
retryTool:
cancelRun:
前置校验失败不创建 Command,也不调用 Provider。
10.3 取消语义
cancelRun与现有abort()不合并:abort()agentActions.cancelRun()run.cancelledEventcancelRun 执行时:
run.cancelled后关闭主 Run Transport。11. useXChat API
11.1 Agent 配置
不增加:
Provider 仍是唯一执行入口,Store 和 Transport 不暴露到 Hook 顶层。
11.2 Agent 返回值
返回约束:
11.3 Connection State
含义:
12. Checkpoint
12.1 格式
为什么包含 pendingCommands:
为什么包含 inputByRun,而不保存 Request:
onRequest时的原始 input;恢复时重新调用provider.createContext和provider.prepareRequest。12.2 Storage
P0 提供:
安全默认:
12.3 保存时机
12.4 恢复顺序
在 restoring 完成前:
12.5 Checkpoint 校验失败
13. Transport Resume
13.1 接口
保持兼容:原 Transport 只实现 open 仍合法。
13.2 runner 增量
RunAgentProviderOptions增加:规则:
13.3 重试策略
14. Selectors
selectors 位于
agent/selectors,保持纯函数和 UI 无关:约束:
@ant-design/x。15. 状态模型增量
15.1 ToolCall Attempt
规则:
15.2 Approval 编辑与版本
字段均为可选,第一阶段 Provider 继续兼容。Runtime 是版本冲突和过期的最终判断者。
16. 错误模型
错误隔离原则:
17. 并发与竞态
P0 规则:
18. 文件改动
参考 Provider:
文档:
19. 串行实施顺序
一次只允许一个工作项进入实现;每项完成类型、单测、文档后再进入下一项。
20. 测试计划
20.1 Command
20.2 Provider runner
20.3 useXChat
20.4 Checkpoint / Resume
20.5 回归
21. 兼容与发布
21.1 兼容矩阵
21.2 实验性出口
experimentalAgent暴露。22. 备选方案
22.1 新增 useAgent Hook
不采用。第一阶段已经选择 useXChat 作为唯一 React 入口;新增 Hook 会让消息、会话和 Agent 状态产生两套集成方式。
22.2 将 Command 做成 Event
不采用。用户意图与 Runtime 事实语义不同,混用会允许 UI 伪造完成状态。
22.3 UI 直接调用 Provider
不采用。会绕过 capability、幂等、Command State、Checkpoint 和错误边界。
22.4 AgentProvider 继承 AbstractChatProvider
不采用。普通消息 Provider 和结构化 AgentProvider 的生命周期不同,第一阶段已经建立显式协议判别。
22.5 强制所有 AgentProvider 使用 XRequest
不采用。AgentProvider 已支持 SSE、WebSocket 和 AsyncIterable Transport;强制 XRequest 会限制 Runtime 和恢复能力。普通 ChatProvider 仍遵守 AbstractChatProvider + XRequest 约束。
22.6 自动重发 pending Command
不采用。即使有幂等键,也不能假设所有 Runtime 正确实现;恢复时先补 Event,再让用户确认重试。
23. 验收标准
All reactions