From laguagu-claude-code-nextjs-skills
Generates full-stack AI applications with Next.js, AI SDK, and ai-elements. Use for chatbots, agent dashboards, or custom AI apps.
How this skill is triggered — by the user, by Claude, or both
Slash command
/laguagu-claude-code-nextjs-skills:ai-app [app-type or description][app-type or description]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build full-stack AI applications with Next.js, AI SDK, and ai-elements.
Build full-stack AI applications with Next.js, AI SDK, and ai-elements.
bunx --bun shadcn@latest create --preset "https://ui.shadcn.com/init?base=radix&style=nova&baseColor=neutral&theme=neutral&iconLibrary=lucide&font=geist-sans&menuAccent=subtle&menuColor=default&radius=default" --template next my-ai-app
cd my-ai-app
bun add ai @ai-sdk/react @ai-sdk/anthropic zod
bunx --bun ai-elements@latest
# .env.local - Choose your provider
ANTHROPIC_API_KEY=sk-ant-...
# OPENAI_API_KEY=sk-...
# GOOGLE_GENERATIVE_AI_API_KEY=...
Based on user requirements, generate:
Simple conversational AI with streaming responses.
| Feature | Implementation |
|---|---|
| Chat UI | Conversation + Message + PromptInput |
| API | streamText + toUIMessageStreamResponse |
| Extras | Reasoning, Sources, File attachments |
Multi-agent interface with tool visualization.
| Feature | Implementation |
|---|---|
| Agents | ToolLoopAgent with tools |
| UI | Dashboard layout + Tool components |
| API | createAgentUIStreamResponse |
| Extras | Status monitoring, tool approval |
Mix and match based on user needs:
my-ai-app/
├── app/
│ ├── page.tsx # Main UI
│ ├── layout.tsx # Root layout
│ ├── globals.css # Theme
│ └── api/
│ └── chat/
│ └── route.ts # AI endpoint
├── components/
│ ├── ai-elements/ # AI Elements components
│ ├── ui/ # shadcn/ui components
│ └── chat.tsx # Chat component (if extracted)
├── lib/
│ ├── utils.ts # Utilities
│ └── ai.ts # AI configuration (optional)
├── ai/ # Agent definitions (if needed)
│ └── assistant.ts
└── .env.local # API keys
See references/project-structure.md for details.
// app/api/chat/route.ts
import { streamText, UIMessage, convertToModelMessages } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';
export const maxDuration = 30;
export async function POST(req: Request) {
const { messages }: { messages: UIMessage[] } = await req.json();
const result = streamText({
model: anthropic('claude-sonnet-4-6'),
messages: await convertToModelMessages(messages),
system: 'You are a helpful assistant.',
});
return result.toUIMessageStreamResponse({
sendSources: true,
sendReasoning: true,
});
}
// app/page.tsx
'use client';
import { useChat } from '@ai-sdk/react';
import { DefaultChatTransport } from 'ai';
import {
Conversation,
ConversationContent,
ConversationScrollButton,
} from '@/components/ai-elements/conversation';
import {
Message,
MessageContent,
MessageResponse,
} from '@/components/ai-elements/message';
import {
PromptInput,
PromptInputBody,
PromptInputTextarea,
PromptInputFooter,
PromptInputSubmit,
type PromptInputMessage,
} from '@/components/ai-elements/prompt-input';
import { Loader } from '@/components/ai-elements/loader';
import { useState } from 'react';
export default function ChatPage() {
const [input, setInput] = useState('');
const { messages, sendMessage, status } = useChat({
transport: new DefaultChatTransport({ api: '/api/chat' }),
});
const handleSubmit = (message: PromptInputMessage) => {
if (!message.text.trim()) return;
sendMessage({ text: message.text, files: message.files });
setInput('');
};
return (
<div className="flex h-screen flex-col p-4">
<Conversation className="flex-1">
<ConversationContent>
{messages.map((message) => (
<div key={message.id}>
{message.parts.map((part, i) => {
if (part.type === 'text') {
return (
<Message key={i} from={message.role}>
<MessageContent>
<MessageResponse>{part.text}</MessageResponse>
</MessageContent>
</Message>
);
}
return null;
})}
</div>
))}
{status === 'submitted' && <Loader />}
</ConversationContent>
<ConversationScrollButton />
</Conversation>
<PromptInput onSubmit={handleSubmit} className="mt-4">
<PromptInputBody>
<PromptInputTextarea
value={input}
onChange={(e) => setInput(e.target.value)}
/>
</PromptInputBody>
<PromptInputFooter>
<div />
<PromptInputSubmit status={status} />
</PromptInputFooter>
</PromptInput>
</div>
);
}
For detailed patterns, see:
| Need | Skill | Reference |
|---|---|---|
| Chat UI components | /ai-elements | chatbot.md |
| Next.js patterns | /nextjs-shadcn | architecture.md |
| AI SDK functions | /ai-sdk-6 | core-functions.md |
| Agents & tools | /ai-sdk-6 | agents.md |
| Caching | /cache-components | REFERENCE.md |
| Production patterns | /nextjs-chatbot | DB persistence, HITL approval, consent, feedback, search |
| Code review & cleanup | code-simplifier agent | DRY/KISS/YAGNI validation |
Ask user:
Run scaffolding commands based on requirements.
Create files based on application type:
app/api/chat/route.ts)app/page.tsx).env.localnext.config.ts if neededbun dev
Test the application works correctly.
Always use bun, never npm:
bun add (not npm install)bunx --bun (not npx)bun dev (not npm run dev)npx claudepluginhub laguagu/claude-code-nextjs-skillsBuild AI chat interfaces using pre-built components for conversations, messages, tool displays, and prompt inputs. Works with Next.js, shadcn/ui, and the Vercel AI SDK.
Provides pre-built shadcn-style AI chat components (Message, Conversation, PromptInput, Reasoning, Sources, Tool, Artifact, CodeBlock, Branch, Suggestions, Task, Image, ChainOfThought, InlineCitation, WebPreview) for Next.js + AI SDK apps. Install via CLI.
Provides expert guidance on Vercel AI SDK for building AI features like chat interfaces, text generation, structured output, tool calling, agents, streaming, embeddings, reranking, image generation, and LLM providers.