Repository navigation
cancel() 把 turn/end 写成 reason:null(违反 TurnEndReasonMap 协议)—— 客户端事件订阅者永久死亡,对话区全空白 #9060
Unanswered
seeyouagain-laoda
asked this question in
Q&A
Replies: 1 comment
|
补一条写入侧的定位。 先说结论:日志里那行
所以只要有人用「它不认识的 cause」调一次程序化 cancel,日志里就会多一条 具体位置:
顺手一个建议:翻译函数碰到不认识的值时,退回 客户端侧再补一句:#9156 说的是 chat 包里的三处,但装配器那条路上还有一个共用定义同样没做保护,在 规避我按帖子里说的做了:帧感知定点修复(只重压含坏行的那一帧、保持 seq 连续)+ 客户端空值保护,没有重启应用就恢复了。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
问题:程序化
cancel()把turn/end持久化为reason: null(违反协议),导致客户端事件订阅者永久死亡、对话区全空白环境
dsh web)同样复现session.cancel(reason, { keepInbox })摘要
通过程序化
cancel()API 停止一个运行中的回合时,落盘的turn/end事件的data.reason被写成null。这违反了文档中TurnEndReasonMap的协议约定(取消中断应产生{ kind: "aborted", reason: <AgentCancelCause> })。随后 Web/桌面客户端的事件流订阅者(event feed subscriber)读到该事件即抛异常,整个事件流的订阅者全局死亡——所有会话的对话视图全部空白,直到重启应用或刷新页面。轨迹(Trajectory)视图不受影响,因为它不读取reason字段,所以表现为「轨迹正常、对话空白」,非常具有迷惑性。复现步骤
controlTarget.cancel("some-reason", { keepInbox: true }),随后steer(...)(重规划模式)~/.dsh/sessions/<工作区>/session-*/session.v4.jsonl.zstd)真实会话中实际落盘的事件(seq 1030):
{"type": "turn/end", "seq": 1030, "time": 1791299223721, "data": {"turn": 3, "reason": null}}客户端表现
打开该会话后,浏览器控制台:
reason)期望行为
按
docs/subsystems/session与python/sdk/README.md的约定:turn/end必须携带字符串类型的data.reason.kind—— 官方 Python SDK 对缺失 kind 的事件直接抛SdkProtocolError: "turn/end event requires a string data.reason.kind"{ "kind": "aborted", "reason": <AgentCancelCause> }实际行为
reason被持久化为null。Python SDK 会按协议违规拒收这份日志;JS 客户端则直接在它上面崩溃。修复建议
在 turn-end 序列化路径上,把程序化 cancel 的原因映射为结构化的
TurnEndReason(例如{ kind: "aborted", reason: <cause> };拿不到 cause 时回退{ kind: "interrupted" })。另外建议加固客户端组装器:遇到畸形的turn/end事件时跳过或降级处理,而不是让整个事件流订阅者崩溃。临时规避方案
对会话日志做「帧感知」的定点修复(把
reason: null改写为{"kind": "completed"}/{"kind": "interrupted"},保持 zstd 帧结构与 seq 连续性不变),即可恢复受影响的会话。补充说明:触发源是一个桌宠插件的重规划控制(cancel + steer)。插件侧调用的是公开 API,用法本身符合文档;缺陷在 DSH 写入侧的序列化。
All reactions