import operatorfrom langgraph.channels import BinaryOperatorAggregate# Running total: each write adds to the current valuetotal = BinaryOperatorAggregate(int, operator.add)
from typing import Any, Sequence# List: append all writes in orderdef list_reducer(state: list[Any], writes: Sequence[list[Any]]) -> list[Any]: result = list(state) for write in writes: result.extend(write) return result# Dict: merge all writes, last write wins on key conflictsdef dict_reducer( state: dict[str, Any], writes: Sequence[dict[str, Any]]) -> dict[str, Any]: result = dict(state) for write in writes: result.update(write) return result
StateGraph (Graph API) 是一种更高级的抽象,简化了 Pregel 应用的创建。它允许您定义节点和边的图。当您编译图时,StateGraph API 会自动为您创建 Pregel 应用。
from typing import TypedDictfrom langgraph.constants import STARTfrom langgraph.graph import StateGraphclass Essay(TypedDict): topic: str content: str | None score: float | Nonedef write_essay(essay: Essay): return { "content": f"Essay about {essay['topic']}", }def score_essay(essay: Essay): return { "score": 10 }builder = StateGraph(Essay)builder.add_node(write_essay)builder.add_node(score_essay)builder.add_edge(START, "write_essay")builder.add_edge("write_essay", "score_essay")# Compile the graph.# This will return a Pregel instance.graph = builder.compile()
编译后的 Pregel 实例将与一组节点和通道相关联。您可以通过打印它们来查看这些节点和通道。
print(graph.nodes)
您将看到类似这样的内容
{'__start__': <langgraph.pregel.read.PregelNode at 0x7d05e3ba1810>, 'write_essay': <langgraph.pregel.read.PregelNode at 0x7d05e3ba14d0>, 'score_essay': <langgraph.pregel.read.PregelNode at 0x7d05e3ba1710>}
print(graph.channels)
您应该会看到类似这样的内容
{'topic': <langgraph.channels.last_value.LastValue at 0x7d05e3294d80>, 'content': <langgraph.channels.last_value.LastValue at 0x7d05e3295040>, 'score': <langgraph.channels.last_value.LastValue at 0x7d05e3295980>, '__start__': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e3297e00>, 'write_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e32960c0>, 'score_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e2d8ab80>, 'branch:__start__:__self__:write_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e32941c0>, 'branch:__start__:__self__:score_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e2d88800>, 'branch:write_essay:__self__:write_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e3295ec0>, 'branch:write_essay:__self__:score_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e2d8ac00>, 'branch:score_essay:__self__:write_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e2d89700>, 'branch:score_essay:__self__:score_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e2d8b400>, 'start:write_essay': <langgraph.channels.ephemeral_value.EphemeralValue at 0x7d05e2d8b280>}
在函数式 API 中,您可以使用 @entrypoint 来创建 Pregel 应用。entrypoint 装饰器允许您定义一个接收输入并返回输出的函数。
Nodes:{'write_essay': <langgraph.pregel.read.PregelNode object at 0x7d05e2f9aad0>}Channels:{'__start__': <langgraph.channels.ephemeral_value.EphemeralValue object at 0x7d05e2c906c0>, '__end__': <langgraph.channels.last_value.LastValue object at 0x7d05e2c90c40>, '__previous__': <langgraph.channels.last_value.LastValue object at 0x7d05e1007280>}