ai-elements-chatbot について
Next.js App Routerプロジェクト向けのAIチャットUIコンポーネントを扱うスキルです。CLIで編集可能なコンポーネントのソースをプロジェクトに追加し、メッセージやストリーミング表示、ツール呼び出しに対応します。
主な機能
- 01メッセージと会話コンテナ
- 02ストリーミングMarkdown表示
- 03自動サイズ調整プロンプト入力
- 04ツール呼び出しと推論の表示
- 05引用とコードブロックのコンポーネント
活用シーン
- 01AIチャット画面の構築
- 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 の上に構築されているため、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のレジストリ 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 レジストリで
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:ツールバー付きの自動リサイズ textareaactions:コピー/再生成/編集ボタン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/Web サイトを生成する場合(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()フック経由で更新を自動的に受け取ります
ステップ 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 レジストリがある - TypeScript エラーがない
- チャットインターフェイスが表示される
- ストリーミングが動作する(メッセージを入力 → 応答を受け取る)
- ストリーミング中に自動スクロールが動作する
重要なルール
必ず行うこと
✅ AI Elements より先に shadcn/ui を初期化する — 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 では動作しません)
✅ 連続する reasoning ブロックを結合する — 長い応答で重複が発生するのを防ぎます
やってはいけないこと
❌ AI Elements を npm パッケージとしてインストールする - コンポーネントをコピーする CLI ツールです
❌ AI SDK v4 と併用する - 型エラーやデータ形式の問題が発生します
❌ 'use client' ディレクティブを忘れる - コンポーネントは React フックを使用します(クライアント専用)
❌ ほかのコンポーネントライブラリと混在させる - 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 発生理由:レスポンシブ対応の min-height 制約がありません 防止策:
<PromptInput
className="min-h-[100px] sm:min-h-[60px]" // Add responsive classes
// ... other props
/>
問題 #3:長い応答で複数の Thinking 要素が表示される
エラー:推論/思考ブロックが 1 つに統合されず、重複して表示される 出典: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:コピー ボタンで Markdown ではなく HTML が返される
エラー:メッセージをコピーすると、プレーンな Markdown ではなく HTML が貼り付けられる 出典: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>
);
}
使用場面:あらゆるチャットインターフェース(コピーと再生成は不可欠な UX です)
パターン 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
セットアップ完了チェックリスト
このチェックリストを使って、セットアップを確認してください。
- App Router を使用して Next.js 15+ をインストール済み
- 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-shadcnスキルを使用)
関連スキル
このスキルは、以下と組み合わせると最も効果的です。
- 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]