Skip to main content
应用程序必须配置一个配置文件才能部署到 LangSmith(或进行自托管)。本操作指南讨论了使用 package.json 指定项目依赖项来设置 JavaScript 应用程序以进行部署的基本步骤。 本教程基于此仓库,你可以通过它来了解更多关于如何设置应用程序以进行部署的信息。 最终的仓库结构将类似于:
my-app/
├── src # 所有项目代码位于此处
   ├── utils # 可选,用于图的工具函数
   ├── tools.ts # 图的工具
   ├── nodes.ts # 图的节点函数
   └── state.ts # 图的状态定义
   └── agent.ts # 构建图的代码
├── package.json # 包依赖项
├── .env # 环境变量
└── langgraph.json # LangGraph 的配置文件
LangSmith Deployment supports deploying a LangGraph graph. However, the implementation of a node of a graph can contain arbitrary code. This means any framework can be implemented within a node and deployed on LangSmith Deployment. This lets you implement your core application logic without using additional LangGraph OSS APIs while still using LangSmith for deployment, scaling, and observability. For more details, refer to Use any framework with LangSmith Deployment.
每个步骤后,都会提供一个示例文件目录,以演示代码如何组织。

指定依赖项

依赖项可以在 package.json 中指定。如果这些文件尚未创建,则可以在稍后的配置文件中指定依赖项。 示例 package.json 文件:
{
  "name": "langgraphjs-studio-starter",
  "packageManager": "yarn@1.22.22",
  "dependencies": {
    "@langchain/community": "^0.2.31",
    "@langchain/core": "^0.2.31",
    "@langchain/langgraph": "^0.2.0",
    "@langchain/openai": "^0.2.8"
  }
}
部署应用程序时,将使用你选择的包管理器安装依赖项,前提是它们符合以下列出的兼容版本范围:
"@langchain/core": "^0.3.42",
"@langchain/langgraph": "^0.2.57",
"@langchain/langgraph-checkpoint": "~0.0.16",
示例文件目录:
my-app/
└── package.json # 包依赖项

指定环境变量

环境变量可以选择性地在文件中指定(例如 .env)。请参阅环境变量参考以配置部署的其他变量。 示例 .env 文件:
MY_ENV_VAR_1=foo
MY_ENV_VAR_2=bar
OPENAI_API_KEY=key
TAVILY_API_KEY=key_2
示例文件目录:
my-app/
├── package.json
└── .env # 环境变量

定义图

实现你的图。图可以在单个文件或多个文件中定义。注意每个要包含在应用程序中的已编译图的变量名。这些变量名将在稍后创建配置文件时使用。 以下是示例 agent.ts
import type { AIMessage } from "@langchain/core/messages";
import { TavilySearchResults } from "@langchain/community/tools/tavily_search";
import { ChatOpenAI } from "@langchain/openai";

import { MessagesAnnotation, StateGraph } from "@langchain/langgraph";
import { ToolNode } from "@langchain/langgraph/prebuilt";

const tools = [new TavilySearchResults({ maxResults: 3 })];

// 定义调用模型的函数
async function callModel(state: typeof MessagesAnnotation.State) {
  /**
   * 调用驱动我们代理的 LLM。
   * 请随意自定义提示、模型和其他逻辑!
   */
  const model = new ChatOpenAI({
    model: "gpt-4.1",
  }).bindTools(tools);

  const response = await model.invoke([
    {
      role: "system",
      content: `你是一个乐于助人的助手。当前日期是 ${new Date().getTime()}。`,
    },
    ...state.messages,
  ]);

  // MessagesAnnotation 支持返回单个消息或消息数组
  return { messages: response };
}

// 定义决定是否继续的函数
function routeModelOutput(state: typeof MessagesAnnotation.State) {
  const messages = state.messages;
  const lastMessage: AIMessage = messages[messages.length - 1];
  // 如果 LLM 正在调用工具,则路由到工具节点。
  if ((lastMessage?.tool_calls?.length ?? 0) > 0) {
    return "tools";
  }
  // 否则结束图。
  return "__end__";
}

// 定义新图。
// 有关定义自定义图状态的更多信息,请参阅
// https://langchain-ai.github.io/langgraphjs/how-tos/define-state/#getting-started
const workflow = new StateGraph(MessagesAnnotation)
  // 定义我们将在其间循环的两个节点
  .addNode("callModel", callModel)
  .addNode("tools", new ToolNode(tools))
  // 将入口点设置为 `callModel`
  // 这意味着该节点是第一个被调用的节点
  .addEdge("__start__", "callModel")
  .addConditionalEdges(
    // 首先,我们定义边的源节点。我们使用 `callModel`。
    // 这意味着这些边是在 `callModel` 节点被调用后采取的。
    "callModel",
    // 接下来,我们传入将确定目标节点的函数,
    // 该函数将在源节点被调用后调用。
    routeModelOutput,
    // 条件边可以路由到的可能目的地列表。
    // 这是条件边在 Studio 中正确渲染图所必需的
    ["tools", "__end__"]
  )
  // 这意味着在 `tools` 被调用后,下一个调用 `callModel` 节点。
  .addEdge("tools", "callModel");

// 最后,我们编译它!
// 这将编译成一个你可以调用和部署的图。
export const graph = workflow.compile();
示例文件目录:
my-app/
├── src # 所有项目代码位于此处
   ├── utils # 可选,用于图的工具函数
   ├── tools.ts # 图的工具
   ├── nodes.ts # 图的节点函数
   └── state.ts # 图的状态定义
   └── agent.ts # 构建图的代码
├── package.json # 包依赖项
├── .env # 环境变量
└── langgraph.json # LangGraph 的配置文件

创建 API 配置

创建一个名为 langgraph.json配置文件。有关配置文件中 JSON 对象每个键的详细说明,请参阅配置文件参考 示例 langgraph.json 文件:
{
  "node_version": "20",
  "dockerfile_lines": [],
  "dependencies": ["."],
  "graphs": {
    "agent": "./src/agent.ts:graph"
  },
  "env": ".env"
}
注意,CompiledGraph 的变量名出现在顶级 graphs 键的每个子键值的末尾(即 :<变量名>)。
配置文件位置 配置文件必须放置在与包含已编译图及相关依赖项的 TypeScript 文件相同或更高级别的目录中。

下一步

设置好项目并将其放入 GitHub 仓库后,就可以部署你的应用程序了。