# LangGraph SQLite 断点恢复教程：退出进程后继续处理三份材料

## 本轮实际范围

已真实用两个独立 Python 进程运行 SQLite 检查点恢复，并核对三份材料无重复与错误线程空状态；没有调用模型。

## 起步

```bash
python3 verify.py
```

## 1. 固定框架和持久化版本

安装 requirements.txt，注意 SqliteSaver 来自独立 langgraph-checkpoint-sqlite 包。只在本目录创建 checkpoints.sqlite，不连接你已有业务数据库。

```bash
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
```

## 2. 第一进程处理一份资料

运行 prepare，图在 first 节点之后暂停。prepare.json 应只包含课程安排.md；检查点写到磁盘后 Python 进程实际退出。

```bash
.venv/bin/python run.py --phase prepare
```

## 3. 确认不是内存保存

在目录看到 SQLite 文件，并检查原进程已经结束。InMemorySaver 不支持这个跨进程示例，不能用它替代 SqliteSaver 截图。

## 4. 第二进程恢复同一线程

重新启动 Python，加载同一图、数据库与 course-materials-01，使用 invoke(None, config)。它从 second 继续，不重新处理 first。

```bash
.venv/bin/python run.py --phase resume
```

## 5. 核对三份结果顺序

resume.json 的 processed 必须依次为课程安排、器材清单、验收规则，长度和去重后都为 3。跨进程实际日志保存在 result.json。

```bash
.venv/bin/python verify.py
```

## 6. 检查错误线程负例

脚本同时查询 another-thread，必须得到空状态。换 thread_id 是新任务，不是恢复原检查点；错误线程不应偷偷复用旧结果。

## 7. 保存重跑与模型边界

无参数运行 run.py 会清除本目录练习 DB 并完整执行两个子进程；该命令只用于重做本例。所有材料处理是固定字符串，尚未调用摘要模型。

```bash
.venv/bin/python run.py
```

## 官方来源

https://docs.langchain.com/oss/python/langgraph/persistence

## 提醒

参考文档、卡片、JSON和图片都明确标注人工或离线范围；没有实际调用的模型不提供假成功结果。占位配置不是可用凭据。
