基于 LangGraph 开发
LangGraph 是 LangChain 团队开发的图结构工作流框架,提供了更精细的流程控制能力。云开发同时支持 TypeScript 和 Python 版本的 LangGraph 适配器。
前置条件
TypeScript 版本
安装依赖
npm install @cloudbase/agent-adapter-langgraph @langchain/langgraph @langchain/openai
快速开始
import { LanggraphAgent, createAgentServer } from "@cloudbase/agent-adapter-langgraph";
import { StateGraph, Annotation, END } from "@langchain/langgraph";
import { ChatOpenAI } from "@langchain/openai";
// 定义状态
const StateAnnotation = Annotation.Root({
messages: Annotation<string[]>({
reducer: (x, y) => x.concat(y),
default: () => [],
}),
response: Annotation<string>(),
});
// 使用云开发内置的大模型端点
const model = new ChatOpenAI({
model: process.env.TCB_AI_MODEL || "deepseek-v4-flash",
apiKey: process.env.TCB_API_KEY,
configuration: {
baseURL: `https://${process.env.TCB_ENV_ID}.api.tcloudbasegateway.com/v1/ai/cloudbase`,
},
});
// 定义节点
async function chatNode(state: typeof StateAnnotation.State) {
const lastMessage = state.messages[state.messages.length - 1];
const response = await model.invoke(lastMessage);
return { response: response.content };
}
// 构建图
const graph = new StateGraph(StateAnnotation)
.addNode("chat", chatNode)
.addEdge("__start__", "chat")
.addEdge("chat", END);
// 编译图
const compiledGraph = graph.compile();
// 创建 Agent
const agent = new LanggraphAgent({
name: "ChatBot",
description: "基于 LangGraph 的对话助手",
graph: compiledGraph,
});
// 导出
module.exports = createAgentServer(agent);
带工具的 Agent
import { LanggraphAgent, createAgentServer, ClientStateAnnotation } from "@cloudbase/agent-adapter-langgraph";
import { StateGraph, Annotation, END } from "@langchain/langgraph";
import { ChatOpenAI } from "@langchain/openai";
import { ToolNode } from "@langchain/langgraph/prebuilt";
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// 定义工具
const weatherTool = tool(
async ({ city }) => {
return JSON.stringify({
city,
temperature: "25°C",
weather: "晴天",
});
},
{
name: "get_weather",
description: "获取指定城市的天气信息",
schema: z.object({
city: z.string().describe("城市名称"),
}),
}
);
const calculatorTool = tool(
async ({ expression }) => {
try {
// 注意:实际项目中应使用安全的表达式计算库
const result = eval(expression);
return String(result);
} catch {
return "计算错误";
}
},
{
name: "calculator",
description: "计算数学表达式",
schema: z.object({
expression: z.string().describe("数学表达式"),
}),
}
);
const tools = [weatherTool, calculatorTool];
// 定义状态
const StateAnnotation = Annotation.Root({
...ClientStateAnnotation.spec,
messages: Annotation<any[]>({
reducer: (x, y) => x.concat(y),
default: () => [],
}),
});
// 使用云开发内置的大模型端点
const model = new ChatOpenAI({
model: process.env.TCB_AI_MODEL || "deepseek-v4-flash",
apiKey: process.env.TCB_API_KEY,
configuration: {
baseURL: `https://${process.env.TCB_ENV_ID}.api.tcloudbasegateway.com/v1/ai/cloudbase`,
},
}).bindTools(tools);
// 定义节点
async function agentNode(state: typeof StateAnnotation.State) {
const response = await model.invoke(state.messages);
return { messages: [response] };
}
// 路由函数
function shouldContinue(state: typeof StateAnnotation.State) {
const lastMessage = state.messages[state.messages.length - 1];
if (lastMessage.tool_calls?.length > 0) {
return "tools";
}
return END;
}
// 构建图
const graph = new StateGraph(StateAnnotation)
.addNode("agent", agentNode)
.addNode("tools", new ToolNode(tools))
.addEdge("__start__", "agent")
.addConditionalEdges("agent", shouldContinue)
.addEdge("tools", "agent");
const compiledGraph = graph.compile();
// 创建 Agent
const agent = new LanggraphAgent({
name: "ToolAgent",
description: "带工具调用的智能助手",
graph: compiledGraph,
});
module.exports = createAgentServer(agent);
多步骤工作流
import { LanggraphAgent, createAgentServer } from "@cloudbase/agent-adapter-langgraph";
import { StateGraph, Annotation, END } from "@langchain/langgraph";
import { ChatOpenAI } from "@langchain/openai";
// 定 义状态
const StateAnnotation = Annotation.Root({
input: Annotation<string>(),
plan: Annotation<string[]>({
default: () => [],
}),
currentStep: Annotation<number>({
default: () => 0,
}),
results: Annotation<string[]>({
reducer: (x, y) => x.concat(y),
default: () => [],
}),
finalOutput: Annotation<string>(),
});
const model = new ChatOpenAI({
model: process.env.TCB_AI_MODEL || "deepseek-v4-flash",
apiKey: process.env.TCB_API_KEY,
configuration: {
baseURL: `https://${process.env.TCB_ENV_ID}.api.tcloudbasegateway.com/v1/ai/cloudbase`,
},
});
// 规划节点
async function planNode(state: typeof StateAnnotation.State) {
const response = await model.invoke(
`请将以下任务分解为具体步骤:${state.input}\n返回 JSON 数组格式的步骤列表。`
);
const plan = JSON.parse(response.content as string);
return { plan };
}
// 执行节点
async function executeNode(state: typeof StateAnnotation.State) {
const currentStep = state.plan[state.currentStep];
const response = await model.invoke(`请执行以下步骤:${currentStep}`);
return {
results: [response.content as string],
currentStep: state.currentStep + 1,
};
}
// 总结节点
async function summarizeNode(state: typeof StateAnnotation.State) {
const response = await model.invoke(
`请总结以下执行结果:\n${state.results.join("\n")}`
);
return { finalOutput: response.content as string };
}
// 路由函数
function shouldContinueExecution(state: typeof StateAnnotation.State) {
if (state.currentStep < state.plan.length) {
return "execute";
}
return "summarize";
}
// 构建图
const graph = new StateGraph(StateAnnotation)
.addNode("plan", planNode)
.addNode("execute", executeNode)
.addNode("summarize", summarizeNode)
.addEdge("__start__", "plan")
.addEdge("plan", "execute")
.addConditionalEdges("execute", shouldContinueExecution)
.addEdge("summarize", END);
const compiledGraph = graph.compile();
const agent = new LanggraphAgent({
name: "WorkflowAgent",
description: "多步骤工作流 Agent",
graph: compiledGraph,
});
module.exports = createAgentServer(agent);
Python 版本
安装依赖
pip install cloudbase-agent-langgraph cloudbase-agent-server langgraph langchain-openai