用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/evanfang0054/cc-system-creator-scripts --skill langgraph-persistence命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
Mac 系统深度清理和优化工具。使用 Mole (mo 命令) 执行系统清理、磁盘分析、应用卸载、系统优化等任务。 触发场景(当用户提到以下任一内容时使用此 skill): - 清理 Mac、清理磁盘、释放空间、清理缓存、清理系统 - 卸载应用、删除应用、移除应用及其残留 - 磁盘分析、查看磁盘占用、大文件查找、空间分析 - 系统优化、系统维护、刷新系统、重建缓存 - 系统状态、系统监控、CPU/内存/磁盘监控 - 清理 node_modules、清理构建产物、清理项目依赖 - 清理安装包、删除 dmg/pkg 文件 - Mac 清理工具、类似 CleanMyMac 的功能 - "我的 Mac 太慢了"、"磁盘空间不足"、"电脑卡顿" - 即使没有明确说 "Mole",只要涉及上述场景就应使用
构建 CLI / command-line 工具时使用,支持两种模式。模式 A 人类 CLI(终端 UX、彩色、交互式提示、进度条、Shell 自动补全),关键词包括 commander / yargs / oclif / typer / click / cobra。模式 B agent-native CLI(JSON envelope / schema 自省 / dry-run 写入安全 / 契约驱动),关键词包括 agent-native CLI、JSON envelope、friction signal。混合场景默认走 B(agent 约束更严格)。只要用户提到 CLI、command-line、命令行工具、agent-native、envelope、schema、friction signal,或要给 agent 提供可调用的 CLI 工具,就应主动使用此 skill。
快速搭建和配置 pnpm monorepo 项目结构,包含 TypeScript、tsup 构建、私有 npm registry 配置。当用户需要"创建 monorepo"、"初始化 monorepo 项目"、"配置 pnpm workspace"、"设置 monorepo 构建"、"monorepo setup"时使用。特别适合需要统一管理多个包、配置构建工具、处理 TypeScript 路径问题的场景。即使用户只是说"帮我搭建项目结构"或"配置构建",如果涉及多包管理也应该使用此 skill。
基于 SOC 职业分类
| name | langgraph-persistence |
| description | 在 LangGraph 中实现持久化和检查点:保存状态、恢复执行、线程 ID 和检查点器库 |
| language | js |
LangGraph 的持久化层通过在每个超级步检查点图状态来实现持久执行。这解锁了人机交互、内存、时间旅行和容错能力。
核心组件:
| 检查点器 | 使用场景 | 持久化 | 生产就绪 |
|---|---|---|---|
MemorySaver | 测试、开发 | 仅内存 | ❌ 否 |
SqliteSaver | 本地开发 | SQLite 文件 | ⚠️ 单用户 |
PostgresSaver | 生产环境 | PostgreSQL | ✅ 是 |
import { MemorySaver, StateGraph, StateSchema, START, END } from "@langchain/langgraph";
import { z } from "zod";
const State = new StateSchema({
messages: z.array(z.string()),
});
const addMessage = async (state: typeof State.State) => {
return { messages: [...state.messages, "Bot response"] };
};
// 创建检查点器
const checkpointer = new MemorySaver();
// 使用检查点器编译
const graph = new StateGraph(State)
.addNode("respond", addMessage)
.addEdge(START, "respond")
.addEdge("respond", END)
.compile({ checkpointer }); // 启用持久化
// 第一次使用 thread_id 调用
const config = { configurable: { thread_id: "conversation-1" } };
const result1 = await graph.invoke({ messages: ["Hello"] }, config);
console.log(result1.messages.length); // 2
// 第二次调用 - 状态已持久化
const result2 = await graph.invoke({ messages: ["How are you?"] }, config);
console.log(result2.messages.length); // 4 (之前的 + 新的)
import { SqliteSaver } from "@langchain/langgraph-checkpoint-sqlite";
// 创建 SQLite 检查点器
const checkpointer = SqliteSaver.fromConnString("checkpoints.db");
const graph = new StateGraph(State)
.addNode("process", processNode)
.addEdge(START, "process")
.addEdge("process", END)
.compile({ checkpointer });
// 使用 thread_id
const config = { configurable: { thread_id: "user-123" } };
const result = await graph.invoke({ data: "test" }, config);
import { PostgresSaver } from "@langchain/langgraph-checkpoint-postgres";
// 创建 Postgres 检查点器
const checkpointer = await PostgresSaver.fromConnString(
"postgresql://user:pass@localhost/db"
);
const graph = new StateGraph(State)
.addNode("process", processNode)
.addEdge(START, "process")
.addEdge("process", END)
.compile({ checkpointer });
const config = { configurable: { thread_id: "thread-1" } };
const result = await graph.invoke({ data: "test" }, config);
// 获取当前状态
const config = { configurable: { thread_id: "conversation-1" } };
const currentState = await graph.getState(config);
console.log(currentState.values); // 当前状态
console.log(currentState.next); // 下一个要执行的节点
// 获取状态历史
const history = await graph.getStateHistory(config);
for await (const state of history) {
console.log("Step:", state.values);
}
import { MemorySaver, StateGraph, START, END } from "@langchain/langgraph";
const checkpointer = new MemorySaver();
const step1 = async (state) => ({ data: "step1" });
const step2 = async (state) => ({ data: state.data + "_step2" });
const graph = new StateGraph(State)
.addNode("step1", step1)
.addNode("step2", step2)
.addEdge(START, "step1")
.addEdge("step1", "step2")
.addEdge("step2", END)
.compile({
checkpointer,
interruptBefore: ["step2"], // 在 step2 之前暂停
});
const config = { configurable: { thread_id: "1" } };
// 运行到断点
await graph.invoke({ : }, config);
graph.(, config);
// 在恢复之前修改状态
const config = { configurable: { thread_id: "1" } };
// 更新状态
await graph.updateState(config, { data: "manually_updated" });
// 使用更新后的状态恢复
await graph.invoke(null, config);
// 不同的线程维护独立的状态
const thread1Config = { configurable: { thread_id: "user-alice" } };
const thread2Config = { configurable: { thread_id: "user-bob" } };
// Alice 的对话
await graph.invoke({ messages: ["Hi from Alice"] }, thread1Config);
// Bob 的对话(独立状态)
await graph.invoke({ messages: ["Hi from Bob"] }, thread2Config);
// Alice 的状态与 Bob 的隔离
import { MemorySaver, StateGraph, START } from "@langchain/langgraph";
// 只有父图需要检查点器
const subgraphNode = async (state) => ({ data: "subgraph" });
const subgraph = new StateGraph(State)
.addNode("process", subgraphNode)
.addEdge(START, "process")
.compile(); // 不需要检查点器
// 带检查点器的父图
const checkpointer = new MemorySaver();
const parent = new StateGraph(State)
.addNode("subgraph", subgraph)
.addEdge(START, "subgraph")
.compile({ checkpointer }); // 传播到子图
✅ 选择检查点器实现 ✅ 指定线程 ID ✅ 在任何检查点检索状态 ✅ 在调用之间更新状态 ✅ 设置暂停断点 ✅ 访问状态历史 ✅ 从任何检查点恢复
❌ 检查点格式/模式(内部) ❌ 检查点时机(每个超级步) ❌ 线程 ID 结构(仅限任意字符串)
// ❌ 错误 - 没有 thread_id,状态未保存
await graph.invoke({ data: "test" }); // 执行后丢失!
// ✅ 正确 - 始终提供 thread_id
const config = { configurable: { thread_id: "session-1" } };
await graph.invoke({ data: "test" }, config);
// ❌ 错误 - 重启时数据丢失
const checkpointer = new MemorySaver(); // 仅内存!
// ✅ 正确 - 使用持久化存储
import { PostgresSaver } from "@langchain/langgraph-checkpoint-postgres";
const checkpointer = await PostgresSaver.fromConnString("postgresql://...");
// ❌ 错误 - 提供输入会重新开始
await graph.invoke({ new: "data" }, config); // 从头重新开始
// ✅ 正确 - 使用 null 恢复
await graph.invoke(null, config); // 从检查点恢复
// ❌ 错误 - 忘记 await
const result = graph.invoke({ data: "test" }, config);
console.log(result.values); // undefined!
// ✅ 正确
const result = await graph.invoke({ data: "test" }, config);
console.log(result.values); // 可以工作!
// ❌ 错误 - 检查点器在编译后
const graph = builder.compile();
graph.checkpointer = checkpointer; // 太晚了!
// ✅ 正确 - 在编译时传递
const graph = builder.compile({ checkpointer });