useExtension]用于获取最新载荷,@[useChannel]作为原始事件逃逸通道。
下例展示了一个客户支持智能体的转换器,该转换器会在事件到达浏览器前擦除PII(电子邮件、电话号码、SSN、卡号、IP地址),并在redaction-stats频道上发布实时擦除计数。侧边栏会动态渲染这些计数。
自定义频道的工作原理
自定义频道包含两端。在服务器端,@[StreamTransformer]会打开命名的@[StreamChannel]并推送载荷。在客户端,选择器会订阅匹配的custom:<name>频道并暴露载荷为响应式状态。
转换器的@[process]方法会在每个协议事件时执行。它可以原地修改事件(此处从messages、tools、values数据中擦除PII),并在有需要时推送侧通道更新。
客户端选择器(useExtension、useChannel)随v1前端SDK包(@langchain/react、@langchain/vue、@langchain/svelte、@langchain/angular)一起发布。
:::python
流式转换器和
StreamChannel需要langgraph>=1.2。流式转换器和
StreamChannel需要@langchain/langgraph>=1.3.1。配置useStream
按常规方式连接@[useStream]。自定义频道选择器会使用返回的相同@[stream]句柄。
代码示例使用
useStream<typeof myAgent> 进行类型安全的流状态管理。请参考 Python 或 JavaScript 后端的类型推断说明。使用useExtension读取最新载荷
useExtension订阅一个custom:<name>频道,并返回转换器推送的最新载荷(已解包且类型化)。当UI只需要当前值时(如实时计数、进度百分比或状态徽章)这是最便捷的选择。
传入裸频道名称("redaction-stats"),而非custom:前缀:
latest.value)返回Ref,Angular返回latest()。初始值为undefined,直到首个载荷到达。
可选的第三个target参数会限定订阅命名空间,与useMessages(stream, node)对消息限定图节点命名空间方式相同。
见图执行了解命名空间定位。
使用useChannel缓冲原始事件
useChannel是原始事件逃逸通道。它订阅一个或多个频道,返回底层协议事件的有限缓冲区而非单个解包值。当需要历史记录(如事件日志或审计轨迹)或需要多个频道时使用。
传入完整频道ID("custom:redaction-stats"):
event.params.data下。需自行解包:
优先使用高阶选择器(
useExtension、useMessages、useToolCalls、useValues)处理常见场景。它们返回类型化解包值,仅跟踪渲染内容。当明确需要原始事件流时使用useChannel。选择useExtension和useChannel
两者读取同一自定义频道但返回不同内容:
常见模式是在同一频道上同时使用两者:
useExtension驱动实时摘要(当前统计值),而useChannel支持滚动事件日志记录线程内所有更新。
应用场景
自定义频道适用于无法干净映射到消息、工具调用或图状态的任何服务器端信号:- 合规与擦除统计:已擦除PII、过滤内容或策略触发的计数(如示例所示)
- 进度报告:长时间运行工具的百分比完成或步骤标签
- 实时指标:运行期间累计的token使用量、延迟或成本
- 来源与引用:智能体支撑答案时推送的检索文档到侧边栏
- 领域事件:后端需要暴露但无需修改消息转录的结构化更新
相关文档
官方原文:src/oss/langgraph/frontend/custom-stream-channels.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。