ワンクリックで
x-card
当需要用 @ant-design/x-card 让 AI Agent 动态渲染富交互 UI 时使用——涵盖 XCard.Box、XCard.Card、A2UI v0.9 命令、数据绑定、Catalog、Actions 和流式渲染模式。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
当需要用 @ant-design/x-card 让 AI Agent 动态渲染富交互 UI 时使用——涵盖 XCard.Box、XCard.Card、A2UI v0.9 命令、数据绑定、Catalog、Actions 和流式渲染模式。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
Focus on explaining how to use the useXChat Hook, including custom Provider integration, message management, error handling, multi-conversation management, and more
Use when building AI-driven UIs with @ant-design/x-card — covers XCard.Box, XCard.Card, A2UI v0.9 commands, data binding, catalogs, actions, and streaming patterns.
Focus on implementing custom Chat Provider, helping to adapt any streaming interface to Ant Design X standard format
Use when building AI chat UIs with @ant-design/x components — covers Bubble, Sender, Conversations, Prompts, ThoughtChain, Actions, Welcome, Attachments, Sources, Suggestion, Think, FileCard, CodeHighlighter, Mermaid, Folder, XProvider, and Notification.
Use when building or reviewing Markdown rendering with @ant-design/x-markdown, including streaming Markdown, custom component mapping, plugins, themes, and chat-oriented rich content.
Focus on explaining the practical configuration and usage of XRequest, providing accurate configuration instructions based on official documentation
SOC 職業分類に基づく
| name | x-card |
| version | 2.8.1 |
| description | 当需要用 @ant-design/x-card 让 AI Agent 动态渲染富交互 UI 时使用——涵盖 XCard.Box、XCard.Card、A2UI v0.9 命令、数据绑定、Catalog、Actions 和流式渲染模式。 |
本技能覆盖 @ant-design/x-card —— A2UI 协议的 React 实现,使 AI Agent 能够通过结构化 JSON 命令流动态渲染富交互 UI。
覆盖范围:
XCard.Box + XCard.Card 组件用法createSurface、updateComponents、updateDataModel、deleteSurface范围说明:v0.9 是推荐协议,v0.8 仅为向后兼容保留——所有新功能请使用 v0.9。
| 包名 | 职责 |
|---|---|
@ant-design/x-card | A2UI 协议的 React 渲染器 —— XCard.Box、XCard.Card、Catalog API |
@ant-design/x | 聊天 UI 组件(Bubble、Sender 等)—— 本技能不涉及 |
@ant-design/x-sdk | 数据 Provider、流式处理 —— 本技能不涉及 |
npm install @ant-design/x-card
导出内容:
import {
XCard,
registerCatalog,
loadCatalog,
validateComponent,
clearCatalogCache,
} from '@ant-design/x-card';
import type {
XAgentCommand_v0_9,
XAgentCommand_v0_8,
ActionPayload,
Catalog,
CatalogComponent,
} from '@ant-design/x-card';
// 子组件
XCard.Box; // 容器:接收命令,持有 Catalog 映射
XCard.Card; // 渲染器:按 id 渲染单个 Surface
XCard.Box
├── 持有:catalogMap、surfaceCatalogMap
├── 分发:commands → 所有 XCard.Card 子组件
├── 汇聚:所有 Card 的 onAction 事件
└── XCard.Card (id="surface-a")
│ ├── 持有:组件树、数据模型、commandVersion
│ └── 处理:数据绑定解析、Action 触发
└── XCard.Card (id="surface-b")
└── ...
interface BoxProps {
commands?: (XAgentCommand_v0_9 | XAgentCommand_v0_8)[];
/** 组件名称必须以大写字母开头 */
components?: Record<string, React.ComponentType<any>>;
onAction?: (payload: ActionPayload) => void;
children?: React.ReactNode; // 应包含 XCard.Card 元素
}
interface CardProps {
id: string; // 要渲染的 surfaceId
}
interface ActionPayload {
name: string; // 来自 action.event.name
surfaceId: string; // 触发动作的 Surface
/**
* 组件传递的上下文,已自动解析 path 引用
*
* 对于 action.event.context 中使用 { path: "xxx" } 格式的字段:
* - X-Card 会自动将其解析为 { value: "实际值" } 格式
* - 其他属性(如 label)会被保留
*
* 示例输入配置:
* { username: { path: "/form/username", label: "用户名" } }
*
* 示例解析后 context:
* { username: { value: "张三", label: "用户名" } }
*/
context: Record<string, any>;
}
| 当你需要... | 优先阅读 |
|---|---|
| 配置 XCard.Box + XCard.Card | USAGE.md → 基础配置 |
| 从 Agent 发送命令到卡片 | COMMANDS.md |
| 注册自定义组件 Catalog | CATALOG.md → 本地 Catalog |
| 把组件属性绑定到实时数据 | DATA_BINDING.md |
| 处理用户交互/表单提交 | ACTIONS.md |
| 构建流式渐进 UI | USAGE.md → 流式渲染 |
| 从 v0.8 迁移到 v0.9 | COMMANDS.md → v0.8 vs v0.9 |
| 查询完整类型定义 | API.md |
XCard.Box 的 components prop 传入。XCard.Box 包裹,每个 Surface 对应一个 XCard.Card。XAgentCommand_v0_9[] 传入 commands prop(通常来自 Agent 流式响应)。onAction 中接收 ActionPayload,追加新命令作为响应。import React, { useState } from 'react';
import { XCard, registerCatalog } from '@ant-design/x-card';
import type { XAgentCommand_v0_9, ActionPayload, Catalog } from '@ant-design/x-card';
// 1. 定义并注册本地 Catalog
const myCatalog: Catalog = {
catalogId: 'local://my_catalog.json',
components: {
Text: {
type: 'object',
properties: { text: { type: 'string' }, variant: { type: 'string' } },
required: ['text'],
},
Button: {
type: 'object',
properties: { text: { type: 'string' }, action: {} },
required: ['text'],
},
},
};
registerCatalog(myCatalog);
// 2. 自定义组件实现
const Text: React.FC<{ text: string; variant?: string }> = ({ text, variant }) => (
<p className={`text-${variant ?? 'body'}`}>{text}</p>
);
const Button: React.FC<{ text: string; onAction?: (ctx: any) => void; action?: any }> = ({
text,
onAction,
action,
}) => <button onClick={() => onAction?.(action?.event?.context ?? {})}>{text}</button>;
// 3. 构建命令(来自 Agent 流)
const commands: XAgentCommand_v0_9[] = [
{
version: 'v0.9',
createSurface: {
surfaceId: 'welcome',
catalogId: 'local://my_catalog.json',
},
},
{
version: 'v0.9',
updateComponents: {
surfaceId: 'welcome',
components: [
{ id: 'root', component: 'Column', children: ['title', 'btn'] },
{ id: 'title', component: 'Text', text: { path: '/user/name' }, variant: 'h1' },
{
id: 'btn',
component: 'Button',
text: '开始',
action: { event: { name: 'start', context: {} } },
},
],
},
},
{
version: 'v0.9',
updateDataModel: {
surfaceId: 'welcome',
path: '/user/name',
value: 'Alice',
},
},
];
// 4. 渲染
export default function App() {
const [cmdQueue, setCmdQueue] = useState<XAgentCommand_v0_9[]>(commands);
const handleAction = (payload: ActionPayload) => {
console.log('Action:', payload.name, payload.context);
// 根据 Agent 响应追加新命令
setCmdQueue((prev) => [...prev /* 新命令 */]);
};
return (
<XCard.Box commands={cmdQueue} components={{ Text, Button }} onAction={handleAction}>
<XCard.Card id="welcome" />
</XCard.Box>
);
}
"version": "v0.9" —— 缺少会导致协议拒绝。id: "root" 组件 —— 这是组件树的根节点。id 字符串引用。updateComponents 负责布局,updateDataModel 负责内容/状态。registerCatalog()。components map 传给 XCard.Box,而不是 XCard.Card —— Box 负责向所有 Card 分发。components 对象 —— 用 useMemo 或模块级常量保持稳定,避免不必要的重渲染。value: { path: "..." } 双向绑定 —— 字面量值不会更新数据模型。action.event.context 中的路径是写入目标 —— 它们指向用户输入数据在数据模型中的存储位置,不要作为读取来源解析。{ path: "xxx" } 转换为 { value: "实际值" } 格式。这适用于 v0.9(action.event.context = { key: { path } })和 v0.8(action.context = [{ key, value: { path } }])两种格式。action.context 是数组格式 —— [{ key, value: { path } }],与 v0.9 的对象格式 { key: { path } } 不同,混用会导致 action 数据丢失。| 场景 | 技能组合 |
|---|---|
| AI 对话 + 结构化卡片响应 | use-x-chat + x-components + x-card |
| 独立的 Agent 表单 UI | 仅 x-card |
| 流式 Markdown + 卡片侧边栏 | x-markdown + x-card |
| HTTP 流式 Agent 数据注入卡片 | x-request → 将响应作为命令传入 |