fix(ai写作): 继续(暂停后)从checkpoint续跑而非从头重跑意图

根因:resumeWriting 的 stream.submit(undefined) 没带 command。后端 worker
(runtime/runs/worker.py:283) 只有收到 command 才翻成 Command() 让 Pregel 从最近
checkpoint 恢复;不带 command 时按 graph_input 起新一轮=从图入口 intent_parser
重跑,于是"规划大纲/检索素材时暂停后继续又从识别意图开始"。

修复:继续时带空 command:{},走 Command 恢复路径(与4个干预卡续跑同机制),
Pregel 从 checkpoint 续跑当前未完成阶段(已完成阶段不丢),不再重跑 intent。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
董宏凯andClaude Opus 4.8 committed 2026-06-26 23:31:48 +08:00
1 parent 4f0c75e76e
commit 9f462beec5
1 file changed
+8 -1
@@ -528,8 +528,14 @@ export function AIWritingProvider({ children }: { children: ReactNode }) {
dispatch({ type: 'pause' });
}, []);
// 「继续」:清掉当前阶段流式缓冲后,从最近的 checkpoint 重新驱动 graph 续跑
// 「继续」:清掉当前阶段流式缓冲后,从最近的 checkpoint 恢复 graph 续跑
// (会重跑当前未完成的阶段,已完成阶段不丢)。同时用于断网后 run 已死的兜底恢复。
//
// **关键**:必须带一个 `command`(哪怕是空对象),后端 worker 才会把它翻成
// `langgraph.types.Command` 让 Pregel **从最近 checkpoint 恢复**(与 4 个干预卡续跑同机制);
// 不带 command 时 worker 按 graph_input **起新一轮**=从图入口 intent 重跑(就是之前
// "暂停后继续又从识别意图开始" 的根因,见 runtime/runs/worker.py 注释)。空 Command
// 没有 interrupt 可消费 → Pregel 直接续跑 checkpoint 里挂起的当前阶段节点。
const resumeWriting = useCallback(() => {
const stream = streamRef.current;
if (!stream) {
@@ -541,6 +547,7 @@ export function AIWritingProvider({ children }: { children: ReactNode }) {
void (async () => {
try {
await stream.submit(undefined, {
command: {},
streamMode: [...WRITING_STREAM_MODE],
...RESILIENT_RUN_OPTS,
...(resumeModelName ? { config: { configurable: { model_name: resumeModelName } } } : {}),