@可持久流/自动调车
用于持久流的Vercel AI SDK运输适配器.
目标
使用 AI SDK 的持久流 useChat 这样,几代人可以活下来 新鲜和重新连接干净.
本指南从:
- 无集成( 定期 AI SDK 聊天)
- 基本可持续流程一体化
- 优化再生代(推荐)
0) 起点(无持久性流)
客户端 :
import { useChat } from "@ai-sdk/react"
import { DefaultChatTransport } from "ai"
const transport = new DefaultChatTransport({ api: "/api/chat" })
const chat = useChat({ transport })
服务器 :
return result.toUIMessageStreamResponse()
这有效,但是在一代人中刷新可能会失去飞行中流.
1) 基本可持续流程一体化
客户端
交换到 createDurableChatTransport数字 :
import { useChat } from "@ai-sdk/react"
import { createDurableChatTransport } from "@durable-streams/aisdk-transport"
const transport = createDurableChatTransport({ api: "/api/chat" })
const chat = useChat({ transport })
服务器
将您的 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,
},
})
此时您可以得到耐用写作 + 耐用读取, 但尚未在刷新后自动恢复 .
2)优化布局:可续生的世代
这是推荐的生产流量.
A. 坚持每次聊天的活性流 id
当一代开始, 保存 activeStreamId = streamPath。 。 。 .
完成后, 请保存最后信件并清除 activeStreamId。 。 。 .
await saveChat({ id, activeStreamId: streamPath })
return toDurableStreamResponse({
source: result.toUIMessageStream({
originalMessages: messages,
onFinish: ({ messages: finalMessages }) => {
void saveChat({ id, messages: finalMessages, activeStreamId: null })
},
}),
stream: { writeUrl, readUrl, headers },
})
B. 增加再连接终点
执行 GET /api/chat/:id/stream数字 :
- 返回时
204当没有活跃的一代. - 返回时
200与Location财务报告和审定财务报表{ streamUrl }当有一个.
if (!chat.activeStreamId) return new Response(null, { status: 204 })
const streamUrl = buildReadProxyUrl(request, chat.activeStreamId)
return Response.json(
{ streamUrl },
{ status: 200, headers: { Location: streamUrl } }
)
C. 启用 resume 打开 useChat
const transport = createDurableChatTransport({ api: "/api/chat" })
const chat = useChat({ id, transport, resume: true })
在页面加载时, AI SDK 将调用 reconnectToStream 自动。 此传送解决了流 URL Location 第一个(或 { streamUrl } fallback),再与耐用流相接.
API 参考
createDurableChatTransport({ api, reconnectApi?, headers?, fetchClient? })
创建 AI SDK ChatTransport 即:
POSTs 消息给api- 决定从 :
Location页眉( 首选)- JSON 躯体
{ streamUrl }倒计时
- 将持久流读取为 JSON+SSE 并返回
ReadableStream<UIMessageChunk> - 支持通过
GET reconnectApi(或默认)${api}/${chatId}/stream(中文(简体) )
toDurableStreamResponse({ source, ...options })
将 AI SDK UI 信件块写入可持久流并返回指针响应 .
选项 :
source: 要求的AI SDK UI 消息块的可同步stream.writeUrl: 需要持久写入 URLstream.readUrl: 客户端接触的可选 URL(Location+ JSON 体积)stream.headers: 可选写头mode数字 :immediate(默认) : 溪流准备完毕后返回await: 生成/写入完成后返回
waitUntil: 可选的运行时间 恒活钩(在工人运行时间中有用)
反应合同
mode: "immediate"
初始响应只返回流位置元数据, 不生成内容 :
Location: <read-url>{ "streamUrl": "<read-url>" }
客户端然后连接到该读取的 URL 以消耗生成的块, 而生成则在背景中继续 .
使用 waitUntil 当你的运行时间需要 一个明确的 恒活信号,所以工人 保持生命,直到 溪流工作完成.
- 状态 :
201 - 页眉 :
Location: <read-url> - 车身 :
{ "streamUrl": "<read-url>" }
mode: "await"
仍然立即发送信头, 所以客户端可以读取 Location 并提前开始消耗流,但HTTP连接保持开口,直到生成/写入完成.
这对于只允许长期工作的运行时间是有用的,而同时有入境请求仍在活动.
- 状态 :
200 - 页眉 :
Location: <read-url> - 车身 :
{ "streamUrl": "<read-url>", "finalOffset": "<offset>" }