内容提要
本文介绍如何用 Vercel AI SDK 与 shadcn/ui 构建 AI 聊天界面:搭建 Next.js 项目、创建流式 API 路由、用 useChat 实现消息流式渲染并支持工具调用;也可用 @shadcn/helpers 无后端模拟对话,借助 MCP 服务器加速组件开发。上线前需添加限流、中止、错误边界和鉴权,或直接使用现成模板。
延伸解读
为什么 shadcn/ui 更适合 AI 聊天界面
传统组件库将内部实现隐藏,而聊天界面需要精细控制消息气泡的流式动画、思考指示器以及工具调用的渲染方式。shadcn/ui 将组件源码直接复制到项目中,开发者完全拥有代码,可以自由修改而不受抽象层限制。这种所有权模型正好满足 AI 产品对消息、推理和工具输出渲染的差异化需求,也是其生态繁荣的原因。
无后端原型开发:用 @shadcn/helpers 模拟对话
在打磨聊天 UI 时,频繁调用真实模型既慢又耗 token。@shadcn/helpers 允许你脚本化假对话,并通过相同的 useChat 钩子流式传输,无需服务器或 API 密钥。它支持推理、工具调用、文件等所有 AI SDK 部件类型,且每次流式输出确定,适合编写可复现的演示或 UI 测试。这样你可以先完善界面,等后端就绪再无缝切换。
上线前必须处理的四个生产问题
教程版本有意保持最小化,但生产环境需添加:对 /api/chat 路由的限流,避免无限制调用导致高额模型账单;中止处理,让用户能中途停止响应(useChat 的 stop() 已支持);聊天组件周围的错误边界,防止流中断或提供商故障导致页面崩溃;以及鉴权,如果响应或历史记录需按用户隔离。这些是任何 API 路由的通用生产基础,但聊天端点容易因开发顺利而被忽略。
用 MCP 服务器加速组件开发
与其从文档复制粘贴组件,不如通过 MCP 服务器让 AI 编码助手直接访问组件注册表。Shadcn MCP 服务器将 Claude Code、Cursor 等工具连接到 Shadcn Space 组件目录,你只需描述需求(如“添加带头像和时间戳的消息气泡组件”),助手就会拉取真实、最新的组件定义,而非依赖过时的训练数据。设置只需一行命令,其他编辑器在 MCP 配置文件中添加相同命令即可。
Q&A
如何用 Vercel AI SDK 和 shadcn/ui 构建一个流式 AI 聊天界面?
先创建 Next.js 项目并安装 Vercel AI SDK 和 shadcn/ui,然后创建流式 API 路由(使用 streamText 和 toUIMessageStreamResponse),在客户端用 useChat 钩子实现消息流式渲染,最后用 shadcn/ui 组件构建消息气泡、输入框和滚动区域。
为什么 shadcn/ui 特别适合用于 AI 聊天界面?
因为 shadcn/ui 将组件源代码直接复制到项目中,开发者完全拥有并可以自由修改,能精确控制消息气泡的动画、思考指示器、工具调用渲染等细节,而传统组件库通过 props 隐藏内部实现,难以满足聊天界面的定制需求。
如何让 AI 模型在聊天中调用工具(函数)?
在 API 路由的 streamText 配置中添加 tools 对象,使用 tool 函数定义工具,包括 description、inputSchema(JSON Schema)和 execute 异步函数。模型会自动决定何时调用,SDK 将调用路由到 execute 并将结果流式返回。
没有后端或 API 密钥时,如何先开发和测试聊天界面?
可以使用 @shadcn/helpers 包中的 createChat 来模拟对话,它支持所有 AI SDK 的消息部分类型(如推理、工具调用、文件等),并通过相同的 useChat 钩子流式传输,无需服务器或 API 密钥,便于 UI 开发和测试。
上线 AI 聊天功能前需要添加哪些生产环境必备措施?
需要添加:1) 对 /api/chat 路由进行限流,防止滥用;2) 中止处理,允许用户中途停止响应(useChat 的 stop() 函数);3) 错误边界,防止流中断或提供商故障导致页面崩溃;4) 鉴权,如果响应或历史记录需要按用户隔离。
如何通过 MCP 服务器加速 shadcn 组件的开发?
安装 Shadcn MCP 服务器(如 claude mcp add shadcnspace-mcp -- npx -y shadcnspace-mcp@latest),将其连接到 AI 编码助手(如 Claude Code、Cursor、Windsurf),然后直接向助手请求所需组件,它会从组件注册表中拉取最新定义,避免手动搜索和复制粘贴。