Next.js App Router 里做 AI 流式输出

最近把一个 AI 对话页迁到 Next.js App Router。流式输出在 Pages Router 时代我闭着眼都能写,到了 App Router + RSC + server action 这套新范式,卡了我大半天。把过关的路记下来。

第一个纠结:用 Route Handler 还是 Server Action

App Router 下做流式有两条路。

Route Handler( app/api/chat/route.ts 是最稳的,本质还是返回一个标准的 Response,body 塞一个 ReadableStream

javascript 复制代码
export async function POST(req: Request) {
  const stream = new ReadableStream({
    async start(controller) {
      const res = await callModel(/* ... */)
      for await (const chunk of res) {
        controller.enqueue(
          new TextEncoder().encode(chunk.delta)
        )
      }
      controller.close()
    },
  })
  return new Response(stream, {
    headers: { 'Content-Type': 'text/event-stream' },
  })
}

客户端老老实实 fetch + getReader() 读,跟以前没两样。

Server Action 看起来更"新潮",能直接在组件里 await 调用。但纯 server action 做逐字流式其实很别扭------它是为表单提交和数据变更设计的,不是天生为长连接流式准备的。要硬做得配合 useActionState 或返回一个可迭代的东西,绕。我试了一版,体感不如 Route Handler 直接。

我的选择

流式走 Route Handler,server action 只用来做非流式的副作用,比如把这轮对话存库、更新会话标题。各干各的,别让 server action 硬扛流式。

踩到的坑

坑一:动态渲染。 默认有缓存,对话接口必须显式 export const dynamic = 'force-dynamic',否则你会发现流式接口被缓存住,第二次问返回上次的内容,人都傻了。

坑二:客户端组件边界。 渲染对话气泡、维护输入状态的那部分必须 'use client'。我一开始忘加,useState 直接报错,App Router 默认是 server component 这点得时刻记着。

坑三:Edge runtime 的流式更顺,但部分 Node API 用不了,按需取舍。

没做完美的地方

server action 存库失败时的回滚我做得很糙,目前就打个日志,没做真正的补偿。先用着。

模型那一端我接的讯飞 MaaS,现成的推理服务直接调,不折腾自建。你们 App Router 下流式是走 Handler 还是 Action?评论区交个底。

相关推荐
Kel8 小时前
GQA 与 KV 缓存(Grouped-Query Attention & KV Cache)
人工智能
DogDaoDao8 小时前
OpenBrowser 深度解析:让 AI 真正「用上」浏览器的自主代理框架
人工智能·程序员·大模型·github·web·ai工具·openbrowser
_Jimmy_8 小时前
Tool Calling 与 Function Calling 区别
人工智能·python·langchain
ITmaster07319 小时前
告别 IDE?Android CLI 来了,开发进入 AI Agent 时代
android·ide·人工智能
陈明勇9 小时前
一篇文章,多种表达:我用 Seed Evolving 生成知识卡片
人工智能
墨舟的AI笔记9 小时前
ECS 中的确定性随机与回放:让帧同步在 DOTS 上成立
人工智能
图特摩斯科技9 小时前
本体智能应用案例实践分享:汽车零部件库存优化与召回应急保障
人工智能·汽车·palantir·ontology·ontoflow·ontoos
专业工业电源打工人9 小时前
F0505S-2WR3 适配优选 钡特电源 DF2-05S05LS|2W 隔离 DC-DC 模块电源5V转5V硬件选型参数规格解析
大数据·网络·人工智能
a1117769 小时前
三色软糖坠落玻璃池 THreeJS kimi
前端·人工智能·threejs
xian_wwq9 小时前
【学习笔记】解剖 Claude Code —— Anthropic 的 Harness 参考实现-09/15
人工智能·笔记·学习