跳转到主要内容
单 Agent 系统涉及一个自主实体,它感知其环境并采取行动以实现特定目标。它独立做出决策,无需与其他 Agent 协调或交互。

安装

npm i @ag-kit/agents @langchain/core @langchain/langgraph @langchain/openai zod

快速开始

创建您的第一个 Agent:
import { ChatOpenAI } from "@langchain/openai";
import { SystemMessage } from "@langchain/core/messages";
import {
  StateGraph,
  START,
  END,
  MessagesAnnotation,
} from "@langchain/langgraph";

import { HumanMessage } from "@langchain/core/messages";

async function chatNode(state: typeof MessagesAnnotation.State) {
  const model = new ChatOpenAI({
    model: process.env.OPENAI_MODEL || "gpt-4o-mini",
    apiKey: process.env.OPENAI_API_KEY,
    configuration: {
      baseURL: process.env.OPENAI_BASE_URL,
    },
  });

  const systemMessage = new SystemMessage({
    content: "你是一个有用的助手。",
  });

  const response = await model.invoke([systemMessage, ...state.messages]);

  return { messages: [response] };
}

const workflow = new StateGraph(MessagesAnnotation)
  .addNode("chat_node", chatNode)
  .addEdge(START, "chat_node")
  .addEdge("chat_node", END);

const compiledGraph = workflow.compile({});

const { messages } = await compiledGraph.invoke({
  messages: [new HumanMessage({ content: "你好,你好吗?" })],
});

messages.forEach((message) =>
  console.log(`[${message.type}]: ${message.content}`)
);

添加工具

工具扩展了 Agent 超越文本生成的能力。
import { ChatOpenAI } from "@langchain/openai";
import { AIMessage, SystemMessage } from "@langchain/core/messages";
import {
  StateGraph,
  START,
  END,
  MessagesAnnotation,
} from "@langchain/langgraph";
import { ToolNode } from "@langchain/langgraph/prebuilt";
import { tool } from "langchain";
import { HumanMessage } from "@langchain/core/messages";
import { z } from "zod";

const getWeather = tool(
  async ({ location }) => ({
    location,
    condition: "晴朗",
    temperatureC: 25,
  }),
  {
    name: "getWeather",
    description: "获取某个位置的模拟天气",
    schema: z.object({
      location: z.string().optional(),
    }),
  }
);

const tools = [getWeather];

async function chatNode(state: typeof MessagesAnnotation.State) {
  const model = new ChatOpenAI({
    model: process.env.OPENAI_MODEL || "gpt-4o-mini",
    apiKey: process.env.OPENAI_API_KEY,
    configuration: {
      baseURL: process.env.OPENAI_BASE_URL,
    },
  }).bindTools(tools);

  const systemMessage = new SystemMessage({
    content: "你是一个有用的助手。",
  });

  const response = await model.invoke([systemMessage, ...state.messages]);

  return { messages: [response] };
}

function shouldContinue(state: typeof MessagesAnnotation.State) {
  const lastMessage = state.messages.at(-1);

  if (AIMessage.isInstance(lastMessage)) {
    const toolCalls = lastMessage.tool_calls;
    const shouldCallTool = toolCalls?.some((c) =>
      tools.some((t) => t.name === c?.name)
    );

    return shouldCallTool ? "tools" : END;
  }

  return END;
}

const workflow = new StateGraph(MessagesAnnotation)
  .addNode("chat_node", chatNode)
  .addNode("tools", new ToolNode(tools))
  .addEdge(START, "chat_node")
  .addConditionalEdges("chat_node", shouldContinue)
  .addEdge("tools", "chat_node");

const compiledGraph = workflow.compile({});

const { messages } = await compiledGraph.invoke({
  messages: [
    new HumanMessage({
      content: "请帮我获取伦敦的天气",
    }),
  ],
});

messages.forEach((message) =>
  console.log(`[${message.type}]: ${message.content}`)
);

下一步