资讯详情

资讯详情

Electric Streams 与 Vercel AI SDK 集成:用 Durable Transport 让 useChat 生成可恢复、可共享

Electric Streams 与 Vercel AI SDK 集成用 Durable Transport 让 useChat 生成可恢复、可共享【免费下载链接】electricThe agent platform built on sync.项目地址: https://gitcode.com/GitHub_Trending/el/electric本篇技术指南讲解如何在基于 Electric StreamsDurable Streams 协议的托管实现的应用中通过durable-streams/aisdk-transport把 Vercel AI SDK 的useChat默认 Transport 替换为持久化 Transport让一次聊天生成在页面刷新、网络抖动、重渲染等场景下依然存活并能够跨标签页、跨设备、跨用户与跨 Agent 恢复和共享。读完本文你将掌握客户端与服务端的完整接入方式、resume 流程的设计要点以及这一集成所依赖的 Durable Streams 底层协议原理。为什么聊天生成需要可恢复大多数 AI 应用在连接出现任何问题时都会中断网络不稳定、页面导航或一次重渲染打断了正在进行的长时间生成导致已经流式输出的内容丢失用户不得不重新提问。Vercel AI SDK 意识到了这一挑战并在其 UI 层提供了 Transport 接口作为扩展点——接入方可以自定义客户端与服务端之间的通信方式同时保留正常的useChat数据流。Electric Streams 提供的 Durable Streams 正是解决这类问题的原生数据原语它们是持久、可寻址、追加写入、可按 offset 重放的 HTTP 流专门服务于 agent 循环与实时数据场景。将 AI SDK 的 Transport 层替换为基于 Durable Streams 的实现即可获得三方面能力韧性resilience生成过程中的消息与 token 全部落到持久化流中断网重连后无需重新开始可恢复resumability任何客户端都可以从任意 offset 重新订阅并续读刷新页面后无缝衔接协作collaboration连接到同一会话的多个客户端订阅并写入同一条流天然支持多标签页、多设备、多用户与多 Agent 的实时与异步协作。这一集成基于 Durable Streams 协议概述中描述的核心概念并遵循我们在 Durable Transports for your AI SDK 发布说明中定义的Durable Sessions 模式。安装在项目中使用 pnpm 安装 transport 包pnpm add durable-streams/aisdk-transport该包同时提供客户端 TransportcreateDurableChatTransport与服务端响应包装toDurableStreamResponse因此一个依赖即可覆盖两端。若你的服务端还需要直连 Durable Streams 服务器可参考 Quickstart 中通过 curl 创建、追加、读取与实时 tail 一条流的基本流程。客户端把默认 Transport 换成createDurableChatTransport在客户端保持useChat的调用方式不变仅将默认 Transport 替换为createDurableChatTransport并开启resumeimport { useChat } from ai-sdk/react import { createDurableChatTransport } from durable-streams/aisdk-transport const transport createDurableChatTransport({ api: /api/chat }) const chat useChat({ transport, resume: true })api指向你现有的聊天接口如/api/chat请求/响应协议与 AI SDK 默认 Transport 保持一致resume: true让useChat在初始化时主动尝试恢复上一次未完成的生成。从实现角度看createDurableChatTransport遵循 AI SDK Transport 的同一套模型客户端不再以一次性请求/响应的方式消费服务端返回的 SSE 流而是从 Durable Stream 上订阅并消费 token 数据。这意味着useChat的消息状态机、messages渲染与发送流程几乎不用改动接入成本集中在换一个 transport 对象。服务端用toDurableStreamResponse包装消息流在服务端把 AI SDK 的 UI 消息流用toDurableStreamResponse包装后返回import { toDurableStreamResponse } from durable-streams/aisdk-transport return toDurableStreamResponse({ source: result.toUIMessageStream(), stream: { writeUrl: buildWriteStreamUrl(streamPath), readUrl: buildReadProxyUrl(request, streamPath), headers: DURABLE_STREAMS_WRITE_HEADERS, }, })各字段的作用sourceAI SDK 生成结果result.toUIMessageStream()产生的 UI 消息流即 LLM 流式输出的 chunk 序列stream.writeUrlDurable Stream 的写入地址服务端将 AI SDK chunk 逐条 POST 追加到该流stream.readUrlDurable Stream 的读取地址通常是一个由你控制的代理端点proxy用于拼接上游读 URL、附加读鉴权头并转发offset、live等查询参数headers写入流时携带的服务端鉴权头如DURABLE_STREAMS_WRITE_HEADERS。服务端完成两件事把 AI SDK 的 chunk 写入 Durable Streams同时在响应头Location和响应体{ streamUrl }中返回读取 URL。客户端拿到该 URL 后即可订阅流、按 offset 续读从而实现同一条流上的恢复与多端共享。Resume flow让刷新安全的完整流程要让一次生成能够跨刷新存活需要在业务层配合以下四个步骤对应文档中的 Resume flow 一节持久化进行中生成所属的流 id在生成进行期间把当前活跃的 stream id 与聊天chat关联并持久化例如写入数据库或本地存储作为恢复的锚点新增一个重连端点例如GET /api/chat/:id/stream用于按 chat id 查询当前是否有进行中的生成按状态返回正确响应没有活跃生成时返回204无内容客户端无需恢复存在活跃生成时返回200并携带Location头与{ streamUrl }响应体指向可续读的流地址在useChat中开启resume: true客户端初始化时先请求重连端点拿到streamUrl便从流的末尾位置恢复订阅无缝接续被中断的生成。这套先探活、再续读的设计本质上是 Durable Streams 协议中消费者模型的应用客户端保存上一次读取返回的Stream-Next-Offset重连时从该 offset 继续GET即可不重放整段会话详见 Durable Streams 协议概述中的Offsets与Consumers小节。工作原理Durable Streams 协议如何支撑恢复与共享要理解为什么换一个 transport就能获得韧性需要回到底层协议。Durable Streams 的每条流都是一个URL 可寻址、追加写入、持久有序的字节序列数据一旦写入某个位置就不会改变新数据只能追加到末尾位置由不透明的、可字典序比较的offset标识。协议定义了创建PUT、追加POST、读取GET、元数据HEAD、关闭与删除六种操作读取支持offset-1从头重放与offsetnow仅订阅未来数据两种哨兵值。对 AI 聊天场景而言最关键的三个特性是持久性与重放写入的数据被持久化存储Electric Streams 服务器以 Rust 实现每条流按线上字节原样落盘catch-up 读就是一次字节区间读取默认wal模式下追加在写入日志确认后才应答天然可恢复。因此 token chunk 不会因为页面刷新而丢失live 模式消费者追赶完历史数据后可通过?livesse或?livelong-poll实时订阅新数据。SSE 每约 60 秒由服务器周期性关闭以配合 CDN 连接折叠客户端用最后一次control事件中的streamNextOffset重连这正好对应resume: true场景下的断线自动续读幂等写入与消费协议支持Producer-Id/Producer-Epoch/Producer-Seq三头部的幂等生产者语义重试不会产生重复数据读取则通过Stream-Next-Offset、Stream-Up-To-Date、Stream-Closed头驱动一个简单而可靠的读循环。多端共享则来自同一条流的拓扑任何客户端订阅并写入同一条流服务端把 AI SDK chunk 也写入同一条流所有订阅者都会实时收到同一份数据无论数据来自哪个用户或哪个 Agent。这正是 Durable Streams 协议概述所描述的catch-up 重放 实时扇出统一由同一原语支撑的体现。进阶从原始字节流到 Durable Sessions原始 Durable Stream 处理的是字节/token 流当应用需要把 AI token 流与结构化状态如工具调用结果、用户在线状态、共享文档复用同一基础设施时可以在其上叠加State Protocol形成分层协议栈也就是 Durable State 文档定义的Durable Sessions模式Durable Streams—— 可靠、可恢复的字节投递State Protocol—— 流上的结构化 CRUD 操作insert/update/delete变更事件与 snapshot / reset 控制事件应用层协议—— AI SDK Transport、presence、CRDT如 Yjs等。在这种分层下一个 Agent 把 token 流式写入会话的同时结构化状态工具结果、用户在场、共享文档可以流经同一套基础设施支持多用户与多 Agent 的实时与异步协作。对消息历史的处理集成遵循inversion of control控制反转原则可以由你选择从会话流中物化历史对应姊妹篇 TanStack AI 集成中的materializeSnapshotFromDurableStream思路也可以把消息物化到 Postgres 等数据库集成不强制规定持久化方式。示例与下一步原文档指向的包 README 与chat-aisdk示例应用位于上游 durable-streams 仓库本仓库之外建议结合本仓库内的以下材料做完整落地Durable Streams 协议概述offset、live 模式、生命周期、CDN 缓存等协议概念Quickstart启动durable-streams-server并用 curl 完成建流、写入、读取、实时 tail 的全流程CLI 文档用durable-stream命令行管理流适合联调验证Rust 服务器实现说明了解持久化WAL、零拷贝读取、分层存储与 OpenTelemetry 观测等服务器侧实现TanStack AI 集成同一 Durable Sessions 模式在 TanStack AI Connection Adapter 上的对应实现可作为模式对照。接入完成后一次典型的体验是用户在弱网或刷新后回到页面useChat自动通过重连端点找回进行中的生成并续读 token 流多个标签页或设备订阅同一条流实时看到同一份生成内容而 Agent 产生的写入也汇入同一条流实现人机共写一个会话。【免费下载链接】electricThe agent platform built on sync.项目地址: https://gitcode.com/GitHub_Trending/el/electric创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →