Loading...
Loading...
Use whenever the user wants to build or modify a chat, agent, or tool-calling UI in a React 19 + Tailwind v4 project — especially if the code imports from `@/components/agent-elements/*` or the project has that folder on disk. Triggers: "agent chat", "tool call UI", "streaming chat", "plan approval", "AgentChat", "InputBar", "tool renderer", mentions of Agent Elements, or requests to add a new agent surface with shadcn. Do NOT use for plain chat UIs that don't need tool/plan/approval cards, or for projects already committed to a different agent UI kit.
npx skill4agent add 21st-dev/agent-elements agent-elementshttps://agent-elements.21st.devnpx shadcn@latest add https://agent-elements.21st.dev/r/<component>.jsoncomponents/agent-elements/components/UIMessage[]aiChatStatususeChat()components/agent-elements/components.jsonpackage.jsonai@tabler/icons-reactnpx shadcn@latest add https://agent-elements.21st.dev/r/agent-chat.jsonagent-chatregistryDependenciesshadcn add@/components/agent-elements/components/agent-elements/
agent-chat.tsx
message-list.tsx
input-bar.tsx
markdown.tsx
user-message.tsx
error-message.tsx
text-shimmer.tsx
spiral-loader.tsx
input/
attachment-button.tsx
send-button.tsx
file-attachment.tsx
suggestions.tsx
model-picker.tsx
mode-selector.tsx
tools/
bash-tool.tsx
edit-tool.tsx
search-tool.tsx
todo-tool.tsx
plan-tool.tsx
tool-group.tsx
subagent-tool.tsx
mcp-tool.tsx
thinking-tool.tsx
generic-tool.tsx
question/
question-tool.tsx
hooks/use-tool-complete.ts
utils/cn.ts
types.ts// ✅
import { AgentChat } from "@/components/agent-elements/agent-chat";
import { BashTool } from "@/components/agent-elements/tools/bash-tool";
// ❌ — no barrel exists
import { AgentChat } from "@/components/agent-elements";MessageListInputBartoolRendererssuggestionsmessagesstatusonSendonStoptoolRenderers?suggestions?attachments?classNames?slots?toolRenderersshowCopyToolbarMarkdownrel="noreferrer"statusonSend({ content })onStopvalue?onChange?attachedImagesattachedFilesleftActionsrightActionssuggestions?questionBar?infoBar?leftActions{ id, name, version? }{ id, label, icon?, description? }CLAUDE_MODELSpartExtract<UIMessage["parts"][number], { type: \from the AI SDK. Register them viaon/<AgentChat
toolRenderers={{
Bash: BashTool,
Edit: EditTool,
Write: EditTool, // Write reuses EditTool
Search: SearchTool,
WebSearch: SearchTool,
TodoWrite: TodoTool,
PlanWrite: PlanTool,
Task: SubagentTool,
Thinking: ThinkingTool,
}}
/>input.old_stringinput.new_stringoutput.structuredPatchinput.approvalresultsoutput.resultsinput.todosoutput.oldTodosparseMcpToolType@/components/agent-elements/tools/tool-registrymcpInfo"use client";
import { AgentChat } from "@/components/agent-elements/agent-chat";
import { BashTool } from "@/components/agent-elements/tools/bash-tool";
import { EditTool } from "@/components/agent-elements/tools/edit-tool";
import { SearchTool } from "@/components/agent-elements/tools/search-tool";
import { useChat } from "@ai-sdk/react";
export default function Chat() {
const { messages, status, sendMessage, stop } = useChat();
return (
<AgentChat
messages={messages}
status={status}
onSend={({ content }) => sendMessage({ text: content })}
onStop={stop}
toolRenderers={{
Bash: BashTool,
Edit: EditTool,
Write: EditTool,
Search: SearchTool,
}}
/>
);
}import { InputBar } from "@/components/agent-elements/input-bar";
import { ModeSelector } from "@/components/agent-elements/input/mode-selector";
import { ModelPicker } from "@/components/agent-elements/input/model-picker";
import { IconBulb, IconCursor } from "@tabler/icons-react";
const modes = [
{ id: "agent", label: "Agent", icon: IconCursor },
{ id: "plan", label: "Plan", icon: IconBulb },
];
const models = [
{ id: "sonnet", name: "Sonnet", version: "4.6" },
{ id: "opus", name: "Opus", version: "4.7" },
];
<InputBar
status="ready"
onSend={handleSend}
onStop={handleStop}
leftActions={
<>
<ModeSelector modes={modes} defaultValue="agent" />
<ModelPicker models={models} defaultValue="sonnet" />
</>
}
/>toolRenderers{ part, chatStatus }GenericTool--an-foreground--an-background--an-primary-color--background--foreground--border--muted--muted-foreground--accent--primaryassistant-uiai-elementscopilotkitInputBarAgentChatnpx shadcn@latest initcomponents.jsonnpx shadcn@latest add https://agent-elements.21st.dev/r/agent-chat.jsoncomponents/agent-elements/input/send-button.tsx--an-*toolRenderersGenericToolmessagesstatussendMessagestoponSend({ content })onStophttps://agent-elements.21st.dev/r/index.jsonhttps://agent-elements.21st.dev/r/<id>.jsonhttps://agent-elements.21st.dev/llms-full.txt