函数式 API 允许您以最少的代码改动,将 LangGraph 的关键特性(持久化、记忆、人在环中 和 流式传输)添加到您的应用程序中。
有关函数式 API 的概念性信息,请参阅 函数式 API。

创建一个简单的工作流

定义 entrypoint 时,输入仅限于函数的第一个参数。要传递多个输入,可以使用字典。
此示例展示了如何在语法上使用 @task 和 @entrypoint 装饰器。 假设提供了检查点器,工作流结果将被持久化到检查点器中。

并行执行

任务可以通过并发调用并等待结果来并行执行。这对于提高 I/O 密集型任务(例如调用 LLM API)的性能非常有用。
此示例展示了如何使用 @task 并行运行多个 LLM 调用。每个调用生成关于不同主题的段落,并将结果合并为单个文本输出。
此示例使用 LangGraph 的并发模型来提高执行时间,特别是当任务涉及像 LLM 补全这样的 I/O 时。

调用图

函数式 API 和 图 API 可以在同一个应用程序中一起使用,因为它们共享相同的底层运行时。

调用其他入口点

您可以在一个 entrypoint 或 task 内部调用其他 entrypoint。

流式传输

函数式 API 使用与 图 API 相同的流式传输机制。更多详情请阅读 流式传输指南 部分。 使用流式 API 从工作流运行中流式传输数据块的示例。
  1. 从 langgraph.config 导入 get_stream_writer。
  2. 在入口点内部获取一个流写入器实例。
  3. 在计算开始之前发出自定义数据。
  4. 在计算结果之后发出另一个自定义消息。
  5. 使用 stream_events() 处理流式输出。
  6. 迭代来自 interleave("values") 的 (mode, chunk) 对。
在 Python < 3.11 中使用异步 如果使用 Python < 3.11 并且编写异步代码,使用 get_stream_writer 将不起作用。请改用 直接使用 StreamWriter 类。更多详情请参阅 在 Python < 3.11 中使用异步。

重试策略

设置任务和入口点超时

将 timeout 参数与 @task 或 @entrypoint 一起使用,以限制单个异步尝试的运行时间。以秒为单位或作为 datetime.timedelta 提供超时时间。
超时仅支持异步任务和入口点。如果您在同步函数上设置 timeout,LangGraph 会在任务或入口点声明时引发错误。 当任务或入口点超出其超时时,LangGraph 会引发 NodeTimeoutError,它是 Python 内置 TimeoutError 的子类。如果重试策略重试 TimeoutError 或 NodeTimeoutError,则会重试超时的尝试。超时独立应用于每次尝试,因此每次重试时计时器都会重置。

缓存任务

  1. ttl 以秒为单位指定。缓存将在此时间后失效。

出错后恢复

当我们恢复执行时,我们不需要重新运行 slow_task,因为其结果已保存在检查点中。

人在环中

函数式 API 使用 interrupt 函数和 Command 原语支持人在环中工作流。

基本人在环中工作流

我们将创建三个任务:
  1. 附加 "bar"。
  2. 暂停以等待人工输入。恢复时,附加人工输入。
  3. 附加 "qux"。
我们现在可以在一个入口点中组合这些任务:
在任务内部调用 interrupt(),使人类能够审查和编辑前一个任务的输出。先前任务的结果——在本例中是 step_1——被持久化,因此在 interrupt 之后不会再次运行。 让我们发送一个查询字符串:
请注意,我们在 step_1 之后使用 interrupt 暂停了。中断提供了恢复运行的说明。要恢复,我们发出一个 Command,其中包含 human_feedback 任务预期的数据。
恢复后,运行将完成剩余的步骤并按预期终止。

审查工具调用

为了在执行前审查工具调用,我们添加了一个 review_tool_call 函数,该函数调用 interrupt。当调用此函数时,执行将暂停,直到我们发出恢复它的命令。 给定一个工具调用,我们的函数将 interrupt 以供人工审查。此时我们可以:
  • 接受工具调用
  • 修改工具调用并继续
  • 生成自定义工具消息(例如,指示模型重新格式化其工具调用)
我们现在可以更新我们的入口点来审查生成的工具调用。如果工具调用被接受或修改,我们像以前一样执行。否则,我们只需附加人类提供的 ToolMessage。先前任务的结果——在本例中是初始模型调用——被持久化,因此在 interrupt 之后不会再次运行。

短期记忆

短期记忆允许在同一个线程 ID 的不同调用之间存储信息。更多详情请参阅短期记忆。

管理检查点

您可以查看和删除检查点器存储的信息。

查看线程状态

查看线程历史记录

解耦返回值与保存值

使用 entrypoint.final 将返回给调用方的内容与持久化在检查点中的内容解耦。这在以下情况下很有用:
  • 您想要返回一个计算结果(例如,摘要或状态),但保存一个不同的内部值以供下次调用时使用。
  • 您需要控制下次运行时传递给 previous 参数的内容。

聊天机器人示例

一个使用函数式 API 和 InMemorySaver 检查点器的简单聊天机器人示例。 机器人能够记住之前的对话并从中断的地方继续。

长期记忆

长期记忆允许在不同的线程 ID 之间存储信息。这对于在一次对话中学习关于某个用户的信息,并在另一次对话中使用它非常有用。

工作流

  • 工作流和代理指南提供了更多关于如何使用函数式 API 构建工作流的示例。

与其他库集成