跳到主要内容

文档索引

在以下地址获取完整的文档索引:https://docs.langchain.org.cn/llms.txt

在进一步探索之前,请使用此文件发现所有可用页面。

LangSmith 与 LangGraph(Python 和 JS)无缝集成,无论您是使用 LangChain 模块还是其他 SDK,都能帮助您追踪 Agent。

使用 LangChain

如果您在 LangGraph 中使用 LangChain 模块,只需设置几个环境变量即可启用追踪。 本指南将介绍一个基础示例。如需了解配置的更多详细信息,请参阅使用 LangChain 进行追踪指南。

1. 安装

安装 LangGraph 库以及 Python 和 JS 的 OpenAI 集成(我们在下方的代码片段中使用 OpenAI 集成)。 有关可用包的完整列表,请参阅 LangChain Python 文档LangChain JS 文档
pip install langchain_openai langgraph

2. 配置环境

export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=<your-api-key>
# This example uses OpenAI, but you can use any LLM provider of choice
export OPENAI_API_KEY=<your-openai-api-key>
# For LangSmith API keys linked to multiple workspaces, set the LANGSMITH_WORKSPACE_ID environment variable to specify which workspace to use.
export LANGSMITH_WORKSPACE_ID=<your-workspace-id>
如果您在非无服务器(serverless)环境中使用 LangChain.js 和 LangSmith,我们建议明确设置以下变量以减少延迟:export LANGCHAIN_CALLBACKS_BACKGROUND=true如果您处于无服务器环境中,我们建议设置相反的值,以便在函数结束前完成追踪记录:export LANGCHAIN_CALLBACKS_BACKGROUND=false有关更多信息,请参阅此 LangChain.js 指南

3. 记录追踪 (Trace)

设置好环境后,您可以正常调用 LangChain 的可运行对象(Runnables)。LangSmith 将自动推断出正确的追踪配置。
from typing import Literal
from langchain.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from langgraph.prebuilt import ToolNode
from langgraph.graph import StateGraph, MessagesState

@tool
def search(query: str):
    """Call to surf the web."""
    if "sf" in query.lower() or "san francisco" in query.lower():
        return "It's 60 degrees and foggy."
    return "It's 90 degrees and sunny."

tools = [search]
tool_node = ToolNode(tools)

model = ChatOpenAI(model="gpt-5.4", temperature=0).bind_tools(tools)

def should_continue(state: MessagesState) -> Literal["tools", "__end__"]:
    messages = state['messages']
    last_message = messages[-1]
    if last_message.tool_calls:
        return "tools"
    return "__end__"

def call_model(state: MessagesState):
    messages = state['messages']
    # Invoking `model` will automatically infer the correct tracing context
    response = model.invoke(messages)
    return {"messages": [response]}

workflow = StateGraph(MessagesState)
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)
workflow.add_edge("__start__", "agent")
workflow.add_conditional_edges(
    "agent",
    should_continue,
)
workflow.add_edge("tools", 'agent')

app = workflow.compile()

final_state = app.invoke(
    {"messages": [HumanMessage(content="what is the weather in sf")]},
    config={"configurable": {"thread_id": 42}}
)

final_state["messages"][-1].content

查看追踪

详情视图 点击追踪记录,并切换到右上角的详情 (Details) 视图。您在 LangSmith 中的追踪记录应该看起来像这样 消息视图 LangSmith UI 中的消息 (Messages) 视图展示了用户与 Agent 之间简化的对话历史。此视图从顶层追踪中提取消息(包括用户的初始请求、工具调用和 Agent 的最终响应),并以类似聊天的格式呈现。

不使用 LangChain

如果您在 LangGraph 中使用其他 SDK 或自定义函数,则需要适当地封装或装饰它们(Python 中使用 @traceable 装饰器,JS 中使用 traceable 函数,或者对于 SDK 使用 wrap_openai 等)。如果这样做,LangSmith 会自动嵌套这些已封装方法的追踪记录。 以下是一个示例。您也可以参阅此页面以获取更多信息。

1. 安装

安装 LangGraph 库以及 Python 和 JS 的 OpenAI SDK(我们在下方的代码片段中使用 OpenAI 集成)。
pip install openai langsmith langgraph

2. 配置环境

export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=<your-api-key>
# This example uses OpenAI, but you can use any LLM provider of choice
export OPENAI_API_KEY=<your-openai-api-key>
如果您在非无服务器(serverless)环境中使用 LangChain.js 和 LangSmith,我们建议明确设置以下变量以减少延迟:export LANGCHAIN_CALLBACKS_BACKGROUND=true如果您处于无服务器环境中,我们建议设置相反的值,以便在函数结束前完成追踪记录:export LANGCHAIN_CALLBACKS_BACKGROUND=false有关更多信息,请参阅此 LangChain.js 指南

3. 记录追踪 (Trace)

设置好环境后,封装或装饰您想要追踪的自定义函数/SDK。随后,LangSmith 将推断出正确的追踪配置。
import json
import openai
import operator
from langsmith import traceable
from langsmith.wrappers import wrap_openai
from typing import Annotated, Literal, TypedDict
from langgraph.graph import StateGraph

class State(TypedDict):
    messages: Annotated[list, operator.add]

tool_schema = {
    "type": "function",
    "function": {
        "name": "search",
        "description": "Call to surf the web.",
        "parameters": {
            "type": "object",
            "properties": {"query": {"type": "string"}},
            "required": ["query"],
        },
    },
}

# Decorating the tool function will automatically trace it with the correct context
@traceable(run_type="tool", name="Search Tool")
def search(query: str):
    """Call to surf the web."""
    if "sf" in query.lower() or "san francisco" in query.lower():
        return "It's 60 degrees and foggy."
    return "It's 90 degrees and sunny."

tools = [search]

def call_tools(state):
    function_name_to_function = {"search": search}
    messages = state["messages"]
    tool_call = messages[-1]["tool_calls"][0]
    function_name = tool_call["function"]["name"]
    function_arguments = tool_call["function"]["arguments"]
    arguments = json.loads(function_arguments)
    function_response = function_name_to_function[function_name](**arguments)
    tool_message = {
        "tool_call_id": tool_call["id"],
        "role": "tool",
        "name": function_name,
        "content": function_response,
    }
    return {"messages": [tool_message]}

wrapped_client = wrap_openai(openai.Client())

def should_continue(state: State) -> Literal["tools", "__end__"]:
    messages = state["messages"]
    last_message = messages[-1]
    if last_message["tool_calls"]:
        return "tools"
    return "__end__"

def call_model(state: State):
    messages = state["messages"]
    # Calling the wrapped client will automatically infer the correct tracing context
    response = wrapped_client.chat.completions.create(
        messages=messages, model="gpt-5.4-mini", tools=[tool_schema]
    )
    raw_tool_calls = response.choices[0].message.tool_calls
    tool_calls = [tool_call.to_dict() for tool_call in raw_tool_calls] if raw_tool_calls else []
    response_message = {
        "role": "assistant",
        "content": response.choices[0].message.content,
        "tool_calls": tool_calls,
    }
    return {"messages": [response_message]}

workflow = StateGraph(State)
workflow.add_node("agent", call_model)
workflow.add_node("tools", call_tools)
workflow.add_edge("__start__", "agent")
workflow.add_conditional_edges(
    "agent",
    should_continue,
)
workflow.add_edge("tools", 'agent')

app = workflow.compile()

final_state = app.invoke(
    {"messages": [{"role": "user", "content": "what is the weather in sf"}]}
)

final_state["messages"][-1]["content"]

查看追踪

详情视图 点击追踪记录,并切换到右上角的详情 (Details) 视图。您在 LangSmith 中的追踪记录应该看起来像这样 消息视图 LangSmith UI 中的消息 (Messages) 视图展示了用户与 Agent 之间简化的对话历史。此视图从顶层追踪中提取消息(包括用户的初始请求、工具调用和 Agent 的最终响应),并以类似聊天的格式呈现。
© . This site is unofficial and not affiliated with LangChain, Inc.