Replies: 2 comments
|
我按这个复现完成了一份可运行、可复核的 reference implementation:
确认并处理了两个相互独立的问题:
最终回归把模型在第二个全新运行时进程中看到的历史精确固定为: 本地验证:
限制说明:Windows 本地环境无法构建项目的 release-shaped 单文件运行时;新的 这是一份 reference implementation,尚未合入 upstream。如果维护者希望把 typed absence、server resume 和 Python dispose ladder 拆成更小的提交,我可以按首选边界调整。 |
0 replies
|
你的根因分析成立, master (c291e79) 上仍未修。逐点核实:
当前可用的绕过(今天就能用, 不需要等上游):
给上游的修复方向正是你帖子里那条: session/prompt 检测到已持久化日志时走 resume, 并保留 lease/损坏检测。 |
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.
Python SDK 当session ID 存在时无法resume对话:
结论:不是 Python SDK 不持久化,而是 SDK server 从不“恢复”已存在的会话
1. 架构上:Python SDK 本身不做任何持久化
DeepSeekHarness 是一个很薄的客户端——它只是用 subprocess 拉起一个 Node 运行时进程(deepseek_harness_runtime → @deepseek-ai/dsh-sdk-jsonrpc-server),通过 stdio JSON-RPC 发 session/prompt。真正写 JSONL 的是那个子进程里的 @deepseek-ai/dsh-session-persistence-jsonl 插件,根目录由 DSH_SESSION_ROOT 决定(python/sdk/src/deepseek_harness/api.py:64-65)。
2. 你脚本里的关键问题:with DeepSeekHarness(...) 在 while True 里
你的循环每转一圈就新建一个运行时子进程。于是第二次起,session_id="id-123" 面对的是一个全新的进程。
而 SDK server 的 createSession(packages/sdk/server/src/server.ts:218-231)对每个 sessionId 无条件走“新建会话”路径:
agents.create(packages/core/agent-loop/src/index.ts:589)调的是 ctx.sessions.prepare(id, { meta })——内存里从零新建一个空会话,不会去读磁盘。agent-loop 里其实有 resume()(index.ts:653,会通过 sessionPersistence.prepare(id) 把历史加载进来),但 SDK server 从来没调用它。
3. 于是发生“id 冲突”,后续全部不落盘
新进程里这个空会话被 announce 后,持久化协调器 onCreated(packages/session/session-persistence/src/coordinator.ts:1237)发现磁盘上已有 id-123 的日志,走 adoptLivePrefix:因为新会话的 seed 是空的,无法覆盖已持久化的前缀,直接抛:
这个错误被吸收进 write-behind 的初始化 promise(coordinator.ts:1181 的 .catch),所以对话还能正常跑、还能返回回答;但之后每个写入都会 await 这个已 reject 的 init 而失败 → JSONL 一个字都不更新,模型也看不到之前的上下文。进程退出时 flush 再抛一次,又被 disposeAndExit 里的 Promise.allSettled 和 Python 客户端 close() 的 except 吞掉,所以你根本看不到报错。
相关讨论:
#167
#712
All reactions