Skip to content

如何在本地测试 LangGraph 应用程序

本指南假设你已正确设置了一个 LangGraph 应用程序,拥有一个合适的配置文件和对应的已编译图,并且你有一个有效的 LangChain API 密钥。

在本地进行测试可确保 Python 依赖项没有错误或冲突,并确认配置文件已正确指定。

安装设置

安装 LangGraph CLI 包:

pip install -U "langgraph-cli[inmem]"

确保你有一个 API 密钥,你可以从 LangSmith 用户界面(设置 > API 密钥)创建该密钥。这是验证你是否有权访问 LangGraph 云所必需的。将密钥保存到安全的位置后,将以下行添加到你的 .env 文件中:

LANGSMITH_API_KEY = *********

启动 API 服务器

安装 CLI 后,你可以运行以下命令启动 API 服务器以进行本地测试:

langgraph dev

这将在本地启动 LangGraph API 服务器。如果运行成功,你应该会看到类似如下的内容:

就绪!

内存模式

langgraph dev 命令以内存模式启动 LangGraph 服务器。此模式适用于开发和测试目的。对于生产环境,你应该部署可访问持久存储后端的 LangGraph 服务器。

如果你想使用持久存储后端测试你的应用程序,可以使用 langgraph up 命令代替 langgraph dev。使用此命令需要在你的机器上安装 docker

与服务器交互

现在我们可以使用 LangGraph SDK 与 API 服务器进行交互。首先,我们需要启动客户端,选择我们的助手(在本例中是一个名为 “agent” 的图,确保选择你想要测试的正确助手)。

你可以通过传递认证信息或设置环境变量来进行初始化。

使用认证信息初始化

from langgraph_sdk import get_client

# 仅当你在调用 langgraph dev 时更改了默认端口时,才需要将 url 参数传递给 get_client()
client = get_client(url=<DEPLOYMENT_URL>,api_key=<LANGSMITH_API_KEY>)
# 使用以 "agent" 名称部署的图
assistant_id = "agent"
thread = await client.threads.create()
import { Client } from "@langchain/langgraph-sdk";

// 仅当你在调用 langgraph dev 时更改了默认端口时,才需要设置 apiUrl
const client = new Client({ apiUrl: <DEPLOYMENT_URL>, apiKey: <LANGSMITH_API_KEY> });
// 使用以 "agent" 名称部署的图
const assistantId = "agent";
const thread = await client.threads.create();
curl --request POST \
  --url <DEPLOYMENT_URL>/threads \
  --header 'Content-Type: application/json'
  --header 'x-api-key: <LANGSMITH_API_KEY>'

使用环境变量初始化

如果你在环境中设置了 LANGSMITH_API_KEY,则无需显式地将认证信息传递给客户端

from langgraph_sdk import get_client

# 仅当你在调用 langgraph dev 时更改了默认端口时,才需要将 url 参数传递给 get_client()
client = get_client()
# 使用以 "agent" 名称部署的图
assistant_id = "agent"
thread = await client.threads.create()
import { Client } from "@langchain/langgraph-sdk";

// 仅当你在调用 langgraph dev 时更改了默认端口时,才需要设置 apiUrl
const client = new Client();
// 使用以 "agent" 名称部署的图
const assistantId = "agent";
const thread = await client.threads.create();
curl --request POST \
  --url <DEPLOYMENT_URL>/threads \
  --header 'Content-Type: application/json'

现在我们可以调用我们的图以确保它能正常工作。请确保更改输入以匹配你的图的正确架构。

input = {"messages": [{"role": "user", "content": "what's the weather in sf"}]}
async for chunk in client.runs.stream(
    thread["thread_id"],
    assistant_id,
    input=input,
    stream_mode="updates",
):
    print(f"Receiving new event of type: {chunk.event}...")
    print(chunk.data)
    print("\n\n")
const input = { "messages": [{ "role": "user", "content": "what's the weather in sf"}] }

const streamResponse = client.runs.stream(
  thread["thread_id"],
  assistantId,
  {
    input: input,
    streamMode: "updates",
  }
);
for await (const chunk of streamResponse) {
  console.log(`Receiving new event of type: ${chunk.event}...`);
  console.log(chunk.data);
  console.log("\n\n");
}
curl --request POST \
 --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/stream \
 --header 'Content-Type: application/json' \
 --data "{
   \"assistant_id\": \"agent\",
   \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"what's the weather in sf\"}]},
   \"stream_mode\": [
     \"events\"
   ]
 }" | \
 sed 's/\r$//' | \
 awk '
 /^event:/ {
     if (data_content != "") {
         print data_content "\n"
     }
     sub(/^event: /, "Receiving event of type: ", $0)
     printf "%s...\n", $0
     data_content = ""
 }
 /^data:/ {
     sub(/^data: /, "", $0)
     data_content = $0
 }
 END {
     if (data_content != "") {
         print data_content "\n"
     }
 }
 ' 

如果你的图正常工作,你应该会在控制台中看到图的输出。当然,你可能需要更多的方法来测试你的图,有关可以使用 SDK 发送的完整命令列表,请参阅 PythonJS/TS 参考文档。

Comments