OpenTiny 团队的 GenUI SDK 走到了v1.4.0。如果说 v1.3.0 的意义在于"把核心逻辑从渲染器里拆出来、让物料可插拔",那 v1.4.0 的主线只有一件事------React 渲染器正式发布,Vue / React / Angular 三大主流框架全覆盖。
v1.3.0 时 React 渲染器还停留在 alpha 阶段,而现在已经正式落地,可以交付使用。本文从开发者视角拆解这次更新,重点回答三个问题:
React 渲染器从 alpha 到正式版经历了什么、三框架一致性到底意味着什么、以及这套方案在生产环境中值不值得押注。
一、先回顾:GenUI SDK 的核心链路没有变
在往下讲之前,先回顾下 GenUI SDK 的核心流程。v1.4.0 所有改动,都是在这条链路上做加强,不是重新搞一套。
大模型流式输出 Schema → 前端增量解析(Delta Patch) → 渲染器实时渲染 UI → 用户交互回写
v1.3.0 做的是"骨架工程":Core 独立发包、物料解耦、渲染器补齐 refs / 异步 Action / 生命周期。v1.4.0 则是在这副骨架上,把最后一块框架拼图------React------正式装上去。

二、React 渲染器正式发布:从 alpha 到正式版的质变
v1.3.0 放出的 React 渲染器是 1.3.0-alpha.1,配套 Ant Design 物料库。当时能跑通基本流程,但 alpha 意味着"路径走通了,细节还没打磨"。
v1.4.0 的 React 渲染器正式晋升为正式版本。从源码来看,核心文件结构已经稳定:
bash
packages/frameworks/react/src/
├── config-provider/
│ ├── ConfigProvider.tsx # 全局配置提供者,注入物料、主题、通知
│ ├── index.ts
│ └── notify.types.ts # 通知能力类型定义
├── renderer/
│ ├── GenuiRenderer.tsx # 核心渲染器(约 157 行)
│ ├── config.ts # 渲染配置(字段选择器等)
│ ├── index.ts
│ ├── renderer.css # 渲染器样式
│ └── renderer.types.ts # 类型定义
├── index.ts # 包入口
└── transform-jsx.ts # JSX 转换工具
接入方式与此前 Vue / Angular 保持一致------GenuiConfigProvider 注入物料,GenuiRenderer 负责渲染:
tsx
import { GenuiConfigProvider, GenuiRenderer } from '@opentiny/genui-sdk-react';
import { materials } from '@opentiny/genui-sdk-materials-react-antd/materials';
import 'antd/dist/reset.css';
export function App({ schema }: { schema: unknown }) {
return (
<GenuiConfigProvider materials={materials}>
<GenuiRenderer content={schema} isJsonComplete />
</GenuiConfigProvider>
);
}
几个值得关注的实现细节:
forwardRef暴露实例 :GenuiRenderer通过forwardRef暴露SchemaRendererHandle,允许外部直接调用setContext、setState等方法------这与 v1.3.0 在 Vue / Angular 渲染器里补的 refs 能力对齐;- 物料合并策略 :
contextMaterials.components与props.customComponents合并,后者优先级更高,方便业务覆盖默认组件; - Action 分发 :
callAction从customActions中查找对应 action 并执行,未找到时输出 warning 而非抛错------容错策略与 Vue 版一致; - 错误兜底:JSON 解析失败时渲染错误提示而非白屏。
总结:React 渲染器从 alpha 转正,并不是我们从零重写了一套渲染器。本质上,v1.3.0 定下的 Core + 物料这套架构,顺利扛住了第三个框架的考验。框架之间的差别,只在组件怎么实现:React 用 Hooks、Vue 用组合式 API、Angular 靠依赖注入,对外的 API 全都保持一致。这件事的意义,远不止多出来一个 React 版本,它证明咱们这套架构的扩展性不是空想,是真的能用。

三、流式渲染:三框架共享同一套核心逻辑
流式渲染是 GenUI SDK 的核心亮点之一,也是技术含量最高的部分。模型流式输出的 JSON 往往是不完整的------比如 { "type": "Form", "fields": [ 这种半成品------直接渲染必然报错。
v1.3.0 在 Core 层实现了 repairJson 和 DeltaPatcher:前者实时修复不完整的 JSON,后者把增量更新应用到已有的组件树。v1.4.0 的 React 渲染器直接复用了这套逻辑,从 GenuiRenderer.tsx 的核心代码可以看到:
tsx
useEffect(() => {
setIsError(false);
const raw = props.content;
if (typeof raw === 'string' && raw.trim()) {
const { value, state } = repairJson(raw);
if (!value || typeof value !== 'object') {
setIsError(true);
return;
}
// ... 处理流式更新
}
}, [props.content]);
这意味着三件事:
- 开发者不需要自己处理流式逻辑 ------把模型输出直接传给
contentprop 即可; - 流式修复的正确性由 Core 统一保证 ------三个框架共享同一段
repairJson,修一个 bug 三端同时受益; - "模型吐一个字,界面就更新一点"的体验在三框架上完全一致。
总结:流式渲染这块,是生成式 UI 最容易出各种奇怪 bug 的地方。GenUI SDK 把这部分能力下沉到 Core 层,三个框架共用一套实现。一方面不用重复写代码,另一方面体验也能统一。对开发者来说,不管你用哪个框架,流式渲染的表现、异常情况全都一样,省心很多。

四、自定义组件与 Actions:生成式 UI 融入业务的两个抓手
v1.3.0 在渲染器层面补了默认 Props、refs、异步 Action、生命周期四项能力,让生成式 UI 从"静态模板"进化为"可编排业务流程的可用界面"。v1.4.0 的 React 渲染器完整继承了这些能力。
自定义组件:业务组件直接注入
如果项目有专属的业务组件------<OrderCard />、<UserAvatar />------可以通过 customComponents 注入:
tsx
<GenuiConfigProvider
materials={materials}
customComponents={{
OrderCard: OrderCardComponent,
UserAvatar: AvatarComponent,
}}
>
<GenuiRenderer content={schema} />
</GenuiConfigProvider>
模型生成的 SchemaJson 里只要包含 { "componentName": "OrderCard", "props": { ... } },渲染器就会自动映射到对应的业务组件。物料合并策略保证了 customComponents 优先级高于默认物料,业务覆盖不需要改动物料包本身。
自定义 Actions:交互逻辑外挂
按钮点击、表单提交等交互通过 customActions 注入:
tsx
<GenuiConfigProvider
materials={materials}
customActions={{
submitOrder: {
execute: (params, context) => {
// 调用业务 API
}
}
}}
>
<GenuiRenderer content={schema} />
</GenuiConfigProvider>
配合 v1.3.0 引入的异步 Action(async: true + return Schema),模型可以在 Schema 内编排"校验 → 等待结果 → 分支判断 → 继续"这类有状态的业务流程。
总结:这两个机制让生成式 UI 不再是"只能展示信息的卡片",而是能真正嵌入业务系统的可用界面。三框架 API 一致,意味着你在 Vue 项目里调试好的自定义组件和 Action 逻辑,迁移到 React 项目时几乎不用改。

五、三框架一致性:不是巧合,是架构选择
把三个框架的 API 放在一起看,一致性是刻意的:
| 能力 | Vue | React | Angular |
|---|---|---|---|
| 渲染器 | GenuiRenderer |
GenuiRenderer |
GenuiRenderer |
| 配置提供者 | GenuiConfigProvider |
GenuiConfigProvider |
GenuiConfigProvider |
| 物料注入 | ✅ | ✅ | ✅ |
| 自定义组件 | ✅ | ✅ | ✅ |
| 自定义 Actions | ✅ | ✅ | ✅ |
| 流式 JSON 修复 | ✅ | ✅ | ✅ |
| 通知能力 | ✅ | ✅ | ✅ |
这套一致性,根源其实是 v1.3.0 定下的架构思路:和框架无关的纯业务逻辑,全都下沉到 @opentiny/genui-sdk-core;跟框架绑定的渲染逻辑,放在上层 。 三个框架共用同一套 SchemaJson 协议、repairJson、DeltaPatcher 和 genPrompt。它们的区别只在组件怎么写:React 靠 Hooks,Vue 用组合式 API,Angular 则是依赖注入。
对于企业来说,这意味着:
- 学习成本只付一次:团队学会一个框架的 GenUI SDK 用法,另外两个框架几乎零学习成本;
- 跨项目复用:物料包、提示词、业务组件、自定义 Actions 可以在不同框架间共享;
- 技术栈迁移无感:从 Vue 迁移到 React 时,生成式 UI 部分的 Schema 协议、物料元数据、服务端 Prompt 全部不用改。
总结:三框架一致性不是"三个团队各写一遍然后碰巧一样",而是 Core 独立发包 + 统一协议层的必然结果。这种架构选择让"学一次、到处用"从口号变成了工程事实。
六、物料体系:前端 materials 与后端 materialsMeta 的双向契约
物料包是 GenUI SDK 里最容易被低估、实际上最关键的组成部分。以 React 的 @opentiny/genui-sdk-materials-react-antd 为例,它提供两样东西:
materials --- 运行时组件映射,告诉渲染器"Schema 里的组件名对应哪个真实 React 组件":
ts
export const materials = {
components: {
Button: AntButton,
Input: AntInput,
Form: AntForm,
// ...
}
};
materialsMeta --- 提示词元数据,告诉模型"可以使用哪些组件、每个组件有哪些参数":
ts
export const materialsMeta = {
components: [
{
name: 'Button',
description: '按钮组件',
props: [
{ name: 'type', type: 'string', enum: ['primary', 'default', 'dashed'] },
{ name: 'size', type: 'string', enum: ['small', 'medium', 'large'] }
]
}
]
};
前端注入 materials,服务端通过 genPrompt() 注入 materialsMeta------两边必须匹配。如果模型生成了一个前端物料包里不存在的组件名,渲染器就会报错。

总结:这是一个"双向契约"设计。它把"模型能生成什么"和"前端能渲染什么"解耦了------你可以为不同业务场景准备不同的物料包,渲染器保持稳定通用。v1.3.0 引入的物料可插拔在 v1.4.0 的 React 物料包上得到了完整验证:换物料包不需要改渲染器代码,换框架不需要改物料元数据。
七、实战:从零搭建一个 React AI 对话应用
理论讲完,看一个完整的实战流程。
安装依赖:
bash
pnpm add @opentiny/genui-sdk-react @opentiny/genui-sdk-materials-react-antd antd
前端代码 ------GenuiChat 是开箱即用的对话组件,内置输入框、消息列表、渲染器:
tsx
import { GenuiChat } from '@opentiny/genui-sdk-react';
import { materials } from '@opentiny/genui-sdk-materials-react-antd/materials';
import 'antd/dist/reset.css';
export function App() {
return (
<GenuiChat
url="/api/chat"
model="deepseek-chat"
materials={materials}
/>
);
}
服务端代码 ------startServer 自动处理流式响应,把模型输出转换为 SchemaJson:
ts
import { startServer } from '@opentiny/genui-sdk-server';
import { materialsMeta } from '@opentiny/genui-sdk-materials-react-antd/meta';
startServer({
port: 3100,
baseURL: 'https://api.openai.com/v1',
apiKey: process.env.OPENAI_API_KEY,
materialsMeta,
});
启动后访问 http://localhost:5173,试着说"帮我生成一个用户注册表单",界面会实时生成出来。
总结 :从安装到跑通,前端不到 10 行代码,服务端不到 10 行代码。GenuiChat 封装了完整的对话流程,适合快速验证;如果需要更细粒度的控制,可以拆开用 GenuiRenderer + 自定义消息管理。
八、演练场:先体验再集成的零成本入口
如果还不想动手写代码,官方演练场是最直接的体验方式。演练场本身用 GenUI SDK 搭建,支持切换 Vue / React / Angular 三种技术栈,在同一会话里横向对比不同框架的生成效果。
跳转演练场,在物料面板中选择React技术栈。就可以跳过手写代码的过程,直接在演练场优先体验生成式UI的能力了。

演练场地址 :opentiny.design/genui-sdk/p...
总结:演练场可不只是个在线 Demo。它支持同一个会话里混用三个框架,还能导出源码,相当于一个低成本的方案验证工具。大家打算接入之前,可以先在演练场跑一遍,看看生成效果是不是符合预期。
九、总结与展望
v1.4.0 的其中一条重要主线:React 渲染器正式发布,三大主流框架全覆盖。但这个"集齐"的背后,是 v1.3.0 架构决策的兑现------
- Core 独立发包让流式修复、协议定义、Prompt 生成等核心逻辑可以被三个框架共享,修一个 bug 三端受益;
- 物料可插拔让"换框架不换物料"成为可能,React 物料包与 Vue / Angular 物料包遵循完全相同的元数据规范;
- API 一致性让团队的学习成本只付一次,跨框架迁移时生成式 UI 部分几乎无感。
对于开发者而言,v1.4.0 是一个可以认真评估接入的版本。尤其是那些此前因为"团队用 React 但 SDK 只有 Vue / Angular"而观望的团队,这块拼图现在已经补齐了。

相关链接
- 演练场:opentiny.github.io/genui-sdk/p...
- React 快速开始:docs.opentiny.design/genui-sdk/g...
- React 组件 API:[docs.opentiny.design/genui-sdk/c...
关于 OpenTiny
OpenTiny 是面向企业级场景的前端 AI 应用开发平台。平台依托生成式 UI与WebMCP两大核心底层技术,打造适配 Agent 智能应用生态的 NEXT-SDKs、AI 扩展工具、TinyRobot 对话 AI 组件库、GenUI SDK生成式 UI 、WebAgent 智能代理等系列产品,能够依托 AI 解析用户需求意图,自动驱动任务执行,助力企业现有业务系统快速完成智能化升级。
同时 OpenTiny 沉淀成熟通用前端基建能力:提供跨端、跨框架、跨版本的 TinyVue 组件库,配套基于 Angular+TypeScript 技术栈的 TinyNG 组件库;内置可高度自定义拓展的低代码引擎 TinyEngine,搭配 TinyPro 中后台业务模板、TinyCLI 命令行工具等配套工具链,全方位赋能开发者高效搭建各类 Web 端企业应用。
欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~
OpenTiny 官网:opentiny.design
GenUI SDK 代码仓库:github.com/opentiny/ge...(欢迎star ⭐)
如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~如果你有任何问题,欢迎在评论区留言交流!