# genui **Repository Path**: agentskillmania/genui ## Basic Information - **Project Name**: genui - **Description**: 适配A2UI v0.9版本的生成式UI引擎——基于Ant Design 6与ECharts - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-06-12 - **Last Updated**: 2026-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GenUI [English](README.en.md) **输入 JSON,输出 React UI。** GenUI 是一个生成式 UI 引擎:它接收 A2UI 协议消息(JSON),将其渲染为实时 React 组件。支持流式输入 —— 你可以一边接收 JSON 一边更新 UI。 --- ## 它能干什么 | 场景 | 描述 | |------|------| | **LLM 生成 UI** | AI 输出 JSON → GenUI 渲染为表格、图表、表单等交互组件。你的 AI 应用可以"生成界面"而不是只输出文本 | | **服务端驱动 UI** | 后端下发组件描述 → 前端动态渲染,无需客户端发版 | | **配置化仪表盘** | JSON 描述布局、图表、数据绑定,一键切换 | | **多 Surface 管理** | 同一个页面可以运行多个独立的"微前端"(组件树 + 数据模型),彼此隔离 | --- ## 核心概念 只要理解 3 个东西就能用起来: **消息** — 你发给引擎的 JSON。告诉引擎"创建一个按钮"、"更新数据"、"删除一个 Surface"。 **Surface** — 一个独立 UI 空间,有自己的组件树和数据模型。一个页面可以有多个 Surface。 **SurfaceManager** — 你与引擎之间的通信闸口。所有消息、流式数据都通过它收发。 --- ## 快速开始 ### 安装 ```bash npm install @agentskillmania/genui ``` Peer 依赖:`react` ^18 || ^19、`react-dom` ^18 || ^19。 ### 使用 ```tsx import { GenUISurface, useGenui, useSurfaceManager } from '@agentskillmania/genui'; function MyApp() { useGenui(); const { surfaceManager } = useSurfaceManager(); if (!surfaceManager) return null; // 发送一条消息 —— 告诉引擎你要渲染什么 surfaceManager.handleMessage({ version: 'v0.9', updateComponents: { surfaceId: 'demo', components: [ { id: 'root', component: 'Card', children: ['title', 'body'], bordered: true }, { id: 'title', component: 'Text', text: { path: '/title' }, variant: 'h3' }, { id: 'body', component: 'Text', text: { path: '/description' } }, ], }, }); // 再发一条消息 —— 绑定数据 surfaceManager.handleMessage({ version: 'v0.9', updateDataModel: { surfaceId: 'demo', path: '/', value: { title: 'Hello GenUI', description: '由 A2UI 协议渲染。' }, }, }); return ; } ``` ### 流式输入 —— 一边接收一边渲染 ```tsx import { GenUISurface, useSurfaceManager } from '@agentskillmania/genui'; function StreamingDemo() { const { surfaceManager } = useSurfaceManager(); async function handleStream(response: Response) { if (!surfaceManager) return; const reader = response.body!.getReader(); const decoder = new TextDecoder(); while (true) { const { done, value } = await reader.read(); if (done) break; const chunk = decoder.decode(value); surfaceManager.handleChunk(chunk); // 自动检测 JSON 边界,边接收边渲染 } } return surfaceManager ? : null; } ``` --- ## API 速览 | 方法 | 作用 | |------|------| | `handleMessage(msg)` | 发送一条完整的 A2UI 消息(JSON 对象或字符串)| | `handleChunk(chunk)` | 输入流式文本片段,自动检测 JSON 边界并渲染 | | `submitUIAction(action)` | 提交用户交互事件(如按钮点击、行点击)| | `submitUIDataModel(syncMsg)` | 提交表单变更同步事件 | | `on(event, handler)` | 订阅 Surface 事件(action、syncUIToData 等)| | `registerComponent(type, renderer)` | 注册自定义组件 | | `Genui.registerFunction(name, handler)` | 注册可被 `{call, args}` 调用的函数 | --- ## 你可以做的事情 ### 自定义组件 ```tsx import { registerComponent } from '@agentskillmania/genui'; import type { ComponentRenderer } from '@agentskillmania/genui'; const MyWidget: ComponentRenderer = ({ properties, children }) => (

{properties?.title}

{children}
); registerComponent('MyWidget', MyWidget); ``` ### 注册宿主函数(被 JSON 中的 `{ call, args }` 调用) ```tsx Genui.registerFunction('queryWeather', (args) => { return `今日${args.city}气温 28°C,晴。`; }); // 然后消息中可以这样引用: // { "component": "Text", "text": { "call": "queryWeather", "args": { "city": "北京" } } } ``` ### 处理用户交互 ```tsx const handleAction = (action) => { console.log(action.action, action.sourceComponentId, action.context); // → "drilldownCity" "cityBtn" { cityId: "123" } }; // 组件消息中声明 action: // { "id": "cityBtn", "component": "Button", "text": "查看详情", "action": { "event": { "name": "drilldownCity" } } } ``` --- ## 支持的组件(62 个) | 分类 | 组件 | |------|------| | **布局** (12) | Row, Column, Card, Tabs, Modal, List, Carousel, Collapse, Space, Splitter, Tooltip, Popover | | **基础** (6) | Text, Image, Icon, Button, Divider, Web | | **输入** (14) | TextField, CheckBox, ChoicePicker, Slider, DateTimeInput, Switch, Rate, InputNumber, AutoComplete, Cascader, TreeSelect, Transfer, Upload, ColorPicker | | **数据** (10) | Table, RichText, Markdown, Avatar, Badge, Statistic, Timeline, Descriptions, Calendar, Tree | | **反馈** (7) | Alert, Drawer, Progress, Result, Skeleton, Spin, Tag | | **导航** (6) | Breadcrumb, Steps, Pagination, Dropdown, Anchor, Menu | | **媒体** (3) | Video, AudioPlayer, Lottie | | **工具** (3) | QRCode, Watermark, FloatButton | | **图表** (1) | Chart(ECharts —— 柱状图、折线图、面积图、饼图、环形图、散点图、雷达图、热力图、漏斗图、仪表盘、树图、旭日图、桑基图、关系图、箱线图、K 线图等)| --- ## 开发 ```bash npm install # 安装依赖 npm run build # 构建 npm test # 运行测试 npm run test:coverage # 测试覆盖率(90% 阈值) npm run lint # 类型检查 npm run storybook # 组件演示 ``` --- ## 给 AI 的 Skill 上下文 `skills/a2ui-generation/` 目录是为 AI 模型(LLM)准备的提示词(prompt),当你想让 AI 生成 A2UI JSON 时,把这些文件作为上下文喂给 AI。包含组件目录、绑定语法、设计规则等参考。人类开发者不需要读它。 --- ## 许可证 MIT