Python SDK 续接"旧会话"时流式正常,但续接回合不写回 session.jsonl #5950
Unanswered
XuYiFanHHH
asked this question in
Q&A
Replies: 0 comments
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.
环境:deepseek-harness-sdk / deepseek-harness-runtime-bin 的 0.1.2a3 与 0.1.2rc1 均存在(Windows,deepseek-harness-sdk-runtime-win-x64.exe)。通过 Python SDK run(input, session_id=已存在id, ...) 驱动。
现象:续接一个磁盘上已存在、但由不同 runtime 子进程创建的会话(例如宿主进程重启后),该回合能正常跑、正常流式、turn/end completed,但续接内容完全不写回 <dsh_home>/sessions//<session_id>/session.jsonl(文件无新增行、mtime 不变)。而当前子进程自己新建的会话续写正常 → 行为不对称:同进程能写,跨进程只跑不写。宿主重启后,所有旧会话的新回合都"看着正常、切换回来就没了"。
复现:
根因(源码,packages/sdk/server/src/server.ts @ dsh-v0.1.2):session/prompt → createSession() 总是 ctx.agents.create({sessionId, meta:{cwd}}),空 seed、从不 resume(getOrCreateSession() 只在同进程内存里复用)。对已存在 id,session-persistence/coordinator.ts 的 onCreated() → adoptLivePrefix() 会做 seedCoversPrefix(seed, storedEvents) 校验——空 seed 必不匹配非空旧日志 → 抛 id-collision(~L1498/L1510);该异常落在被 .catch(()=>{}) 吞掉的异步 init(~L1369)里,所以会话照常跑、照常流式,但写回 flush()(await live.init,~L1528)永不执行 → 什么都没追加。
建议修复:SDK 的 session/prompt 在目标 id 已有磁盘日志时应走 resume(agents.resume / persistence.prepare),而不是永远 agents.create 空会话,与交互式运行时保持一致 → 跨进程续接能写回原日志。另外那个被吞掉的 .catch(()=>{}) 把写失败静默成数据丢失,建议至少打个警告。
补充:未发现 env/profile/config 开关可绕过;实测 0.1.2rc1 依旧复现。
All reactions