把 batch-2 的 chatbot 升级到 Vercel AI SDK 6
一句话定义:用
npx @ai-sdk/codemod upgrade v6自动跑 4.x → 6.x 迁移,验证streamText/useChat没坏,然后用 v6 新增的ToolLoopAgent重写并加 tool approval 让用户审批敏感工具调用。预计耗时:30 分钟(自动迁移 + 验证) | 难度:进阶
适用场景
- 已经用 Vercel AI SDK 4.x / 5.x 写过 chatbot,想升 6.x 拿 agent 抽象、tool approval、多模态
- 看到 v6 release notes,想知道值不值得升、坑在哪
- 跟着
add-vercel-ai-sdk-streaming-chatbot路径 C 跑过 demo,现在想升级到 v6 - 后端跑在 CloudBase 云托管 / Web 云函数,前端是 Next.js / Vue / React
不适用:
- 从未用过 Vercel AI SDK 的项目,直接看 v6 官方文档新建即可,不必走升级路径
- 用 OpenAI Node SDK 直连、根本没接 Vercel AI SDK 的项目,本篇不相关
- 微信小程序栈,参考 batch-2 篇 08 的路径 A(
cloudbase-agent-ui)
v6 vs v5 / v4 关键差异
| 维度 | v4.x | v5.x | v6.x |
|---|---|---|---|
| 流式协议 | data stream v1 | data stream v2(破坏性) | 兼容 v5 协议 |
| 前端 hook | ai/react | @ai-sdk/react | @ai-sdk/react |
| Agent 抽象 | 无 | 实验性 | ToolLoopAgent(stable) |
| Tool approval | 无 | 无 | needsApproval + UI 协议 |
| MCP 集成 | 无 | experimental | @ai-sdk/mcp stable |
| 调试工具 | 无 | 无 | @ai-sdk/devtools |
| 升级路径 | — | 手工迁移多 | npx @ai-sdk/codemod upgrade v6 |
v6 官方表态是"不期望大破坏性变化"——大部分 4.x → 6.x 的工作 codemod 能扫掉,比当年 v4 → v5 那次温和。但 codemod 不是万能的,下面会标出几个 codemod 改不到的地方。
环境要求
| 依赖 | 版本(撰写时 npm latest) |
|---|---|
| Node.js | ≥ 20(v6 已停止支持 Node 18) |
ai | ^6.0(撰写时 6.0.x) |
@ai-sdk/codemod | ^3.0(撰写时 3.0.x) |
@ai-sdk/openai / @ai-sdk/anthropic | ^3.0 |
@ai-sdk/react | ^3.0 |
@ai-sdk/devtools(可选) | ^0.0(公测期) |
@cloudbase/cli(tcb) | latest |
具体 patch 版本请以 npm view ai version 拉到的为准,下面命令里写 ^6.0 / latest 即可,不要锁死单个 patch。
升级前置:把 batch-2 篇 08 的项目跑起来
本篇假设你手上有一个跟着 add-vercel-ai-sdk-streaming-chatbot 路径 C 跑通的项目结构:
chatbot/
├── app/
│ ├── api/
│ │ └── chat/
│ │ └── route.ts # streamText + toDataStreamResponse
│ └── chat/
│ └── page.tsx # useChat hook
├── package.json # ai@^4 + @ai-sdk/openai@^1
└── .env.local
升级前先跑一遍 npm run dev 确认能聊天、能看到流式输出,再开始改。不要在挂着的项目上直接升——升完出问题分不清是迁移没干净还是原来就坏了。
第一步:运行 codemod 自动迁移
# 切到项目根目录
cd chatbot
# 备份当前分支
git checkout -b upgrade-ai-sdk-v6
# 跑官方 codemod,自动改 import 路径、API 调用形态、类型签名
npx @ai-sdk/codemod upgrade v6
codemod 会扫整个 src/ / app/ / pages/(含 .ts .tsx .js .jsx),主要做这几件事:
- import 路径:
from 'ai'里被废弃的导出改名或迁出(比如老的experimental_*前缀去掉) streamText/generateText选项重命名:v5 时改过一次的messages/prompt字段在 v6 又收紧了toDataStreamResponse→toUIMessageStreamResponse:v6 把流式响应方法名做了统一- provider 包装:
createOpenAI({ baseURL })这类工厂函数签名几乎不动,但内部协议层 codemod 会改
跑完看一眼 git diff:
git diff --stat
正常的 diff 应该只有几个文件、几十行变动。如果一上来就是几百行——大概率你之前混用了实验性 API,需要先回到 stable 表面再升。
注意:codemod 不会装新依赖,也不会改 package.json 的版本号。下一步手动升包。