بنقرة واحدة
langgraph-overview
理解 LangGraph:用于构建有状态、长期运行 Agent 的低级编排框架,具有持久执行、流式传输和人机交互能力
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
理解 LangGraph:用于构建有状态、长期运行 Agent 的低级编排框架,具有持久执行、流式传输和人机交互能力
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
| name | langgraph-overview |
| description | 理解 LangGraph:用于构建有状态、长期运行 Agent 的低级编排框架,具有持久执行、流式传输和人机交互能力 |
| language | js |
LangGraph 是一个低级编排框架和运行时,用于构建、管理和部署长期运行的、有状态的 Agent。它受到 Klarna、Replit 和 Elastic 等公司的信任,用于生产 Agent 工作负载。
关键特性:
LangGraph 非常适合当您需要:
当您满足以下条件时考虑替代方案:
| 需求 | 使用 LangGraph | 使用 LangChain | 使用 Deep Agents |
|---|---|---|---|
| 快速原型开发 | ❌ | ✅ | ✅ |
| 自定义编排逻辑 | ✅ | ❌ | ⚠️ (有限) |
| 持久执行 | ✅ | ⚠️ (通过 LangGraph) | ✅ |
| 人机交互 | ✅ | ⚠️ (通过 LangGraph) | ✅ |
| 状态持久化 | ✅ | ❌ | ✅ |
| 生产部署 | ✅ | ⚠️ (与 LangGraph 一起使用) | ✅ |
| 学习曲线 | 高 | 低 | 中 |
LangGraph 将 Agent 工作流建模为图,具有三个核心组件:
| 能力 | 描述 |
|---|---|
| 持久执行 | Agent 在故障中持久存在并从检查点恢复 |
| 流式传输 | 执行期间的实时更新(状态、令牌、自定义数据) |
| 人机交互 | 暂停执行以供人工审查和干预 |
| 持久化 | 线程级别和跨线程的状态管理 |
| 时间旅行 | 从执行历史中的任何检查点恢复 |
受 Google 的 Pregel 系统启发:
import { ChatAnthropic } from "@langchain/anthropic";
import { tool } from "@langchain/core/tools";
import { SystemMessage, HumanMessage, AIMessage, ToolMessage } from "@langchain/core/messages";
import { StateGraph, StateSchema, MessagesValue, ReducedValue, START, END } from "@langchain/langgraph";
import { z } from "zod";
// 1. 定义工具
const multiply = tool(({ a, b }) => a * b, {
name: "multiply",
description: "Multiply two numbers",
schema: z.object({
a: z.number().describe("First number"),
b: z.number().describe("Second number"),
}),
});
const add = tool(({ a, b }) => a + b, {
name: "add",
description: "Add two numbers",
schema: z.object({
a: z.number().describe("First number"),
b: z.number().describe("Second number"),
}),
});
// 2. 使用工具初始化模型
const model = new ChatAnthropic({
model: "claude-sonnet-4-5-20250929",
temperature: 0,
});
const toolsByName = { [add.name]: add, [multiply.name]: multiply };
const tools = Object.values(toolsByName);
const modelWithTools = model.bindTools(tools);
// 3. 定义状态
const MessagesState = new StateSchema({
messages: MessagesValue,
llmCalls: new ReducedValue(
z.number().default(0),
{ reducer: (x, y) => x + y }
),
});
// 4. 定义节点
const llmCall = async (state) => {
const response = await modelWithTools.invoke([
new SystemMessage("You are a helpful assistant."),
...state.messages,
]);
return {
messages: [response],
llmCalls: 1,
};
};
const toolNode = async (state) => {
const lastMessage = state.messages.at(-1);
if (lastMessage == null || !AIMessage.isInstance(lastMessage)) {
return { messages: [] };
}
const result = [];
for (const toolCall of lastMessage.tool_calls ?? []) {
const tool = toolsByName[toolCall.name];
const observation = await tool.invoke(toolCall);
result.push(observation);
}
return { messages: result };
};
// 5. 定义路由逻辑
const shouldContinue = (state) => {
const lastMessage = state.messages.at(-1);
if (!lastMessage || !AIMessage.isInstance(lastMessage)) {
return END;
}
if (lastMessage.tool_calls?.length) {
return "toolNode";
}
return END;
};
// 6. 构建和编译图
const agent = new StateGraph(MessagesState)
.addNode("llmCall", llmCall)
.addNode("toolNode", toolNode)
.addEdge(START, "llmCall")
.addConditionalEdges("llmCall", shouldContinue, ["toolNode", END])
.addEdge("toolNode", "llmCall")
.compile();
// 7. 调用 agent
const result = await agent.invoke({
messages: [new HumanMessage("What is 3 * 4?")],
});
for (const message of result.messages) {
console.log(`[${message._getType()}]: ${message.content}`);
}
import { MemorySaver } from "@langchain/langgraph";
// 创建检查点器用于状态持久化
const checkpointer = new MemorySaver();
// 使用检查点器编译
const agent = new StateGraph(MessagesState)
.addNode("llmCall", llmCall)
.addNode("toolNode", toolNode)
.addEdge(START, "llmCall")
.addConditionalEdges("llmCall", shouldContinue, ["toolNode", END])
.addEdge("toolNode", "llmCall")
.compile({ checkpointer }); // 添加检查点器
// 第一轮对话
const config = { configurable: { thread_id: "1" } };
await agent.invoke(
{ messages: [new HumanMessage("Hi, I'm Alice")] },
config
);
// 第二轮 - agent 记住上下文
await agent.invoke(
{ messages: [new HumanMessage("What's my name?")] },
config
);
// 流式传输状态更新
for await (const chunk of await agent.stream(
{ messages: [new HumanMessage("Calculate 5 + 3")] },
{ streamMode: "updates" }
)) {
console.log(chunk);
}
// 流式传输 LLM 令牌
for await (const chunk of await agent.stream(
{ messages: [new HumanMessage("Hello!")] },
{ streamMode: "messages" }
)) {
console.log(chunk);
}
// 多种流式模式
for await (const [mode, chunk] of await agent.stream(
{ messages: [new HumanMessage("Help me")] },
{ streamMode: ["updates", "messages"] }
)) {
console.log(`${mode}:`, chunk);
}
✅ 节点逻辑:将任何异步函数定义为节点 ✅ 状态模式:自定义状态结构和 reducer ✅ 控制流:添加条件边、循环、分支 ✅ 持久化层:选择检查点器(MemorySaver、SQLite、Postgres) ✅ 流式模式:配置要流式传输的数据 ✅ 中断:在任何点添加人机交互 ✅ 递归限制:控制最大执行步数 ✅ 工具和模型:使用任何 LLM 或工具提供程序
❌ 核心图执行模型:基于 Pregel 的运行时是固定的 ❌ 超级步行为:无法更改节点的批处理方式 ❌ 消息传递协议:内部通信是预定义的 ❌ 检查点模式:内部检查点格式是固定的 ❌ 图编译:无法修改编译逻辑
// ❌ 错误 - 使用检查点器但没有 thread_id
await agent.invoke({ messages: [...] }); // 状态未持久化!
// ✅ 正确 - 始终提供 thread_id
await agent.invoke(
{ messages: [...] },
{ configurable: { thread_id: "user-123" } }
);
// ❌ 错误 - 消息将被覆盖,而不是追加
const BadState = new StateSchema({
messages: z.array(BaseMessageSchema), // 没有 reducer!
});
// ✅ 正确 - 使用 MessagesValue 进行自动消息处理
import { MessagesValue } from "@langchain/langgraph";
const GoodState = new StateSchema({
messages: MessagesValue, // 正确处理消息更新
});
// ❌ 错误 - StateGraph 不可执行
const builder = new StateGraph(State).addNode("node", func);
await builder.invoke(...); // 错误!
// ✅ 正确 - 必须先编译
const graph = builder.compile();
await graph.invoke(...);
// ❌ 错误 - 没有退出条件的循环
builder
.addEdge("nodeA", "nodeB")
.addEdge("nodeB", "nodeA"); // 无限循环!
// ✅ 正确 - 添加到 END 的条件边
const shouldContinue = (state) => {
if (state.count > 10) {
return END;
}
return "nodeB";
};
builder.addConditionalEdges("nodeA", shouldContinue);
// ❌ 错误 - 忘记 await
const result = agent.invoke(...); // 返回 Promise!
console.log(result.messages); // undefined
// ✅ 正确 - 始终 await
const result = await agent.invoke(...);
console.log(result.messages); // 可以工作!
# npm
npm install @langchain/langgraph
# yarn
yarn add @langchain/langgraph
# pnpm
pnpm add @langchain/langgraph
# 与 LangChain 一起使用(可选但常见)
npm install @langchain/core
# 生产持久化
npm install @langchain/langgraph-checkpoint-postgres
Mac 系统深度清理和优化工具。使用 Mole (mo 命令) 执行系统清理、磁盘分析、应用卸载、系统优化等任务。 触发场景(当用户提到以下任一内容时使用此 skill): - 清理 Mac、清理磁盘、释放空间、清理缓存、清理系统 - 卸载应用、删除应用、移除应用及其残留 - 磁盘分析、查看磁盘占用、大文件查找、空间分析 - 系统优化、系统维护、刷新系统、重建缓存 - 系统状态、系统监控、CPU/内存/磁盘监控 - 清理 node_modules、清理构建产物、清理项目依赖 - 清理安装包、删除 dmg/pkg 文件 - Mac 清理工具、类似 CleanMyMac 的功能 - "我的 Mac 太慢了"、"磁盘空间不足"、"电脑卡顿" - 即使没有明确说 "Mole",只要涉及上述场景就应使用
快速搭建和配置 pnpm monorepo 项目结构,包含 TypeScript、tsup 构建、私有 npm registry 配置。当用户需要"创建 monorepo"、"初始化 monorepo 项目"、"配置 pnpm workspace"、"设置 monorepo 构建"、"monorepo setup"时使用。特别适合需要统一管理多个包、配置构建工具、处理 TypeScript 路径问题的场景。即使用户只是说"帮我搭建项目结构"或"配置构建",如果涉及多包管理也应该使用此 skill。
智能拆分暂存区的代码变更为多个符合 Conventional Commits 规范的逻辑提交。当用户需要将大量变更按逻辑关系分组提交时使用,比如"拆分这些提交"、"把暂存区的变更分成多个 commit"、"按功能分别提交"、"split commits"等场景。特别适合处理包含多个模块、多种类型文件(配置、代码、测试、文档)的复杂变更集。
OKR 优化与质量评估专家。当用户需要:(1) 评估现有 OKR 的质量,(2) 优化模糊或不可量化的关键结果,(3) 检查 OKR 是否符合核心原则(聚焦、可量化、有挑战),(4) 将任务型 KR 转化为结果型 KR,(5) 提供具体的改进建议时使用。触发词包括"帮我优化 OKR"、"检查这个 OKR"、"这个 KR 写得好吗"、"如何量化这个目标"。
基于 git commits 自动生成 CHANGELOG.md 变更日志。支持语义化版本、分类整理、多格式输出。触发场景包括"生成变更日志"、"更新 CHANGELOG"、"版本记录"。
GitHub PR 代码审查技能。检查代码质量、安全性、性能和最佳实践,生成结构化审查报告。触发场景包括"审查 PR"、"代码检查"、"review pull request"。