RemoteGraph 是一个客户端接口,允许你与你的部署进行交互,就像它是一个本地的图一样。它提供了与 CompiledGraph 等价的 API,这意味着你可以在开发和生产环境中使用相同的方法(invoke()、stream()、get_state() 等)。本页介绍了如何初始化 RemoteGraph 并与之交互。 RemoteGraph 适用于以下场景:
  • 开发与部署分离:在本地使用 CompiledGraph 构建和测试一个图,将其部署到 LangSmith,然后使用 RemoteGraph 在生产环境中调用它,同时使用相同的 API 接口。
  • 线程级持久化:通过线程 ID 跨调用持久化和获取会话的状态。
  • 子图嵌入:通过将 RemoteGraph 作为子图嵌入另一个图中,为多智能体工作流组合模块化的图。
  • 可重用的工作流:将已部署的图用作节点或 工具,以便重用和公开复杂逻辑。
重要:避免调用同一部署RemoteGraph 旨在调用其他部署上的图。不要使用 RemoteGraph 调用其自身或同一部署上的另一个图,因为这可能导致死锁和资源耗尽。相反,对于同一部署内的图,请使用本地图组合或子图。

前提条件

在开始使用 RemoteGraph 之前,请确保你拥有:
  • 访问 LangSmith 的权限,你的图在此开发和管理。
  • 一个正在运行的智能体服务器,它托管你已部署的图以进行远程交互。

初始化图

初始化 RemoteGraph 时,你必须始终指定:
  • name:你想要交互的图的名称 或 一个助手 ID。如果你指定图名称,将使用默认助手。如果你指定助手 ID,将使用该特定助手。图名称与你在部署配置文件 langgraph.json 中使用的名称相同。
  • api_key:一个有效的 LangSmith API 密钥。你可以将其设置为环境变量 (LANGSMITH_API_KEY) 或直接在 api_key 参数中传递。如果 LangGraphClient / SyncLangGraphClient 是使用 api_key 参数初始化的,你也可以在 client / sync_client 参数中提供 API 密钥。
此外,你必须提供以下项之一:
  • url:你想要交互的部署的 URL。如果你传递 url 参数,同步和异步客户端都将使用提供的 URL、标头(如果提供)和默认配置值(例如超时时间)创建。
  • client:一个 LangGraphClient 实例,用于异步与部署交互(例如,使用 .astream()、.ainvoke()、.aget_state()、.aupdate_state())。
  • sync_client:一个 SyncLangGraphClient 实例,用于同步与部署交互(例如,使用 .stream()、.invoke()、.get_state()、.update_state())。
如果你同时传递了 client 或 sync_client 以及 url 参数,它们将优先于 url 参数。如果 client / sync_client / url 参数均未提供,RemoteGraph 将在运行时引发 ValueError。

使用 URL

使用客户端

调用图

RemoteGraph 实现了与 CompiledGraph 相同的 Runnable 接口,因此你可以像使用编译好的图一样使用它。它支持全套标准方法,包括 .invoke()、.stream()、.get_state() 和 .update_state(),以及它们的异步变体。

异步调用

要异步使用图,你必须在初始化 RemoteGraph 时提供 url 或 client。

同步调用

要同步使用图,你必须在初始化 RemoteGraph 时提供 url 或 sync_client。

在线程级别持久化状态

默认情况下,图运行(例如通过 .invoke() 或 .stream() 进行的调用)是无状态的,这意味着中间检查点和最终状态在运行后不会被持久化。 如果你想保留运行的输出——例如,以支持人机协作工作流——你可以创建一个线程并通过 config 参数传递其 ID。这与常规的编译图工作方式相同:

作为子图使用

如果你需要在包含 RemoteGraph 子图节点的图中使用 checkpointer,请确保使用 UUID 作为线程 ID。
一个图也可以调用多个 RemoteGraph 实例作为 子图 节点。这允许创建模块化、可扩展的工作流,其中不同的职责分布在独立的图中。 RemoteGraph 暴露了与常规 CompiledGraph 相同的接口,因此你可以直接将其用作另一个图内部的子图。例如: