Skip to main content
函数式 API 允许您在对现有代码进行最小改动的前提下,为应用程序添加 LangGraph 的核心功能 —— 持久化记忆人在回路流式传输 它旨在将这些功能集成到可能使用标准语言原语(如 if 语句、for 循环和函数调用)进行分支和控制流的现有代码中。与许多要求将代码重构为显式管道或 DAG 的数据编排框架不同,函数式 API 允许您在不强制执行固定执行模型的情况下引入这些功能。 函数式 API 使用两个关键构建块:
  • @entrypoint – 将函数标记为工作流的起点,封装逻辑并管理执行流程,包括处理长时间运行的任务和中断。
  • @task – 代表一个离散的工作单元,例如 API 调用或数据处理步骤,可在入口点内异步执行。任务返回一个类似 future 的对象,可以同步等待或解析。
这为构建具有状态管理和流式传输的工作流提供了最小抽象。
有关如何使用函数式 API 的信息,请参阅 使用函数式 API

函数式 API 与图 API

对于偏好声明式方法的用户,LangGraph 的 图 API 允许您使用图范式定义工作流。两个 API 共享相同的底层运行时,因此您可以在同一应用程序中同时使用它们。 以下是主要区别:
  • 控制流:函数式 API 不需要考虑图结构。您可以使用标准 Python 结构定义工作流。这通常会减少您需要编写的代码量。
  • 短期记忆GraphAPI 要求声明一个 State,并可能需要定义 reducers 来管理图状态的更新。@entrypoint@tasks 不需要显式状态管理,因为它们的状态作用域限定在函数内,不跨函数共享。
  • 检查点:两个 API 都会生成和使用检查点。在 Graph API 中,每个 超级步骤 后都会生成一个新的检查点。在 函数式 API 中,当任务执行时,其结果会保存到与给定入口点关联的现有检查点中,而不是创建新检查点。
  • 可视化:图 API 便于将工作流可视化为图,这对调试、理解工作流和与他人共享非常有用。函数式 API 不支持可视化,因为图是在运行时动态生成的。

示例

下面演示一个编写文章并中断以请求人工审核的简单应用程序。
此工作流将撰写一篇关于“猫”主题的文章,然后暂停以获取人工审核。工作流可以无限期中断,直到提供审核。当工作流恢复时,它会从头开始执行,但由于 writeEssay 任务的结果已保存,任务结果将从检查点加载,而不是重新计算。
文章已撰写完毕,准备审核。一旦提供审核,我们可以恢复工作流:
工作流已完成,审核已添加到文章中。

入口点

@entrypoint 装饰器可用于从函数创建工作流。它封装工作流逻辑并管理执行流程,包括处理_长时间运行的任务_和中断

定义

通过使用 @entrypoint 装饰器装饰函数来定义 入口点 函数必须接受一个位置参数,该参数作为工作流输入。如果需要传递多个数据片段,请使用字典作为第一个参数的输入类型。 使用 entrypoint 装饰函数会产生一个 Pregel 实例,用于帮助管理工作流的执行(例如,处理流式传输、恢复和检查点)。 通常,您需要向 @entrypoint 装饰器传递一个 检查点器 以启用持久化并使用人在回路等功能。
序列化 入口点的输入输出必须是 JSON 可序列化的,以支持检查点。请参阅序列化部分了解详情。

可注入参数

声明 entrypoint 时,您可以请求在运行时自动注入的附加参数。这些参数包括:
使用适当的名称和类型注解声明参数。

执行

使用 @entrypoint 会产生一个 Pregel 对象,可以使用 invokeainvokestreamastream 方法执行。

恢复

interrupt 后恢复执行可以通过向 Command 原语传递 resume 值来完成。
错误后恢复 要在错误后恢复,请使用 None 和相同的 线程 ID(配置)运行 entrypoint 这假设底层错误已解决,执行可以成功继续。

短期记忆

当使用 checkpointer 定义 entrypoint 时,它会在同一线程 ID的连续调用之间将信息存储在检查点中。 这允许使用 previous 参数访问上一次调用的状态。 默认情况下,previous 参数是上一次调用的返回值。

entrypoint.final

entrypoint.final 是一个可以从入口点返回的特殊原语,允许解耦保存在检查点中的值入口点的返回值 第一个值是入口点的返回值,第二个值是将保存在检查点中的值。类型注解为 entrypoint.final[return_type, save_type]
:::js entrypoint.final