在生成式 AI 领域,直接让大模型(LLM)输出 HTML 或 React 代码存在安全性难以控制、输出结构不稳定等工程化难题。json-render 提供了一种“AI → JSON → UI”的链路,将 AI 的输出严格约束在开发者定义的组件词汇表中,确保了 UI 生成的可预测性与安全性。
一、 产品背景与痛点解析
1.1 传统“AI 生成 UI”的主要风险
在 json-render 出现前,开发者通常让 LLM 输出 Tailwind 片段或半结构化 JSON,这带来了以下问题:
- 安全风险:模型可能输出恶意脚本或篡改事件处理逻辑,且难以进行静态审核。
- 不可预测性:LLM 容易产生“字段幻觉”或拼错组件名,导致渲染崩溃。
- 端侧复用困难:React 代码片段无法直接用于移动端(Flutter/Android)或视频生成(Remotion)场景。
- 流式体验缺失:用户通常需要等待模型完全输出后才能看到 UI,缺乏渐进式反馈。
1.2 json-render 的核心思路
json-render 的核心定位是为 AI 搭建一套**带护栏(Guardrailed)**的输出协议:
- 严格约束:开发者通过 Zod 定义可用组件及其 Props,AI 只能在限定范围内选择。
- 结构稳定:输出符合
@json-render/core定义的 Schema,消除字段幻觉。 - 增量渲染:利用
SpecStream技术,将流式文本实时编译为 JSON 补丁,实现 UI 的边生成边显示。
二、 技术架构与工作流
json-render 的工作流程将自然语言转化为受控的 UI 规格说明书(Spec)。
2.1 核心模块构成
- @json-render/core:定义 Schema、Catalog 以及 AI 提示词生成工具。
- @json-render/react:适配 React 的渲染器与 Hooks。
- @json-render/remotion:支持将 JSON 转化为视频时间轴的渲染器。
- SpecStream:在 0.4.4 版本中,其补丁机制已完全兼容 RFC 6902 (JSON Patch) 标准,便于与协作编辑系统集成。
三、 实战指南:从定义到渲染
3.1 定义 Catalog(建立护栏)
Catalog 是 AI 的“词汇表”,通过 defineCatalog 告知模型哪些组件可用。
import { defineCatalog } from "@json-render/core";
import { z } from "zod";
export const catalog = defineCatalog(schema, {
components: {
Metric: {
props: z.object({
label: z.string(),
value: z.string(),
format: z.enum(["currency", "percent", "number"]).nullable(),
}),
description: "用于展示关键业务指标,如营收、转化率等",
},
},
actions: {
export_report: { description: "将当前仪表盘导出为 PDF" },
},
});
3.2 映射 Registry(组件实现)
在前端,通过 defineRegistry 将抽象的 JSON 节点映射为真实的 React 组件。
const { registry } = defineRegistry(catalog, {
components: {
Metric: ({ props }) => (
<div className="metric-card">
<label>{props.label}</label>
<div className="value">{props.value}</div>
</div>
),
},
});
3.3 处理流式输出
利用 createSpecStreamCompiler,可以实时解析 LLM 的流式返回:
const compiler = createSpecStreamCompiler<MySpec>();
// 在接收到 LLM Chunk 时调用
const { result, newPatches } = compiler.push(chunk);
setSpec(result); // 更新 React 状态,触发 UI 增量渲染
四、 竞品对比与选型建议
基于 2026 年的主流技术栈,json-render 与其他生成式 UI 方案的对比如下:
| 维度 | json-render (Vercel Labs) | A2UI (Google) | Builder.io | Thesys C1 |
|---|---|---|---|---|
| 核心定位 | 前端内嵌 AI UI 库 | 跨端 Agent UI 协议 | Headless CMS + SDK | 生成式 UI 商业 API |
| 输出格式 | 自定义 JSON Spec | A2UI Payload | Builder JSON | UI JSON Spec |
| 安全模式 | Catalog 护栏 + Schema | 严格事件驱动(禁 JS) | 组件白名单 | API 级权限控制 |
| 流式能力 | SpecStream (RFC 6902) | 协议级支持 | 非强流式 | 实时 UI Spec 流 |
| 开源协议 | Apache-2.0 | 部分开源 | 商业授权 | 商业授权 |
选型建议:
- 优先选择 json-render:如果你正在构建基于 React 的 SaaS 仪表盘、内部报表工具,且希望在现有组件库基础上快速增加 AI 生成功能。
- 考虑 A2UI:如果你需要跨 Web、Android、Flutter 多端统一渲染来自不同 Agent 的 UI。
- 考虑 Builder.io:如果你的核心需求是让非技术人员通过可视化界面管理 UI 模板。
五、 落地建议与避坑指南
5.1 典型陷阱
- Catalog 过于冗长:一次性给 AI 几十个细粒度原子组件会导致模型输出不稳定。建议首批仅开放 5-10 个高价值业务组件。
- 业务逻辑外溢:不要尝试让 AI 控制复杂的业务逻辑。应将逻辑封装在组件内部,AI 只负责传递 Props(如颜色、标签、数据路径)。
- 忽略错误边界:LLM 偶尔会输出非法 JSON。必须在渲染器外层包裹
ErrorBoundary,并提供降级视图。
5.2 推荐实施路径
- 第一阶段:定义最小 Catalog,通过
catalog.prompt()生成系统提示词。 - 第二阶段:接入 Vercel AI SDK,利用流式接口配合
SpecStream实现渐进式加载。 - 第三阶段:引入版本控制。在 Spec 根节点记录版本号,确保前端组件升级后,旧的 AI 生成 JSON 仍能通过迁移脚本正常渲染。
5.3 0.4.4 版本关键更新
- 数据结构简化:移除了 flat specs 中的
key和parentKey字段,降低了传输开销。 - 标准化补丁:全面对齐 RFC 6902,这意味着开发者可以使用标准的 JSON Patch 工具库对 UI 规格进行增量更新或协作编辑。
json-render 将 AI 交互从简单的“对话框”提升到了“可交互界面”的维度,是目前生产环境下实现受控生成式 UI 的成熟工程方案。