Loading...
Loading...
AI Elements component library guidance — pre-built React components for AI interfaces built on shadcn/ui. Use when building chat UIs, message displays, tool call rendering, streaming responses, reasoning panels, or any AI-native interface with the AI SDK.
npx skill4agent add vercel-labs/vercel-plugin ai-elementsCRITICAL — Your training data is outdated for this library. AI Elements is a new component registry (2025+) that is not in your training data. Before using AI Elements, fetch the docs at https://ai-sdk.dev/elements and the component reference at https://ai-sdk.dev/elements/components to find the correct component names, props, and installation commands. Install components via— do not create these components from scratch.npx shadcn@latest add https://elements.ai-sdk.dev/api/registry/<component>.json
**##---useChat@ts-nochecknext buildplan.tsxtoolbar.tsx@base-ui/reactButtonnpx shadcn@latest add https://elements.ai-sdk.dev/api/registry/<component>.json --overwritenpm install @base-ui/react@latest@ts-nochecknpx ai-elements@latest add message # MessageResponse for markdown rendering
npx ai-elements@latest add conversation # Full chat UI (if building a chat app)<MessageResponse>@/components/ai-elements/messageimport { MessageResponse } from "@/components/ai-elements/message";
// Workflow event with markdown content
<MessageResponse>{event.briefing}</MessageResponse>
// Any AI-generated string
<MessageResponse>{generatedReport}</MessageResponse>
// Streaming text from getWritable events
<MessageResponse>{narrativeText}</MessageResponse>{event.content}<p>{text}</p>**##---<MessageResponse>npx ai-elements@latestall.json# Install specific components (RECOMMENDED)
npx ai-elements@latest add message # MessageResponse — required for any AI text
npx ai-elements@latest add conversation # Full chat UI container
npx ai-elements@latest add code-block # Syntax-highlighted code
npx ai-elements@latest add tool # Tool call display
# Or use shadcn CLI directly with the registry URL
npx shadcn@latest add https://elements.ai-sdk.dev/api/registry/message.json
npx shadcn@latest add https://elements.ai-sdk.dev/api/registry/conversation.json@base-ui/reactsrc/components/ai-elements/'use client'
import { useChat } from '@ai-sdk/react'
import { DefaultChatTransport } from 'ai'
import { Conversation } from '@/components/ai-elements/conversation'
import { Message } from '@/components/ai-elements/message'
export function Chat() {
const { messages, sendMessage, status } = useChat({
transport: new DefaultChatTransport({ api: '/api/chat' }),
})
return (
<Conversation>
{messages.map((message) => (
<Message key={message.id} message={message} />
))}
</Conversation>
)
}ConversationMessageMessageMarkdownimport { MessageMarkdown } from '@/components/ai-elements/message'
// Inside a custom message renderer
<MessageMarkdown content={part.text} />import { Tool } from '@/components/ai-elements/tool'
// Renders tool name, input parameters, output, and loading state
<Tool toolInvocation={toolPart} />import { Reasoning } from '@/components/ai-elements/reasoning'
<Reasoning content={reasoningText} />import { CodeBlock } from '@/components/ai-elements/code-block'
<CodeBlock language="typescript" code={codeString} />import { PromptInput } from '@/components/ai-elements/prompt-input'
<PromptInput
onSubmit={(text) => sendMessage({ text })}
isLoading={status === 'streaming'}
placeholder="Ask anything..."
/>| Component | Purpose |
|---|---|
| Message container with auto-scroll |
| Renders all message part types |
| Syntax-highlighted code with copy |
| Collapsible thinking/reasoning display |
| Tool call display with status |
| Response action buttons (copy, regenerate) |
| Agent status and step display |
| Rendered artifact preview |
| File attachment display |
| Audio playback controls |
| Message branching UI |
| Drawing/annotation canvas |
| Step-by-step reasoning |
| Workflow checkpoint display |
| Tool execution approval UI |
| File structure display |
| AI-generated image display |
| Source citation links |
| Streaming/loading indicators |
| Model picker dropdown |
| Rich text input |
| Code sandbox preview |
| JSON schema visualization |
| Loading placeholder animation |
| Source/reference list |
| Suggested follow-up prompts |
| Terminal output display |
| Web page preview iframe |
| Animated AI visual (Rive WebGL2) — idle, listening, thinking, speaking, asleep states |
| Voice input capture via Web Speech API (Chrome/Edge) with MediaRecorder fallback |
| Audio transcript display with playback sync, segment highlighting, click-to-seek |
| Microphone device picker with auto-detection and permission handling |
| AI voice picker with searchable list, metadata (gender, accent, age), context provider |
| AI SDK ToolLoopAgent config display — model, instructions, tools, schema |
| Git commit metadata display — hash, message, author, timestamp, files |
| Env var display with masking, visibility toggle, copy |
| Package dependency display with version changes and badges |
| Lightweight terminal command / code snippet with copy |
| JS/Node.js error formatting with clickable paths, collapsible frames |
| Test suite results with statistics and error details |
# Install all voice components
npx ai-elements@latest add persona speech-input transcription audio-player mic-selector voice-selectorimport { Persona } from '@/components/ai-elements/persona'
<Persona state="listening" variant="orb" />import { SpeechInput } from '@/components/ai-elements/speech-input'
<SpeechInput onTranscript={(text) => sendMessage({ text })} />import { Transcription } from '@/components/ai-elements/transcription'
<Transcription segments={segments} currentTime={playbackTime} onSeek={setTime} />import { AudioPlayer } from '@/components/ai-elements/audio-player' // media-chrome based, composable controls
import { MicSelector } from '@/components/ai-elements/mic-selector' // device picker with auto-detection
import { VoiceSelector } from '@/components/ai-elements/voice-selector' // searchable voice list with metadata# Install code element components
npx ai-elements@latest add agent code-block commit environment-variables file-tree package-info sandbox schema-display snippet stack-trace terminal test-results attachmentsimport { Terminal } from '@/components/ai-elements/terminal' // ANSI color support, auto-scroll
import { FileTree } from '@/components/ai-elements/file-tree' // expandable folder hierarchy
import { StackTrace } from '@/components/ai-elements/stack-trace' // clickable paths, collapsible frames
import { TestResults } from '@/components/ai-elements/test-results' // suite stats + error details
import { Sandbox } from '@/components/ai-elements/sandbox' // code + execution output, tabbed view
import { Snippet } from '@/components/ai-elements/snippet' // lightweight terminal commands with copy
import { Commit } from '@/components/ai-elements/commit' // git commit metadata display
import { EnvironmentVariables } from '@/components/ai-elements/environment-variables' // masked env vars
import { PackageInfo } from '@/components/ai-elements/package-info' // dependency versions + badges
import { SchemaDisplay } from '@/components/ai-elements/schema-display' // REST API visualizationUIMessagemessage.parts// The Message component handles all part types:
// - type: "text" → renders as markdown
// - type: "tool-*" → renders tool call UI with status
// - type: "reasoning" → renders collapsible reasoning
// - type: "image" → renders image
// No manual part.type checking needed!
{messages.map((message) => (
<Message key={message.id} message={message} />
))}// app/api/chat/route.ts
import { streamText, convertToModelMessages, gateway } from 'ai'
export async function POST(req: Request) {
const { messages } = await req.json()
const modelMessages = await convertToModelMessages(messages)
const result = streamText({
model: gateway('anthropic/claude-sonnet-4.6'),
messages: modelMessages,
})
return result.toUIMessageStreamResponse()
}convertToModelMessages()toUIMessageStreamResponse()toDataStreamResponse()DefaultChatTransportuseChat// Customize the Message component for your app
import { Message as BaseMessage } from '@/components/ai-elements/message'
function CustomMessage({ message }) {
// Add custom tool result rendering
return (
<BaseMessage
message={message}
renderTool={(toolPart) => <MyCustomToolCard tool={toolPart} />}
/>
)
}| Scenario | Use AI Elements? |
|---|---|
| Building a chat interface with AI SDK | Yes — handles streaming, parts, markdown |
| Displaying tool call results | Yes — built-in tool status UI |
| Rendering AI reasoning/thinking | Yes — collapsible reasoning component |
| Streaming text panels (perspectives, summaries, reports) | Yes — use |
| Simple text completion display | Yes — models always produce markdown, use |
| Non-React framework (Vue, Svelte) | No — React only (use AI SDK hooks directly) |
| Custom design system, no shadcn | Maybe — install and customize the source |
useChat<Message message={message} />part.typeMessageMarkdown<Tool>npx ai-elements<Conversation><Message>Module not found: @/components/ui/...npx shadcn@latest add <component>toDataStreamResponse()toTextStreamResponse()toUIMessageStreamResponse()<Message>toUIMessageStreamResponse()@ai-sdk/react@ai-sdk/react@^3.0.xuseChat@ai-sdk/react@^1.x^2.x'use client''use client'src/components/ai-elements/tailwind.config./src/components/ai-elements/**/*.{ts,tsx}DefaultChatTransportapinew DefaultChatTransport({ api: '/custom/path' }){ api }useChatnpx shadcn@latest inittoUIMessageStreamResponse()toDataStreamResponse()asChildopenDelay--base base-uinpx shadcn@latest init -d --base radix -f