json-render
定义与身份
json-render 是 Vercel Labs 开源的生成式 UI框架,GitHub 仓库名为 vercel-labs/json-render,官网为 json-render.dev。
它的定位不是让大模型直接编写 UI、JSX、CSS 或任意前端代码,而是让 AI 在开发者预先定义的组件目录(Catalog)、schema、数据绑定规则和动作白名单内,生成结构化的 JSON Spec;真正把像素画到屏幕上的,是开发者注册到渲染器中的真实组件。
来源文章把它概括为“让 AI 在开发者护栏内造界面”的框架:模型负责根据自然语言需求组合合法结构,工程侧负责定义边界、校验输出、注册组件和执行渲染。
项目档案
以下项目数据来自来源文章记录的项目档案,反映的是其 2026 年 9 月语境下的状态,而不是长期不变的静态属性:
| 维度 | 数据 |
|---|---|
| 开源方 | Vercel Labs |
| 仓库名 | vercel-labs/json-render |
| 官网 | json-render.dev |
| GitHub Stars | 17,280+ |
| Trending 状态 | 在榜,单日 +291 |
| Forks | 918 |
| 开源协议 | Apache-2.0 |
| 主语言 | TypeScript |
| 创建时间 | 2026-01-14 |
| 最近更新 | 2026-09-20,来源文章称其高度活跃 |
角色与职责
json-render 在 AI 应用架构中承担“生成式界面中间层”的角色:
- 对用户或 Agent:把自然语言需求转换为可渲染、可校验、可流式输出的界面结构。
- 对大模型:提供 Catalog 派生的系统提示和结构约束,让模型只输出合法 JSON Spec。
- 对开发者:提供
defineCatalog、schema、registry、renderer 和流式解析工具,把可用组件、字段、状态和动作边界写成工程契约。 - 对前端运行时:把 JSON Spec 映射到 React、Vue、React Native、Ink 等平台中的真实组件。
因此,json-render 的核心价值不是“替代前端组件”,而是把 AI 生成 UI 的不确定性限制在可审计、可校验的 JSON 契约内。
核心设计哲学
json-render 最关键的设计哲学是:AI 不写 UI,AI 只生成受约束的 JSON Spec;真正渲染像素的是开发者定义并注册的组件。
这一区分解决了直接让 LLM 生成界面时的几个典型问题:
| 直接让 AI 做的事 | 常见风险 | json-render 的处理方式 |
|---|---|---|
| 生成订单卡片、数据看板等界面 | 幻觉组件、样式崩坏、潜在 XSS | 只能使用 Catalog 中登记的组件和字段 |
| 根据后端数据变化生成界面 | 输出结构不可预测,难以流式渲染 | JSON Spec 必须匹配 schema |
| 同时适配 React、Vue、移动端或终端 | 与某个框架强绑定,迁移成本高 | 一套 Spec 可交给不同渲染器 |
来源文章把矛盾总结为:模型擅长“涌现”,但界面要求“确定”。json-render 的做法是让模型在契约内自由组合,让工程侧掌控契约外的一切。
核心流水线
json-render 的基本流水线可以表示为:
用户 Prompt → AI + Catalog → JSON Spec → Renderer
具体过程如下:
- 开发者先用
defineCatalog定义组件、字段、数据绑定、动作等能力边界。 - Catalog 可以生成给模型使用的提示词,例如来源文章提到的
catalog.prompt()。 - 用户输入自然语言需求后,AI 在 Catalog 提供的能力范围内生成 JSON Spec。
- JSON Spec 经过 schema 校验;越界字段、未登记组件或非法动作会被拦截。
- 渲染器把校验通过的 JSON Spec 映射到真实 UI 组件。
这个流程中,AI 输出的是结构化说明,而不是可直接执行的任意代码。
护栏机制:Catalog、zod schema 与动作白名单
json-render 的护栏机制以 defineCatalog 和基于 zod 的 schema 为核心。开发者需要把 AI 能使用的组件、字段、数据绑定和动作都登记到 Catalog 中。
来源文章给出的示例包含三个组件类型:Card、Metric、Button;动作白名单中包含 setState:
import { defineCatalog } from '@json-render/core';
import { z } from 'zod';
const catalog = defineCatalog(
z.object({
root: z.object({ children: z.array(z.string()) }),
elements: z.record(z.union([
z.object({ type: z.literal('Card'), title: z.string() }),
z.object({ type: z.literal('Metric'), value: z.number() }),
z.object({ type: z.literal('Button'), label: z.string() }),
])),
}),
{ components: ['Card', 'Metric', 'Button'], actions: ['setState'] }
);
在这个例子中,模型不能随意发明未登记组件,也不能输出 schema 之外的字段;如果模型输出越界内容,会在 schema 校验阶段被拦截。这样,AI 可以在允许范围内组合界面,但不能突破开发者定义的安全边界。
流式能力:SpecStream
json-render 内置 SpecStream,用于处理模型的流式 JSON 输出。来源文章明确提到,它支持通过 createSpecStreamCompiler().push(chunk) 逐块解析模型吐出的片段。
这意味着界面不必等待模型一次性生成完整 JSON 后才渲染,而可以随着模型输出逐步编译、逐步呈现,形成类似 ChatGPT 打字机式输出的渐进体验。
来源文章概括的流式能力包括:
| 能力 | 说明 |
|---|---|
| 流式编译 | createSpecStreamCompiler().push(chunk) 逐块解析模型输出 |
| 自动提示词 | catalog.prompt() 可生成系统提示,交给任意 LLM 使用 |
| 一致性 | 输出必须严格匹配开发者定义的 schema |
多端渲染器
json-render 的核心与具体渲染目标解耦:同一份 JSON Spec 可以交给不同平台的渲染器处理。
来源文章列出的主要渲染目标和安装包包括:
| 渲染目标 | 安装包 |
|---|---|
| React / Next.js | @json-render/react、@json-render/next |
| Vue 3 | @json-render/vue |
| Svelte 5 / SolidJS | @json-render/svelte、@json-render/solid |
| React Native | @json-render/react-native |
| Ink 终端 TUI | @json-render/ink |
来源文章还提到,它可以扩展到一些非传统 UI 输出场景,包括 Remotion 视频、React PDF 发票文档、React Email 邮件、Satori 生成 SVG/PNG 社交卡片,以及 React Three Fiber 3D 场景。
交互与内置能力
json-render 不只用于生成静态界面。来源文章称它内置 36 个预构建的 shadcn/ui 组件,并支持表达式和状态机制来构造动态交互。
相关能力包括:
- 使用
$state表示状态。 - 使用
$cond表示条件逻辑。 - 使用
$template进行模板化渲染。 - 元素可带
visible条件控制显隐。 - 组件可以触发
setState动作。 - 可通过
watch字段监听状态变化,并联动其他动作。
这些能力使 AI 生成的界面不只是“图”,而可以成为带状态、条件显隐和动作联动的真实应用界面。
快速上手示例
来源文章以 React 为例,安装核心包和渲染器:
npm install @json-render/core @json-render/react
随后通过 registry 把 Catalog 中的 spec 类型映射到真实组件实现:
import { Renderer } from '@json-render/react';
import { defineRegistry } from '@json-render/core';
const registry = defineRegistry(catalog, {
components: { Card: MyCard, Metric: MyMetric, Button: MyButton },
});
<Renderer spec={spec} registry={registry} />;
这里的关键边界是:AI 生成的是 spec,而不是 MyCard、MyMetric 或 MyButton 的实现。真实组件仍由开发者维护、审查和部署。
与同类方案的区别
来源文章将 json-render 与直接让 LLM 生成 JSX、传统低代码平台进行了对比:
| 维度 | json-render | 直接 LLM 生成 JSX | 传统低代码平台 |
|---|---|---|---|
| 安全性 | 组件白名单,降低注入风险 | 不可控,易出现 XSS 等风险 | 可控但僵化 |
| 可预测性 | JSON 严格匹配 schema | 幻觉频发 | 固定模板 |
| 跨平台 | 一套 Catalog 多端渲染 | 往往需要重写 | 受平台限制 |
| 流式体验 | SpecStream 原生支持 | 难实现 | 通常不支持 |
| 灵活性 | AI 可自由组合合法组件 | 自由但危险 | 受拖拽组件约束 |
因此,json-render 更接近“AI 可编排的组件协议层”,而不是传统意义上的拖拽式页面搭建器,也不是让大模型直接输出代码的脚手架。
实际应用场景
来源文章列出的典型应用场景包括:
- AI 助手内嵌可视化:让 OpenClaw、Hermes Agent 等对话式 Agent 不只回复文字,还能生成订单看板、数据卡片等可视化界面。
- 内部工具与低代码搭建:产品、运营用自然语言描述后台或管理工具需求,工程师主要维护 Catalog 和真实组件。
- 批量内容生成:用同一套 Spec 批量生成发票 PDF、营销邮件、OG 社交图,甚至 Remotion 短视频。
- 终端与 3D 场景:通过 Ink 渲染 CLI TUI,或通过 Three.js / React Three Fiber 生成 3D 场景。
- IDE 内实时预览:通过内置 MCP 接入 Claude、Cursor、VS Code,并与 Cline、OpenCode 等编码 Agent 配合,实现需求变化后的界面即时重渲。
在私有化和数据主权要求较高的场景中,来源文章特别提到可与 Ollama、vLLM 等本地模型组合:模型在内网运行,界面边界由开发者定义,敏感数据不必离开内网。
细节与边界
- json-render 不要求绑定 Vercel 自家模型服务;来源文章称可将任意 LLM 的流式输出喂给 SpecStream。
- 它降低的是 AI 生成界面的失控风险,不意味着模型输出天然正确;输出仍需要 schema 校验和运行时处理。
- 它不替代真实组件开发;开发者仍需实现、注册并维护组件。
- 它不鼓励模型直接生成 JSX、脚本或任意可执行代码;推荐输出是受约束的 JSON Spec。
- Catalog 与 schema 是界面资产沉淀的核心:它们比散落在提示词中的约定更可复用、可审计、可迁移。
- Apache-2.0 协议意味着来源文章认为它可自由用于商业产品,但具体合规仍应以仓库许可证文本为准。
关键信息汇总
| 项目 | 信息 |
|---|---|
| 名称 | json-render |
| 开源方 | Vercel Labs |
| 仓库 | https://github.com/vercel-labs/json-render |
| 官网 | https://json-render.dev |
| 类型 | 生成式 UI框架 |
| 核心产物 | 受 schema 约束的 JSON Spec |
| 核心护栏 | 组件目录(Catalog)、zod schema、动作白名单、数据绑定规则 |
| 核心流式能力 | SpecStream,支持 createSpecStreamCompiler().push(chunk) |
| 主要语言 | TypeScript |
| 协议 | Apache-2.0 |
| 适合人群 | AI 应用开发者、低代码平台团队、需要给 Agent 加可视化界面的工程师 |
相关条目
- Vercel Labs
- 生成式 UI
- 组件目录(Catalog)
- SpecStream
- Ollama
- vLLM
- Cline
- OpenCode
- OpenClaw
- Hermes Agent