图节点如何映射到 UI 卡片
LangGraph 图定义了一系列节点,每个节点负责特定任务。例如,一个研究流程可能包含:- 分类:对用户查询进行分类
- 研究:收集相关信息
- 分析:从研究中得出结论
- 综合:生成最终、精炼的响应
useStream] 通过 stream.subgraphs 在运行时发现每个节点,并为每个观察到的步骤暴露一个 @[SubgraphDiscoverySnapshot]:
node.nodeName 为进度条和卡片标题提供标签。将每个快照传递给 useMessages(stream, node) 以渲染节点范围的流式内容,而无需将 UI 与图状态键名称耦合。
这种映射成为您的图与 UI 之间的契约。后端作者可以有意地添加、重命名或重新排序节点,而前端作者决定每个状态键应如何可视化:状态徽章、Markdown 面板、表格、图表、跟踪视图或审批卡片。
设置 useStream
像往常一样连接 @[useStream]。您将使用的键属性是 messages(用于对话)和 subgraphs(用于当前运行中发现的图节点)。将每个发现的子图快照传递给选择器以读取该节点范围内的消息。
代码示例使用
useStream<typeof myAgent> 进行类型安全的流状态管理。请参考 Python 或 JavaScript 后端的类型推断说明。将流式 Token 路由到节点
当图流式传输时,每个发现的子图快照都会标识它所属的节点。将此快照传递给选择器钩子或可组合组件以读取该节点范围内的消息:确定节点状态
每个发现的节点都携带其当前状态。直接使用node.status;发现快照报告 "pending"、"running"、"complete" 或 "error":
构建流程进度条
顶部有一个水平进度条,为用户提供整个流程的鸟瞰视图。每个步骤都是一个带标签的片段,随着节点的完成而填充:构建可折叠的 NodeCard 组件
每个节点都有自己的卡片,显示状态徽章、内容(流式或最终)以及用于长输出的可折叠正文:流式传输与已完成内容
节点卡片读取流式传输和最终内容的范围消息。这避免了假设图节点名称与其写入的状态键匹配(例如,do_research 在游乐场图中写入 research):
模式是:在节点卡片中显示最新的范围 AI 消息,并且仅在您有意需要图状态字段时使用
stream.values。
由于范围消息与生成节点相关联,UI 可以支持并行图路径而无需根据消息顺序猜测。每个卡片根据其节点所属的流事件进行更新,完成的值可以通过 stream.values 保持可用。
将所有内容整合在一起
这是结合路由、状态检测和卡片渲染的完整卡片列表:用例
图执行卡片适用于任何需要可见性的多步骤流程:- 研究流程:分类 → 收集来源 → 分析 → 综合报告
- 内容生成:大纲 → 起草 → 核实事实 → 编辑 → 发布
- 数据处理:摄取 → 验证 → 转换 → 汇总 → 导出
- 代码生成:理解需求 → 规划架构 → 编写代码 → 审查 → 测试
- 决策工作流:收集背景 → 评估选项 → 评分备选方案 → 推荐
处理动态流程
并非所有图都具有固定的节点集。一些流程根据输入添加或跳过节点。发现映射仅包含当前线程观察到的节点:如果您的图具有条件分支(例如,对于简单的事实性查询跳过“研究”),则跳过的节点将不会出现在
stream.subgraphs 中。您的流程进度条可以仅渲染发现的节点,或淡化没有匹配快照的预期节点。最佳实践
- 从流中发现节点。从
stream.subgraphs渲染卡片,而不是硬编码预期节点;条件或跳过的步骤只有在运行时才会出现。 - 将状态键视为 UI 合同。确定哪些图输出对前端渲染足够稳定,并将这些键记录在图定义旁边。
- 为节点卡片使用作用域消息。它们在节点流式传输时以及完成后都有效,而不会将 UI 卡片与状态键名称耦合。
- 自动折叠完成的节点。在长管道中,自动折叠已完成的卡片,以便用户可以专注于当前活动的步骤。
- 显示估计时间。如果你有关于每个节点所需时间的歷史数据,显示时间估计以设定用户预期。
- 添加全局进度指示器。在管道视图顶部补充每个节点的卡片,提供一个总体进度条(例如,“步骤 2/4”)。
- 按节点处理错误。如果节点失败,在其卡片中显示错误,而不会折叠整个管道。其他节点仍可能成功完成。
官方原文:src/oss/langgraph/frontend/graph-execution.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。