agent-elements
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAgent Elements skill
Agent Elements技能
Project-aware context for building chat and agent UIs with Agent Elements —
an open-source shadcn registry at .
https://agent-elements.21st.dev这是为使用Agent Elements构建聊天和Agent UI提供的项目感知上下文——Agent Elements是一个开源的shadcn注册表,地址为。
https://agent-elements.21st.devWhat this skill gives you
该技能能为你带来什么
When this skill loads, you know:
- The registry is shadcn-compatible. Every component is installed with
. Files land under
npx shadcn@latest add https://agent-elements.21st.dev/r/<component>.json(the library's internalcomponents/agent-elements/prefix is stripped — see Paths below).components/ - The API is typed around the Vercel AI SDK. Messages are
from
UIMessage[], status isai.ChatStatusplugs in directly.useChat() - The full component catalog with API shapes and composition rules (see sections below).
- Theming guardrails — the Tailwind tokens Agent Elements depends on.
加载此技能后,你将了解:
- 注册表兼容shadcn:每个组件都可通过安装。 文件会被放置在
npx shadcn@latest add https://agent-elements.21st.dev/r/<component>.json目录下(库内部的components/agent-elements/前缀会被移除——见下方路径说明)。components/ - API围绕Vercel AI SDK进行类型定义:消息为包中的
ai,状态为UIMessage[]。ChatStatus可直接接入。useChat() - 完整的组件目录及API结构与组合规则(见下方章节)。
- 主题约束——Agent Elements依赖的Tailwind令牌。
Detection
检测条件
Consider this project "Agent Elements-ready" if any of these are true:
- exists on disk
components/agent-elements/ - includes an alias or registry reference to Agent Elements
components.json - dependencies include
package.json+aiand the user mentions Agent Elements@tabler/icons-react
If the folder does not exist yet, install on demand with:
bash
npx shadcn@latest add https://agent-elements.21st.dev/r/agent-chat.jsonagent-chatregistryDependencies如果满足以下任一条件,则认为该项目“已准备好使用Agent Elements”:
- 磁盘上存在目录
components/agent-elements/ - 包含指向Agent Elements的别名或注册表引用
components.json - 的依赖项包含
package.json+ai,且用户提及了Agent Elements@tabler/icons-react
如果该目录尚未存在,可通过以下命令按需安装:
bash
npx shadcn@latest add https://agent-elements.21st.dev/r/agent-chat.jsonagent-chatregistryDependenciesPaths (post-install layout)
安装后的路径结构
After , files sit under with this
shape:
shadcn 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.tsImport rule: always import from the exact file, never from a barrel.
tsx
// ✅
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";执行后,文件会被放置在目录下,结构如下:
shadcn 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导入规则:始终从具体文件导入,切勿从桶文件导入。
tsx
// ✅ 正确写法
import { AgentChat } from "@/components/agent-elements/agent-chat";
import { BashTool } from "@/components/agent-elements/tools/bash-tool";
// ❌ 错误写法——不存在桶文件
import { AgentChat } from "@/components/agent-elements";Component catalog
组件目录
Chat surface
聊天界面
- AgentChat — the full chat shell. Renders +
MessageList, handles tool invocations viaInputBar, shows an empty state with optionaltoolRenderers. Props:suggestions,messages,status,onSend,onStop,toolRenderers?,suggestions?,attachments?,classNames?.slots? - MessageList — transcript only. Use when you need the input bar somewhere
else. Accepts and
toolRenderers.showCopyToolbar - UserMessage / ErrorMessage / Markdown — low-level message pieces.
streams safely (external links get
Markdownby default).rel="noreferrer"
- AgentChat — 完整的聊天外壳。渲染+
MessageList, 通过InputBar处理工具调用,显示带可选toolRenderers的空状态。属性:suggestions、messages、status、onSend、onStop、toolRenderers?、suggestions?、attachments?、classNames?。slots? - MessageList — 仅显示对话记录。当你需要将输入栏放在其他位置时使用。支持和
toolRenderers属性。showCopyToolbar - UserMessage / ErrorMessage / Markdown — 底层消息组件。
支持流式渲染(默认会为外部链接添加
Markdown)。rel="noreferrer"
Input
输入组件
- InputBar — composer. Props: ,
status,onSend({ content }),onStop+value?(controlled),onChange?/attachedImageswith their remove handlers,attachedFiles/leftActionsslots,rightActions,suggestions?,questionBar?.infoBar? - Suggestions — quick-prompt chips for the empty state or inline.
- ModelPicker / ModeSelector — designed to drop into . Both accept a simple
leftActions/{ id, name, version? }shape. Do not import{ id, label, icon?, description? }— it was removed; supply your own array.CLAUDE_MODELS - SendButton / AttachmentButton / FileAttachment — usable standalone if you're building a custom composer.
- InputBar — 消息编辑器。属性:、
status、onSend({ content })、onStop+value?(受控模式)、带移除处理函数的onChange?/attachedImages、attachedFiles/leftActions插槽、rightActions、suggestions?、questionBar?。infoBar? - Suggestions — 空状态或内嵌的快捷提示芯片。
- ModelPicker / ModeSelector — 设计用于嵌入插槽。两者都接受简单的
leftActions/{ id, name, version? }结构。请勿导入{ id, label, icon?, description? }——该内容已被移除;请自行提供数组。CLAUDE_MODELS - SendButton / AttachmentButton / FileAttachment — 如果你正在构建自定义编辑器,这些组件可单独使用。
Tool cards
工具卡片
All tool cards accept a prop of type
tool-<Name>` }>toolRenderersAgentChatMessageList`:
partExtract<UIMessage["parts"][number], { type: \from the AI SDK. Register them viaon/tsx
<AgentChat
toolRenderers={{
Bash: BashTool,
Edit: EditTool,
Write: EditTool, // Write reuses EditTool
Search: SearchTool,
WebSearch: SearchTool,
TodoWrite: TodoTool,
PlanWrite: PlanTool,
Task: SubagentTool,
Thinking: ThinkingTool,
}}
/>Cards available:
- BashTool — command + stdout, collapsible.
- EditTool — diff card. Supports /
input.old_stringorinput.new_string, plus an approval footer viaoutput.structuredPatch.input.approval - SearchTool — grouped search results. Pass or use
results.output.results - TodoTool — diffed todo list from vs
input.todos.output.oldTodos - PlanTool — plan title + summary with approve/reject footer.
- ToolGroup — collapses consecutive tool calls into one row.
- SubagentTool — sub-agent task with nested tools.
- McpTool — generic MCP tool output; use from
parseMcpToolTypeto get@/components/agent-elements/tools/tool-registry.mcpInfo - ThinkingTool — collapsible reasoning row.
- GenericTool — fallback for unknown tools.
- QuestionTool — clarifying question with single/multi/text answer kinds.
所有工具卡片都接受一个属性,类型为AI SDK中的tool-<Name>` }>AgentChatMessageListtoolRenderers`来使用它们:
partExtract<UIMessage["parts"][number], { type: \。 通过在/上注册tsx
<AgentChat
toolRenderers={{
Bash: BashTool,
Edit: EditTool,
Write: EditTool, // Write复用EditTool
Search: SearchTool,
WebSearch: SearchTool,
TodoWrite: TodoTool,
PlanWrite: PlanTool,
Task: SubagentTool,
Thinking: ThinkingTool,
}}
/>可用的卡片:
- BashTool — 命令+标准输出,可折叠。
- EditTool — 差异卡片。支持/
input.old_string或input.new_string,并可通过output.structuredPatch添加审批页脚。input.approval - SearchTool — 分组显示搜索结果。可传入或使用
results。output.results - TodoTool — 基于与
input.todos生成的差异待办列表。output.oldTodos - PlanTool — 计划标题+摘要,带批准/拒绝页脚。
- ToolGroup — 将连续的工具调用折叠为一行。
- SubagentTool — 包含嵌套工具的子Agent任务。
- McpTool — 通用MCP工具输出;可使用中的
@/components/agent-elements/tools/tool-registry获取parseMcpToolType。mcpInfo - ThinkingTool — 可折叠的推理行。
- GenericTool — 未知工具的回退组件。
- QuestionTool — 带单选/多选/文本回答类型的澄清问题组件。
Streaming states
流式状态组件
- TextShimmer — shimmering status label.
- SpiralLoader — Lottie spiral; use for multi-second loading states.
- TextShimmer — 闪烁的状态标签。
- SpiralLoader — Lottie螺旋加载器;适用于多秒级的加载状态。
Composition patterns
组合模式
Full chat with tool rendering (most common)
带工具渲染的完整聊天界面(最常用)
tsx
"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,
}}
/>
);
}tsx
"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,
}}
/>
);
}Composer with mode + model pickers
带模式选择器和模型选择器的编辑器
tsx
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" />
</>
}
/>tsx
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" />
</>
}
/>Custom tool renderer
自定义工具渲染器
toolRenderers{ part, chatStatus }GenericTooltoolRenderers{ part, chatStatus }GenericToolTheming
主题设置
Agent Elements reads these Tailwind CSS vars (shadcn-style). Do not remove or
rename them in the consumer theme:
- ,
--an-foreground,--an-background--an-primary-color - Standard shadcn tokens: ,
--background,--foreground,--border,--muted,--muted-foreground,--accent, etc.--primary
Customising a component is just editing the installed file. Prefer that over
wrapping — the code is yours now.
Agent Elements会读取这些Tailwind CSS变量(shadcn风格)。请勿在消费者主题中删除或重命名它们:
- ,
--an-foreground,--an-background--an-primary-color - 标准shadcn令牌:,
--background,--foreground,--border,--muted,--muted-foreground,--accent等。--primary
自定义组件只需编辑已安装的文件。优先选择直接编辑而非包装——代码现在归你所有。
When NOT to use Agent Elements
请勿使用Agent Elements的场景
- Projects using ,
assistant-ui,ai-elements, or another kit — don't mix.copilotkit - Pure chat UIs that never render tool calls or plans — + your own message rendering may be enough; skip
InputBar.AgentChat - React < 19 or Tailwind < v4 — the components depend on both.
- 使用、
assistant-ui、ai-elements或其他套件的项目——不要混合使用。copilotkit - 从不渲染工具调用或计划的纯聊天UI——+ 你自己的消息渲染可能已足够;无需使用
InputBar。AgentChat - React版本低于19或Tailwind版本低于v4——组件依赖这两者。
Quick answers for common asks
常见问题快速解答
- "Add Agent Elements to this project" → run if
npx shadcn@latest initis missing, thencomponents.json.npx shadcn@latest add https://agent-elements.21st.dev/r/agent-chat.json - "Switch the default SendButton look" → edit
directly. Tokens live on
components/agent-elements/input/send-button.tsxCSS vars.--an-* - "Render a custom tool" → map its type in ; fall back to
toolRenderersfor unknown tools.GenericTool - "Use with useChat" → pass and
messagesstraight through, translatestatus/sendMessagetostop/onSend({ content }).onStop
- “将Agent Elements添加到此项目” → 如果缺少,先运行
components.json,然后 运行npx shadcn@latest init。npx shadcn@latest add https://agent-elements.21st.dev/r/agent-chat.json - “修改默认SendButton样式” → 直接编辑。令牌存储在
components/agent-elements/input/send-button.tsxCSS变量中。--an-* - “渲染自定义工具” → 在中映射其类型;对于未知工具,回退到
toolRenderers。GenericTool - “与useChat配合使用” → 直接传入和
messages,将status/sendMessage转换为stop/onSend({ content })。onStop
Registry reference
注册表参考
- Index:
https://agent-elements.21st.dev/r/index.json - Per-component:
https://agent-elements.21st.dev/r/<id>.json - Full docs in one file:
https://agent-elements.21st.dev/llms-full.txt
- 索引:
https://agent-elements.21st.dev/r/index.json - 单个组件:
https://agent-elements.21st.dev/r/<id>.json - 完整文档单文件版:
https://agent-elements.21st.dev/llms-full.txt