LangGraph 代理传输的不仅是消息和工具调用。一个服务端流转换器可以在协议流向客户端时对其进行检查或重写,并在一个命名的自定义通道上发布自己的结构化数据。前端通过两个选择器读取该通道:useExtension 用于获取最新载荷,而 useChannel 则作为原始事件的备用方案。 以下示例是一个客户支持代理,其转换器在每个事件到达浏览器之前会编辑掉其中的 PII(电子邮件、电话号码、社会安全号码、信用卡号、IP 地址),并在一个 redaction-stats 通道上发布实时编辑计数。侧边面板会实时渲染这些计数。

自定义通道如何工作

自定义通道有两个端点。在服务端,一个 StreamTransformer 打开一个命名的 StreamChannel 并向其推送载荷。在客户端,一个选择器订阅匹配的 custom:<name> 通道,并将载荷暴露为响应式状态。 转换器的 process 方法会对每个协议事件运行。它可以原地修改事件(此处是从 messages、tools 和 values 数据中清除 PII),并在有需要报告的内容时推送侧通道更新。 客户端选择器(useExtension、useChannel)随 v1 前端 SDK 包(@langchain/react、@langchain/vue、@langchain/svelte、@langchain/angular)提供。
流转换器和 StreamChannel 需要 @langchain/langgraph>=1.3.1。
构建代理时附加转换器:
载荷类型是转换器推送的任何内容。以下客户端示例读取此结构:

设置 useStream

如常连接 useStream。自定义通道选择器使用此处返回的相同 stream 句柄。
The code examples use useStream<typeof myAgent> for type-safe stream state. See Type inference for Python or JavaScript backends.

使用 useExtension 读取最新载荷

useExtension 订阅一个 custom:<name> 通道,并返回转换器推送的最新载荷,该载荷已解包并具有类型。当 UI 只需要当前值(例如实时计数器、进度百分比或状态徽章)时,这是符合人体工程学的选择。 传递裸通道名称("redaction-stats"),而不是 custom: 前缀:
返回值遵循每个框架的响应式模型:在 React 和 Svelte 中是普通值,在 Vue 中是 Ref(latest.value),在 Angular 中是信号(latest())。在第一个载荷到达之前,该值是 undefined。 可选的第三个 target 参数将订阅范围限定为命名空间,其方式与 useMessage(stream, node) 将消息范围限定为已发现的图节点相同。有关命名空间目标定位,请参见图执行。

使用 useChannel 缓冲原始事件

useChannel 是原始事件的备用方案。它订阅一个或多个通道,并返回底层协议事件的有界缓冲区,而不是单个解包后的值。当你需要历史记录而不是最新值(例如事件日志或审计追踪),或者你需要一个更高级别选择器未覆盖的通道时,可以使用它。 传递完整的通道 ID("custom:redaction-stats"):
每个条目都是原始协议事件,因此载荷位于 event.params.data 下。自行解包它:
使用选项参数控制缓冲区:
对于常见情况,请优先使用更高级别的选择器(useExtension、useMessages、useToolCalls、useValues)。它们返回类型化解包的值,并且只跟踪你渲染的内容。当你特别需要原始事件流时,请使用 useChannel。

在 useExtension 和 useChannel 之间选择

两者都读取同一个自定义通道,但返回的内容不同: 一种常见模式是在同一个通道上同时使用两者:useExtension 驱动一个实时摘要(当前总数),而 useChannel 支持一个滚动显示线程中每次更新的事件日志。

用例

自定义通道适用于任何不能清晰映射到消息、工具调用或图状态的服务端信号:
  • 合规与编辑统计:如上例所示,已清除的 PII 计数、阻止的内容或策略命中。
  • 进度报告:长时间运行的工具发出的完成百分比或步骤标签。
  • 实时指标:运行期间累积的令牌使用量、延迟或成本。
  • 来源与引用:当代理依据其回答时,检索到的文档被推送到侧边面板。
  • 域事件:你的后端希望在不更改消息记录的情况下呈现的任何结构化更新。

相关内容

  • 概览 — LangGraph 前端流 API 和架构。
  • 图执行 — 用于多节点管道的命名空间作用域选择器。