ai-elements

AI Elements component library for AI-native applications. Use when building chatbots, AI workflows, or integrating with Vercel AI SDK's useChat hook.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "ai-elements" with this command: npx skills add laguagu/claude-code-nextjs-skills/laguagu-claude-code-nextjs-skills-ai-elements

AI Elements

Build AI-native applications with pre-built components on shadcn/ui.

Quick Start

# Install all AI Elements components
bunx --bun ai-elements@latest
# or via shadcn CLI
bunx --bun shadcn@latest add @ai-elements/all

# Install AI SDK dependencies
bun add ai @ai-sdk/react zod

Components install to @/components/ai-elements/.

Component Quick Reference

Chatbot Components

ComponentPurpose
ConversationAuto-scroll chat container
MessageSingle message wrapper (user/assistant)
MessageResponseStreaming markdown renderer (uses streamdown)
PromptInputRich input with attachments, model picker
ReasoningCollapsible thinking display
SourcesCitation/reference display
ToolTool execution visualization
ChainOfThoughtStep-by-step breakdown
InlineCitationInline citation badge with hover card carousel
PlanCollapsible plan card with streaming title
TaskCollapsible task breakdown display
QueueTodo/message queue with sections

Workflow Components

ComponentPurpose
CanvasReact Flow wrapper for visual workflows
NodeWorkflow node with header/content/footer
EdgeAnimated/temporary edge connections
ControlsZoom/fit view controls
PanelPositioned overlay panels
ContextToken usage tracking display

Utility Components

ComponentPurpose
CodeBlockSyntax highlighted code (Shiki)
LoaderLoading indicator
ShimmerStreaming text effect
ConfirmationTool confirmation dialog
SuggestionQuick action chips
ModelSelectorModel picker dialog with provider logos
OpenInOpen query in external chat (ChatGPT, Claude, etc.)
WebPreviewIframe preview with URL bar and console

Core Integration Pattern

'use client';
import { useChat } from '@ai-sdk/react';
import { Conversation, ConversationContent } from '@/components/ai-elements/conversation';
import { Message, MessageContent, MessageResponse } from '@/components/ai-elements/message';
import { Reasoning, ReasoningTrigger, ReasoningContent } from '@/components/ai-elements/reasoning';
import { Sources, SourcesTrigger, SourcesContent, Source } from '@/components/ai-elements/sources';

export function Chat() {
  const { messages, sendMessage, status } = useChat();

  return (
    <Conversation>
      <ConversationContent>
        {messages.map((message) => (
          <div key={message.id}>
            {message.parts.map((part, i) => {
              switch (part.type) {
                case 'text':
                  return (
                    <Message key={i} from={message.role}>
                      <MessageContent>
                        <MessageResponse>{part.text}</MessageResponse>
                      </MessageContent>
                    </Message>
                  );
                case 'reasoning':
                  return (
                    <Reasoning key={i} isStreaming={status === 'streaming'}>
                      <ReasoningTrigger />
                      <ReasoningContent>{part.text}</ReasoningContent>
                    </Reasoning>
                  );
                case 'source-url':
                  return <Source key={i} href={part.url} title={part.title} />;
              }
            })}
          </div>
        ))}
      </ConversationContent>
    </Conversation>
  );
}

API Route Pattern

// app/api/chat/route.ts
import { streamText, UIMessage, convertToModelMessages } from 'ai';

export const maxDuration = 30;

export async function POST(req: Request) {
  const { messages, model }: { messages: UIMessage[]; model: string } = await req.json();

  const result = streamText({
    model,
    messages: convertToModelMessages(messages),
    system: 'You are a helpful assistant.',
  });

  return result.toUIMessageStreamResponse({
    sendSources: true,
    sendReasoning: true,
  });
}

Key Patterns

Message Parts Switching

Messages have parts array. Switch on part.type:

  • text - Regular text content
  • reasoning - Model thinking/reasoning
  • source-url - Citation with URL
  • tool-* - Tool invocations (input, output, error)

Compound Components

Most components use compound pattern:

<Conversation>
  <ConversationContent>{/* messages */}</ConversationContent>
  <ConversationScrollButton />
</Conversation>

<Message from="assistant">
  <MessageContent>
    <MessageResponse>{text}</MessageResponse>
  </MessageContent>
  <MessageActions>
    <MessageAction label="Copy"><CopyIcon /></MessageAction>
  </MessageActions>
</Message>

File Attachments

<PromptInput onSubmit={handleSubmit} globalDrop multiple>
  <PromptInputHeader>
    <PromptInputAttachments>
      {(attachment) => <PromptInputAttachment data={attachment} />}
    </PromptInputAttachments>
  </PromptInputHeader>
  <PromptInputBody>
    <PromptInputTextarea />
  </PromptInputBody>
  <PromptInputFooter>
    <PromptInputTools>
      <PromptInputActionMenu>
        <PromptInputActionMenuTrigger />
        <PromptInputActionMenuContent>
          <PromptInputActionAddAttachments />
        </PromptInputActionMenuContent>
      </PromptInputActionMenu>
    </PromptInputTools>
    <PromptInputSubmit status={status} />
  </PromptInputFooter>
</PromptInput>

References

Dependencies

Key dependencies used by AI Elements:

PackagePurpose
streamdownStreaming markdown renderer for MessageResponse and Reasoning
shikiSyntax highlighting for CodeBlock
use-stick-to-bottomAuto-scroll behavior for Conversation
motionAnimations for Shimmer
tokenlensToken cost calculation for Context

Package Manager

Always use bun, never npm:

  • bun add (not npm install)
  • bunx --bun (not npx)

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

nextjs-seo

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

nextjs-shadcn

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

openai-agents-sdk

No summary provided by upstream source.

Repository SourceNeeds Review