LangGraph TS 适配器
让 LangGraph 工作流支持 AG-UI 协议。
什么是 AG-UI?
AG-UI 是一个开放、轻量级、基于事件的协议,用于标准化 AI Agent 与用户界面的交互。它让 Agent 可以:
- 实时流式对话
- 双向状态同步
- 前端工具集成(Client Tools)
- 人机协作(Human-in-the-loop)
这个包解决什么问题?
- 让 LangGraph 工作流支持 AG-UI 协议:将编译后的 LangGraph StateGraph 适配为 AG-UI 兼容的 Agent
- 客户端状态管理:提供
ClientStateAnnotation和ClientState,让工作流可以接收前端传递的工具和消息
核心概念
| 导出 | 说明 |
|---|---|
LanggraphAgent | 将编译后的 LangGraph 工作流包装为 AG-UI 兼容的 Agent |
ClientStateAnnotation | 预定义的 LangGraph 状态注解,包含 messages(消息历史)和 client.tools(客户端工具) |
ClientState | ClientStateAnnotation 对应的 TypeScript 类型,用于节点函数的参数类型 |
配合使用
| 包名 | 作用 |
|---|---|
@cloudbase/agent-server | 将 Agent 部署为 AG-UI 兼容的 HTTP 服务 |
@langchain/langgraph | LangGraph 工作流框架 |
@langchain/openai | OpenAI 兼容模型接入 |
架构图
安装
pnpm add @cloudbase/agent-adapter-langgraph @cloudbase/agent-server @langchain/langgraph @langchain/openai
快速开始
1. 创建 LangGraph 工作流
// agent.ts
import { ChatOpenAI } from "@langchain/openai";
import { SystemMessage } from "@langchain/core/messages";
import { RunnableConfig } from "@langchain/core/runnables";
import { Command, StateGraph, END, START, MemorySaver } from "@langchain/langgraph";
import {
ClientStateAnnotation,
LanggraphAgent,
ClientState,
} from "@cloudbase/agent-adapter-langgraph";
// 定义聊天节点
async function chatNode(state: ClientState, config?: RunnableConfig) {
const model = new ChatOpenAI({
model: process.env.OPENAI_MODEL!,
apiKey: process.env.OPENAI_API_KEY,
configuration: {
baseURL: process.env.OPENAI_BASE_URL,
},
});
// 绑定客户端工具
const modelWithTools = model.bindTools([...(state.client?.tools || [])], {
parallel_tool_calls: false,
});
const systemMessage = new SystemMessage({
content: "你是一位乐于助人的 AI 助手。",
});
const response = await modelWithTools.invoke(
[systemMessage, ...state.messages],
config
);
return new Command({
goto: END,
update: { messages: [response] },
});
}
// 构建工作流
const workflow = new StateGraph(ClientStateAnnotation)
.addNode("chat_node", chatNode)
.addEdge(START, "chat_node")
.addEdge("chat_node", END);
const compiledGraph = workflow.compile({
checkpointer: new MemorySaver(),
});
// 导出 createAgent 函数
export function createAgent() {
return {
agent: new LanggraphAgent({ compiledWorkflow: compiledGraph }),
};
}
2. 部署为 HTTP 服务
// index.ts
import { createExpressRoutes } from "@cloudbase/agent-server";
import { createAgent } from "./agent.js";
import express from "express";
const app = express();
createExpressRoutes({
createAgent,
express: app,
});
app.listen(9000, () => console.log("Listening on 9000!"));
3. 配置环境变量
创建 .env 文件:
OPENAI_API_KEY=your-deepseek-api-key
OPENAI_BASE_URL=https://api.deepseek.com/v1
OPENAI_MODEL=deepseek-chat
4. 启动服务
npx tsx src/index.ts
完整的项目配置(tsconfig.json、package.json 等)请参考 示例项目。
API 参考
LanggraphAgent
将编译后的 LangGraph 工作流包装为 AG-UI 兼容的 Agent。
import { LanggraphAgent } from "@cloudbase/agent-adapter-langgraph";
const agent = new LanggraphAgent({
compiledWorkflow: compiledGraph, // StateGraph.compile() 的返回值
});
构造参数:
| 参数 | 类型 | 说明 |
|---|---|---|
compiledWorkflow | CompiledStateGraph | 编译后的 LangGraph 工作流 |
ClientStateAnnotation
预定义的状态注解,包含客户端工具和消息历史。用于构建支持 AG-UI 协议的 LangGraph 工作流。
import { ClientStateAnnotation, ClientState } from "@cloudbase/agent-adapter-langgraph";
const workflow = new StateGraph(ClientStateAnnotation)
.addNode("chat_node", async (state: ClientState) => {
// state.messages - 消息历史
// state.client.tools - 客户端传递的工具
});
ClientState
ClientStateAnnotation 对应的 TypeScript 类型。用于定义节点函数的参数类型,让你可以在节点中访问消息历史和客户端工具。
async function chatNode(state: ClientState, config?: RunnableConfig) {
// 访问消息历史
const messages = state.messages;
// 访问客户端传递的工具
const tools = state.client?.tools || [];
// ...
}
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
messages | BaseMessage[] | 消息历史(来自 LangGraph 的 MessagesAnnotation) |
client.tools | Tool[] | 前端客户端传递的工具列表 |