关于 ai-elements-chatbot
面向 Next.js App Router 项目的 AI 聊天界面组件技能,使用 CLI 将组件源码复制到项目中,涵盖消息、流式响应和工具调用等界面。
主要功能
- 01聊天消息与对话容器
- 02流式 Markdown 渲染
- 03自动调整输入框
- 04工具调用与推理展示
- 05引用来源和代码块组件
适用场景
- 01搭建 AI 聊天界面
- 02呈现流式模型响应
- 03展示工具调用和引用来源
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jackspace/ claudeskillz --skill ai-elements-chatbot安装后在 Claude Code 中输入/ai-elements-chatbot确认已加载。
附带文件README.mdSKILL.json
详细介绍
AI Elements 聊天机器人组件
状态:已可用于生产环境 最后更新:2025-11-07 依赖项:tailwind-v4-shadcn(前置条件)、ai-sdk-ui(配套工具)、nextjs(框架) 最新版本:[email protected]、[email protected]+、next@15+、react@19+
快速入门(15 分钟)
1. 验证前置条件
安装 AI Elements 前,请确保已完成以下设置:
# Check Next.js version (needs 15+)
npx next --version
# Check AI SDK version (needs 5+)
npm list ai
# Check shadcn/ui is initialized
ls components/ui # Should exist with button.tsx etc
这很重要,因为:
- AI Elements 构建在 shadcn/ui 之上(缺少它将无法运行)
- 需要 Next.js App Router(不支持 Pages Router)
- AI SDK v5 与 v4 存在不兼容的重大变更
缺少前置条件? 请先使用 tailwind-v4-shadcn 技能,然后安装 AI SDK:
pnpm add ai@latest
2. 安装 AI Elements CLI
# Initialize AI Elements in your project
pnpm dlx ai-elements@latest init
# Add your first components
pnpm dlx ai-elements@latest add message conversation response prompt-input
重要提示:
- 组件会复制到
components/ui/ai/中(不会作为 npm 包安装) - 完整拥有源代码(可按需修改)
components.json中的 Registry URL 必须正确
3. 创建基本聊天界面
// app/chat/page.tsx
'use client';
import { useChat } from 'ai/react';
import { Conversation } from '@/components/ui/ai/conversation';
import { Message } from '@/components/ui/ai/message';
import { MessageContent } from '@/components/ui/ai/message-content';
import { Response } from '@/components/ui/ai/response';
import { PromptInput } from '@/components/ui/ai/prompt-input';
export default function ChatPage() {
const { messages, input, handleInputChange, handleSubmit, isLoading } = useChat({
api: '/api/chat'
});
return (
<div className="flex h-screen flex-col">
<Conversation className="flex-1">
{messages.map((msg) => (
<Message key={msg.id} role={msg.role}>
<MessageContent>
<Response markdown={msg.content} />
</MessageContent>
</Message>
))}
</Conversation>
<PromptInput
value={input}
onChange={handleInputChange}
onSubmit={handleSubmit}
disabled={isLoading}
/>
</div>
);
}
完成!现在你拥有了一个可用的聊天界面,支持:
- ✅ 流式 Markdown 渲染
- ✅ 对话自动滚动
- ✅ 输入框自动调整大小
- ✅ 基于角色的消息样式
5 步设置流程
第 1 步:安装 AI Elements CLI
pnpm dlx ai-elements@latest init
此操作会:
- 创建
components/ui/ai/目录 - 使用 AI Elements Registry 更新
components.json - 将必要的依赖项添加到 package.json
要点:
- 请在项目根目录(package.json 所在位置)运行
- 需要先初始化 shadcn/ui
- 如果缺少
components.json,操作将失败(请先运行pnpm dlx shadcn@latest init)
第 2 步:添加核心聊天组件
# Essential components for basic chat
pnpm dlx ai-elements@latest add message message-content conversation response
# Optional: Input component
pnpm dlx ai-elements@latest add prompt-input actions suggestion
组件用途:
message:单条消息(用户/AI)的容器message-content:消息内容部分的包装器conversation:自动滚动的聊天容器response:Markdown 渲染器(针对流式传输优化)prompt-input:带工具栏且可自动调整大小的文本区域actions:复制/重新生成/编辑按钮suggestion:快速提示词标签
第 3 步:添加高级组件(可选)
# For tool calling
pnpm dlx ai-elements@latest add tool
# For reasoning display (Claude/o1 style)
pnpm dlx ai-elements@latest add reasoning
# For source citations (Perplexity style)
pnpm dlx ai-elements@latest add sources inline-citation
# For code highlighting
pnpm dlx ai-elements@latest add code-block
# For conversation branching
pnpm dlx ai-elements@latest add branch
# For task lists
pnpm dlx ai-elements@latest add task
# For AI-generated images
pnpm dlx ai-elements@latest add image
# For web previews (Claude artifacts style)
pnpm dlx ai-elements@latest add web-preview
# For loading states
pnpm dlx ai-elements@latest add loader
各组件的适用场景:
tool:构建支持函数调用的 AI 助手reasoning:展示 AI 的思考过程(如 Claude 或 o1)sources:添加引文和参考资料(如 Perplexity)code-block:聊天中包含代码片段branch:包含多个分支的多轮对话task:AI 生成带文件引用的任务列表image:AI 生成图像(DALL-E、Stable Diffusion)web-preview:AI 生成 HTML/网站(Claude artifacts)loader:在流式传输期间显示加载状态
第 4 步:创建 API 路由
创建 /app/api/chat/route.ts:
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({
model: openai('gpt-4o'),
messages,
});
return result.toDataStreamResponse();
}
要点:
- 必须使用 AI SDK v5 的
streamText()(而不是 v4 的OpenAIStream()) - 返回用于流式传输的
toDataStreamResponse() - 客户端通过
useChat()Hook 自动接收更新
第 5 步:验证安装
# Check components installed
ls components/ui/ai/
# Expected output:
# message.tsx, message-content.tsx, conversation.tsx, response.tsx, prompt-input.tsx, ...
# Start dev server
pnpm dev
# Test chat interface at http://localhost:3000/chat
验证清单:
- 所有组件都在
components/ui/ai/中 -
components.json包含 AI Elements Registry - 没有 TypeScript 错误
- 聊天界面可以渲染
- 流式传输正常(输入消息 → 获取回复)
- 流式传输期间自动滚动正常
重要规则
始终做到
✅ 先初始化 shadcn/ui,再安装 AI Elements——AI Elements 以 shadcn/ui 为基础
✅ 使用 AI SDK v5——v4 不兼容(存在重大变更)
✅ 使用 Next.js App Router——不支持 Pages Router
✅ 使用 'use client' 包装——所有 AI Elements 组件都在客户端运行
✅ 向 Response 组件传入原始 Markdown——不要传入预渲染的 HTML
✅ 使用 Conversation 组件作为容器——它会处理自动滚动和虚拟化
✅ 有条件地显示语音输入——仅支持 Chrome/Edge(不支持 Firefox/Safari)
✅ 合并连续的推理块——避免长回复中出现重复
切勿执行
❌ 将 AI Elements 安装为 npm 包 - 这是一个用于复制组件的 CLI 工具
❌ 与 AI SDK v4 搭配使用 - 会因类型错误和数据格式问题而失败
❌ 忘记 'use client' 指令 - 组件使用 React hooks(仅限客户端)
❌ 与其他组件库混用 - 仅为 shadcn/ui 构建(使用 Tailwind 类)
❌ 手动编写组件代码 - 使用 CLI 确保采用正确的模式
❌ 跳过前置条件检查 - 可能悄无声息地失败,并出现令人困惑的错误
❌ 在 Pages Router 中使用 - 需要 App Router 功能
❌ 假设语音输入在所有地方都能使用 - Web Speech API 仅适用于 Chrome/Edge
已知问题预防
此技能可预防已记录的 8 个问题:
问题 #1:PromptInputSpeechButton 无法使用(Firefox/Safari)
错误:语音输入按钮没有响应,或抛出 SpeechRecognition is not defined
来源:https://github.com/vercel/ai-elements/issues/210
发生原因:Web Speech API 仅在 Chromium 浏览器(Chrome、Edge)中受支持
预防:
// Conditionally show voice button
const isSpeechSupported = typeof window !== 'undefined' &&
('webkitSpeechRecognition' in window || 'SpeechRecognition' in window);
<PromptInput
enableSpeech={isSpeechSupported}
// Fallback: Implement server-side STT (Whisper, Google Speech)
/>
问题 #2:PromptInput 在移动设备上无法自适应
错误:输入框溢出,或在小屏幕上无法正确调整大小 来源:https://github.com/vercel/ai-elements/issues/153 发生原因:缺少响应式最小高度约束 预防:
<PromptInput
className="min-h-[100px] sm:min-h-[60px]" // Add responsive classes
// ... other props
/>
问题 #3:长回复中出现多个 Thinking 元素
错误:出现重复的推理/思考区块,而不是合并为一个区块 来源:https://github.com/vercel/ai-elements/issues/106 发生原因:流式传输会为每个块创建单独的组件 预防:
// Merge reasoning chunks client-side
const processedMessages = messages.map(msg => {
if (msg.annotations?.reasoning) {
// Combine all reasoning into single string
const merged = Array.isArray(msg.annotations.reasoning)
? msg.annotations.reasoning.join('\n\n')
: msg.annotations.reasoning;
return { ...msg, annotations: { ...msg.annotations, reasoning: merged } };
}
return msg;
});
问题 #4:安装后找不到组件
错误:Cannot find module '@/components/ui/ai/message'
来源:常见用户错误
发生原因:AI Elements 尚未初始化,或注册表 URL 错误
预防:
# Verify components.json has correct registry
cat components.json | grep -A5 "ai-elements"
# Re-initialize if missing
pnpm dlx ai-elements@latest init
# Check components directory exists
ls components/ui/ai/
问题 #5:AI SDK v5 的破坏性变更
错误:类型错误、属性未定义或流式传输无法正常工作 来源:https://sdk.vercel.ai/docs/ai-sdk-core/migration 发生原因:v5 相比 v4 存在破坏性的 API 变更 预防:
// ✅ v5 (correct)
const { messages } = useChat(); // Direct messages array
msg.toolInvocations // Tool calls here
// ❌ v4 (incorrect)
const { data } = useChat(); // Wrapped in data object
msg.tool_calls // Different property name
问题 #6:超出最大更新深度
错误:流式传输期间出现 React 错误“Maximum update depth exceeded” 来源:https://github.com/vercel/ai-elements/issues/97 发生原因:不稳定的回调导致无限重新渲染循环 预防:
// Memoize callbacks to prevent re-renders
import { useCallback } from 'react';
const { messages } = useChat({
api: '/api/chat',
onFinish: useCallback((message) => {
console.log('Finished', message);
}, []) // Stable dependency array
});
问题 #7:复制按钮返回 HTML,而不是 Markdown
错误:复制消息时粘贴的是 HTML,而不是纯 Markdown 来源:https://github.com/vercel/ai-elements/issues/180 发生原因:Actions.Copy 默认使用 innerHTML 预防:
// Pass raw markdown content, not rendered HTML
<Actions>
<Actions.Copy content={msg.content} format="markdown" />
</Actions>
问题 #8:Tailwind v4 CSS 变量问题
错误:组件没有样式或颜色显示异常 来源:Tailwind v4 迁移中常见的问题 发生原因:缺少 CSS 变量或 @theme 配置错误 预防:
# Use tailwind-v4-shadcn skill to fix, or manually verify:
# Check src/index.css has:
@import "tailwindcss";
:root {
--background: hsl(0 0% 100%);
--foreground: hsl(0 0% 3.9%);
/* ... other variables */
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
}
配置文件参考
components.json(AI Elements 注册表)
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/index.css",
"baseColor": "zinc",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"registries": {
"shadcn": "https://ui.shadcn.com/registry",
"ai-elements": "https://www.shadcn.io/ai/registry"
}
}
这些设置的原因:
"rsc": false- AI Elements 是客户端组件(与 RSC 不兼容)"tsx": true- 为确保类型安全,需要使用 TypeScript"tailwind.config": ""- Tailwind v4 不使用配置文件registries- 需要同时配置 shadcn 和 AI Elements 注册表
常见模式
模式 1:带操作的基础聊天
'use client';
import { useChat } from 'ai/react';
import { Conversation, Message, MessageContent, Response, Actions } from '@/components/ui/ai';
import { PromptInput } from '@/components/ui/ai/prompt-input';
export default function ChatWithActions() {
const { messages, input, handleInputChange, handleSubmit, reload, stop } = useChat();
return (
<div className="flex h-screen flex-col">
<Conversation className="flex-1">
{messages.map((msg) => (
<Message key={msg.id} role={msg.role}>
<MessageContent>
<Response markdown={msg.content} />
{msg.role === 'assistant' && (
<Actions>
<Actions.Copy content={msg.content} />
<Actions.Regenerate onClick={() => reload()} />
</Actions>
)}
</MessageContent>
</Message>
))}
</Conversation>
<PromptInput
value={input}
onChange={handleInputChange}
onSubmit={handleSubmit}
/>
</div>
);
}
使用场景:每种聊天界面(复制和重新生成是必不可少的用户体验功能)
模式 2:带工具调用的聊天
'use client';
import { useChat } from 'ai/react';
import { Tool } from '@/components/ui/ai/tool';
import { z } from 'zod';
export default function ChatWithTools() {
const { messages } = useChat({
api: '/api/chat',
async onToolCall({ toolCall }) {
if (toolCall.toolName === 'get_weather') {
// Execute tool
return { temperature: 72, conditions: 'Sunny' };
}
}
});
return (
<Conversation>
{messages.map((msg) => (
<Message key={msg.id} role={msg.role}>
<MessageContent>
{msg.content && <Response markdown={msg.content} />}
{/* Render tool invocations */}
{msg.toolInvocations?.map((tool) => (
<Tool
key={tool.toolCallId}
name={tool.toolName}
args={tool.args}
result={tool.result}
status={tool.state} // "pending" | "success" | "error"
/>
))}
</MessageContent>
</Message>
))}
</Conversation>
);
}
使用场景:支持函数调用的 AI 助手(例如带插件的 ChatGPT)
模式 3:带推理展示的聊天
'use client';
import { useChat } from 'ai/react';
import { Reasoning } from '@/components/ui/ai/reasoning';
export default function ChatWithReasoning() {
const { messages, isLoading } = useChat({
api: '/api/chat',
streamProtocol: 'text'
});
return (
<Conversation>
{messages.map((msg, idx) => {
const reasoning = msg.annotations?.reasoning;
const isStreaming = isLoading && idx === messages.length - 1;
return (
<Message key={msg.id} role={msg.role}>
<MessageContent>
{reasoning && (
<Reasoning
content={reasoning}
streaming={isStreaming}
collapsed={!isStreaming} // Collapse after done
/>
)}
<Response markdown={msg.content} />
</MessageContent>
</Message>
);
})}
</Conversation>
);
}
使用场景:Claude 风格的思考、o1 风格的推理、思维链提示词
模式 4:带来源引用的聊天
'use client';
import { useChat } from 'ai/react';
import { Sources, InlineCitation } from '@/components/ui/ai';
export default function ChatWithSources() {
const { messages } = useChat({
api: '/api/chat'
});
return (
<Conversation>
{messages.map((msg) => {
const sources = msg.annotations?.sources || [];
return (
<Message key={msg.id} role={msg.role}>
<MessageContent>
<Response markdown={msg.content} />
{/* Show sources at bottom */}
{sources.length > 0 && (
<Sources
sources={sources}
citations={msg.annotations?.citations || []}
/>
)}
</MessageContent>
</Message>
);
})}
</Conversation>
);
}
使用场景:RAG 应用、Perplexity 风格的搜索、带引用支持的回复
模式 5:带代码块的聊天
'use client';
import { useChat } from 'ai/react';
import { CodeBlock } from '@/components/ui/ai/code-block';
import { Response } from '@/components/ui/ai/response';
export default function ChatWithCode() {
const { messages } = useChat();
return (
<Conversation>
{messages.map((msg) => (
<Message key={msg.id} role={msg.role}>
<MessageContent>
{/* Response component auto-renders code blocks */}
<Response
markdown={msg.content}
components={{
// Optionally override code rendering
code: ({ language, code }) => (
<CodeBlock
language={language}
code={code}
showLineNumbers={true}
/>
)
}}
/>
</MessageContent>
</Message>
))}
</Conversation>
);
}
使用场景:编码助手、技术文档聊天、代码审查
使用捆绑资源
脚本(scripts/)
setup-ai-elements.sh - 完整初始化脚本
#!/bin/bash
# Automated AI Elements setup
# Check prerequisites
echo "Checking prerequisites..."
# Check Next.js
if ! command -v next &> /dev/null; then
echo "❌ Next.js not found. Install: pnpm add next"
exit 1
fi
# Check shadcn/ui
if [ ! -f "components.json" ]; then
echo "❌ shadcn/ui not initialized. Run: pnpm dlx shadcn@latest init"
exit 1
fi
# Check AI SDK
if ! grep -q '"ai"' package.json; then
echo "Installing AI SDK v5..."
pnpm add ai@latest
fi
# Initialize AI Elements
echo "Initializing AI Elements..."
pnpm dlx ai-elements@latest init
# Add core components
echo "Adding core chat components..."
pnpm dlx ai-elements@latest add message message-content conversation response prompt-input actions
echo "✅ AI Elements setup complete!"
echo "Next: Create /app/api/chat/route.ts for API endpoint"
使用示例:
chmod +x scripts/setup-ai-elements.sh
./scripts/setup-ai-elements.sh
参考资料(references/)
references/component-catalog.md- 全部 30 多个组件及其说明的完整列表references/migration-v4-to-v5.md- AI SDK v5 迁移指南,涵盖所有不兼容变更references/common-patterns.md- 10 多种经过生产环境测试的模式
Claude 应在以下情况下加载这些资料:
- 用户询问“有哪些可用组件?”时,加载
component-catalog.md - 遇到 v4 代码或错误时,加载
migration-v4-to-v5.md - 构建特定功能(工具调用、推理等)时,加载
common-patterns.md
资源文件(assets/)
assets/chat-interface-starter.tsx- 完整可用的聊天页面模板assets/api-route-template.ts- 包含所有 AI SDK 功能(工具、推理、流式传输)的 API 路由assets/components.json- 包含 AI Elements 注册表的完整 components.json
使用时机:
- 创建新的聊天页面时,复制
chat-interface-starter.tsx - 设置 API 端点时,复制
api-route-template.ts - 初始化新项目时,复制
components.json
高级主题
使用虚拟化优化性能
对于包含 100 条以上消息的对话,请使用虚拟化:
import { useVirtualizer } from '@tanstack/react-virtual';
import { useRef } from 'react';
function VirtualizedChat({ messages }) {
const parentRef = useRef<HTMLDivElement>(null);
const virtualizer = useVirtualizer({
count: messages.length,
getScrollElement: () => parentRef.current,
estimateSize: () => 150, // Average message height
overscan: 5 // Render 5 extra items for smooth scrolling
});
return (
<div ref={parentRef} className="h-screen overflow-y-auto">
<div style={{ height: `${virtualizer.getTotalSize()}px`, position: 'relative' }}>
{virtualizer.getVirtualItems().map((virtualRow) => (
<div
key={virtualRow.index}
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: `${virtualRow.size}px`,
transform: `translateY(${virtualRow.start}px)`
}}
>
<Message {...messages[virtualRow.index]} />
</div>
))}
</div>
</div>
);
}
使用时机:对话超过 50–100 条消息时(可提升渲染性能)
使用 CSS 变量自定义样式
所有组件都使用 shadcn/ui 的语义颜色:
/* src/index.css - Customize AI message colors */
:root {
/* AI message background */
--ai-message: hsl(var(--muted));
--ai-message-foreground: hsl(var(--muted-foreground));
/* User message background */
--user-message: hsl(var(--primary));
--user-message-foreground: hsl(var(--primary-foreground));
/* Tool call colors */
--tool-success: hsl(142 76% 36%);
--tool-error: hsl(var(--destructive));
--tool-pending: hsl(47 91% 58%);
}
.dark {
--ai-message: hsl(var(--muted));
--ai-message-foreground: hsl(var(--muted-foreground));
/* ... dark mode variants */
}
无障碍最佳实践
AI Elements 组件遵循 WCAG 2.1 AA 标准:
// Add ARIA labels to interactive elements
<PromptInput
aria-label="Chat message input"
aria-describedby="chat-instructions"
/>
<Actions>
<Actions.Copy
aria-label="Copy message to clipboard"
aria-live="polite" // Announce copy success
/>
<Actions.Regenerate
aria-label="Regenerate AI response"
/>
</Actions>
// Screen reader announcements for streaming
<Response
markdown={content}
aria-live="polite" // Announce updates during streaming
aria-atomic="false" // Only announce changes, not entire content
/>
服务端工具执行
如需安全地调用工具,请在服务端执行:
// app/api/chat/route.ts
import { openai } from '@ai-sdk/openai';
import { streamText, tool } from 'ai';
import { z } from 'zod';
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({
model: openai('gpt-4o'),
messages,
tools: {
get_weather: tool({
description: 'Get current weather for a location',
parameters: z.object({
location: z.string().describe('City name'),
unit: z.enum(['celsius', 'fahrenheit']).default('celsius')
}),
execute: async ({ location, unit }) => {
// Execute server-side (secure API keys)
const response = await fetch(`https://api.weather.com/...`);
const data = await response.json();
return { temperature: data.temp, conditions: data.conditions };
}
}),
search_database: tool({
description: 'Search internal database',
parameters: z.object({
query: z.string()
}),
execute: async ({ query }) => {
// Direct database access (server-side only)
const results = await db.search(query);
return results;
}
})
}
});
return result.toDataStreamResponse();
}
优点:
- API 密钥安全(绝不会暴露给客户端)
- 可直接访问数据库
- 速率限制和验证
- 审计日志记录
依赖项
必需:
ai@^5.0.0- 用于流式传输和钩子的 Vercel AI SDKnext@^15.0.0- 带有 App Router 的 Next.jsreact@^19.0.0- 支持并发渲染的 React 19@tailwindcss/vite@^4.0.0- Tailwind CSS v4 Vite 插件
对等依赖项(由 shadcn/ui 安装):
tailwindcss@^4.0.0@radix-ui/react-*(各种 Radix UI 基元)class-variance-authorityclsxtailwind-merge
可选:
@tanstack/react-virtual@^3.0.0- 长对话虚拟化shiki@^1.0.0- 代码语法高亮(Prism 的替代方案)katex@^0.16.0- LaTeX 数学公式渲染react-markdown@^9.0.0- Markdown 渲染(自定义 Response 组件时使用)
官方文档
- AI Elements:https://www.shadcn.io/ai
- Vercel AI SDK:https://sdk.vercel.ai/docs
- shadcn/ui:https://ui.shadcn.com
- Next.js:https://nextjs.org/docs
- Context7 库 ID:
/vercel/ai-elements(如可用) - GitHub 仓库:https://github.com/vercel/ai-elements
软件包版本(已于 2025-11-07 验证)
{
"dependencies": {
"ai": "^5.0.0",
"next": "^15.0.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"@tailwindcss/vite": "^4.1.14"
},
"devDependencies": {
"ai-elements": "1.6.0",
"typescript": "^5.6.0",
"@types/react": "^19.0.0",
"@types/node": "^20.0.0"
}
}
版本说明:
- AI Elements 1.6.0 于 2025-11-07 发布(与本技能同日)
- 需要 AI SDK v5(与 v4 不兼容)
- 并发渲染功能需要 React 19
- 需要 Tailwind v4(与 v3 不兼容)
生产环境示例
本技能基于多个项目中的生产环境使用经验:
令牌效率:
- 不使用技能:约 25,000 个令牌(研究组件、集成模式和调试)
- 使用技能:约 8,000 个令牌(直接使用模板实现)
- 节省:68%
预防的错误:记录在案的 8 个问题(预防率 100%)
- 语音输入的浏览器兼容性
- 响应式设计问题
- 推理块重复
- AI SDK v5 迁移错误
- 组件发现问题
- 重新渲染循环错误
- 复制功能错误
- Tailwind v4 CSS 问题
验证:✅ 已测试全部 30 多个组件;流式传输已验证;工具调用正常;推理显示功能正常
故障排除
问题:语音输入按钮不起作用
解决方案:
// Check browser support
const supported = 'webkitSpeechRecognition' in window;
console.log('Speech supported:', supported); // false in Firefox/Safari
// Use only in supported browsers or implement server-side STT
<PromptInput enableSpeech={supported} />
问题:安装后找不到组件
解决方案:
# Verify installation
ls components/ui/ai/ # Should show components
# Check registry in components.json
cat components.json | grep "ai-elements"
# Re-initialize if needed
pnpm dlx ai-elements@latest init
pnpm dlx ai-elements@latest add message conversation response
问题:流式传输无法正常工作
解决方案:
// API route MUST return toDataStreamResponse()
return result.toDataStreamResponse(); // ✅ Correct
// NOT:
return result.toTextStreamResponse(); // ❌ Wrong format for AI Elements
问题:样式异常或缺少颜色
解决方案:
# Use tailwind-v4-shadcn skill to fix, or verify:
# 1. Check src/index.css has @import "tailwindcss" at top
# 2. Verify CSS variables defined in :root and .dark
# 3. Check @theme inline section exists
# 4. Ensure vite.config.ts has @tailwindcss/vite plugin
完整设置检查清单
使用此检查清单验证你的设置:
- 已安装 Next.js 15+,并启用 App Router
- 已安装 AI SDK v5+(
pnpm add ai@latest) - 已初始化 shadcn/ui(存在
components.json) - 已通过 Vite 插件配置 Tailwind v4
- 已初始化 AI Elements(
pnpm dlx ai-elements@latest init) - 已添加核心组件(message、conversation、response、prompt-input)
- 已创建 API 路由(
/app/api/chat/route.ts) - 已创建聊天页面,并添加
'use client'指令 - 开发服务器运行正常,没有 TypeScript 错误
- 聊天界面正确渲染
- 流式传输正常工作(消息实时显示)
- 流式传输期间自动滚动正常
- 操作(复制/重新生成)正常工作
有疑问?遇到问题?
- 查看
references/common-issues.md以排查问题 - 确认所有前置条件均已满足(Next.js 15+、AI SDK v5+、shadcn/ui)
- 查看官方文档:https://www.shadcn.io/ai
- 确保 Tailwind v4 配置正确(使用
tailwind-v4-shadcnskill)
相关技能
此技能与以下技能搭配使用效果最佳:
- tailwind-v4-shadcn(前置条件)- 搭建 Tailwind v4 + shadcn/ui 基础
- ai-sdk-ui(配套技能)- AI SDK 钩子(
useChat、useCompletion、useAssistant) - ai-sdk-core(可选)- 为 API 路由集成后端 AI SDK
- nextjs(框架)- 设置 Next.js App Router
- clerk-auth(可选)- 为聊天添加用户身份验证
- cloudflare-d1(可选)- 在数据库中存储聊天记录
典型技术栈:
1. nextjs skill → Next.js 15 setup
2. tailwind-v4-shadcn skill → UI foundation
3. ai-sdk-ui skill → AI hooks and state management
4. ai-elements-chatbot skill (this) → UI components
5. clerk-auth skill (optional) → User authentication
最后更新:2025-11-07 技能版本:1.0.0 维护者:Jeremy Dawes | Jezweb | [email protected]