跳过内容

LangGraph Studio

LangGraph Studio 提供了一种开发 LLM 应用的新方式,它提供了一个专门的代理 IDE,支持复杂代理应用的可视化、交互和调试。

通过可视化图和编辑状态的能力,您可以更好地理解代理工作流并更快地迭代。LangGraph Studio 与 LangSmith 集成,让您能够与团队成员协作调试故障模式。

功能

LangGraph Studio 的主要功能包括:

类型

桌面应用

LangGraph Studio 作为桌面应用提供给 MacOS 用户。

在 Beta 阶段,LangGraph Studio 对所有LangSmith用户免费开放,无论其订阅计划级别如何。

云端工作室

如果您已在 LangGraph 平台(云端)上部署了您的 LangGraph 应用,您可以将其作为平台的一部分访问工作室。

Studio 常见问题

我的项目为什么启动失败?

您的项目可能因多种原因启动失败,以下是一些最常见的原因。

Docker 问题(仅限桌面版)

LangGraph Studio(桌面版)要求 Docker Desktop 版本为 4.24 或更高。请确保您已安装满足该要求的 Docker 版本,并确保在使用 LangGraph Studio 之前 Docker Desktop 应用已启动并运行。此外,请确保您的 docker-compose 已更新到 2.22.0 或更高版本。

配置或环境问题

您的项目启动失败的另一个原因是您的配置文件定义不正确,或者您缺少必需的环境变量。

中断功能如何运作?

当您选择“中断 (Interrupts)”下拉菜单并选择一个节点进行中断时,图将在该节点运行之前和之后暂停执行(除非该节点直接跳到“结束 (END)”)。这意味着您将能够在节点运行之前和之后编辑状态。这旨在让开发人员对节点的行为有更精细的控制,并更容易观察节点的行为方式。如果该节点是图中的最后一个节点,您将无法在该节点运行后编辑状态。

如何重新加载应用?(仅限桌面版)

如果您想重新加载应用,请不要像通常那样使用 Command+R。相反,请关闭并重新打开应用以进行完全刷新。

自动重建如何运作?(仅限桌面版)

LangGraph Studio 的主要功能之一是当您更改源代码时,它会自动重建您的镜像。这使得开发和测试周期非常快,从而可以轻松地迭代您的图。LangGraph 有两种不同的方式重建您的镜像:通过编辑镜像或完全重建它。

源代碼更改后的重建

如果您只修改了源代码(没有配置或依赖项更改!),则镜像不需要完全重建,LangGraph Studio 将只更新相关部分。左下角的 UI 状态将暂时从“在线 (Online)”切换到“停止中 (Stopping)”以编辑镜像。在此过程进行时会显示日志,镜像编辑完成后,状态将变回“在线 (Online)”,您将能够使用修改后的代码运行您的图!

配置或依赖项更改后的重建

如果您编辑了图配置文件(langgraph.json)或依赖项(无论是 pyproject.toml 还是 requirements.txt),则整个镜像将被重建。这将导致 UI 从图视图切换并开始显示新镜像构建过程的日志。这可能需要一两分钟,一旦完成,您的更新镜像就可以使用了!

我的图为什么启动时间这么长?(仅限桌面版)

LangGraph Studio 与本地 LangGraph API 服务器交互。为了与持续更新保持一致,LangGraph API 需要定期重建。因此,您在启动项目时可能会偶尔遇到轻微延迟。

我的图中为什么会显示额外的边?

如果您不仔细定义条件边,您可能会发现图中出现额外的边。这是因为如果没有正确的定义,LangGraph Studio 会假定条件边可以访问所有其他节点。为了避免这种情况,您需要明确定义条件边路由到的节点。您可以通过以下两种方式完成此操作:

解决方案 1:包含路径映射

解决此问题的第一种方法是在条件边中添加路径映射。路径映射只是一个字典或数组,它将您的路由器函数可能的输出与每个输出对应的节点名称进行映射。路径映射作为第三个参数传递给 add_conditional_edges 函数,如下所示:

graph.add_conditional_edges("node_a", routing_function, {True: "node_b", False: "node_c"})
graph.addConditionalEdges("node_a", routingFunction, { foo: "node_b", bar: "node_c" });

在这种情况下,路由函数返回 True 或 False,分别映射到 node_bnode_c

解决方案 2:更新路由器的类型(仅限 Python)

除了传递路径映射,您还可以通过使用 Literal Python 定义来指定路由器函数的类型,从而明确其可以映射到的节点。以下是定义此类路由函数的示例:

def routing_function(state: GraphState) -> Literal["node_b","node_c"]:
    if state['some_condition'] == True:
        return "node_b"
    else:
        return "node_c"

更多信息请参见以下内容: