项目详情

json-render

The Generative UI framework——AI 只能在你的乐高目录里搭界面

vercel-labs/json-render Apache-2.0 TypeScript 17.4k stars Vercel Labs 出品

分类:AI 前端 · 生成式 UI · ← 返回汇总

项目速览

一句话定位

AI 出 JSON,你出组件——界面生成从「画图」变「拼装」

Generative UI 框架:先定义组件目录(catalog,含 Zod props schema 与 actions),AI 的输出被约束在目录内生成 JSON Spec,渲染器把 Spec 安全落到任意平台。流式渐进渲染,同一目录支持 React/Vue/Svelte/Solid/React Native/终端/3D/视频/PDF/邮件等 13 个目标。适合把 LLM 输出变成可靠交互界面的产品团队——聊天式仪表盘、个性化卡片、MCP 应用都在射程内。

Guardrailed:AI 只能用目录里的组件 Predictable:JSON 永远过 schema Streamed:边生成边上屏
项目速览

核心数据

17.4k
Stars(8 个月)
28+
npm 包(monorepo)
13
渲染目标平台
36
预置 shadcn/ui 组件
4
状态库适配(Redux/Zustand/Jotai/XState)
109
Open Issues

GitHub API 采集于 2026-09-21 · 2026-01-14 建仓 · 最近 push 2026-09-18 · 文档站 json-render.dev · Vercel Labs 官方产品(非玩具)

为什么存在

生成式 UI 的可靠性困境

让 AI 吐 JSX?

自由生成代码 = XSS 注入面、幻觉组件、任意布局漂移——产品不敢上生产。

结构化输出?

JSON mode 解决「格式合法」,不解决「语义在界内」——没有组件目录约束就没法渲染。

json-render 的答案

Catalog = 提前定义的乐高块(组件 + props schema + actions)。AI 在目录内组合,输出天然可渲染、可预测、可流式。

一句话:把「AI 生成界面」从开放生成问题变成受限组合问题——可靠性来自约束,不来自祈祷。

🔥 核心页

四拍管线:目录是契约,Spec 是货币

1 · Catalog 目录 components:Card / Metric / Button… 每个 props 用 Zod 定义 schema actions:export_report 等 catalog.prompt() 一键生成系统提示词 (组件描述+schema+动作全打包) 2 · AI + 自然语言 "给我一个营收仪表盘" 只能组合目录内的块 3 · JSON Spec(流式) {"type":"Card","props":{"title":…}} 动态语言:$state / $cond / $template visible 条件 · setState · watch 监听 SpecStream:chunk 到一段渲染一段 4 · Renderer(13 个目标) React · Vue · Svelte · Solid · RN · Ink 终端 · R3F 3D · Remotion 视频 · PDF · Email · OG 图 · Next/TanStack 全应用 目录同时约束提示词与校验
你定义的契约(catalog / spec) AI 环节 渲染终端 虚线 = 目录反向约束 AI 行为
快速上手

三段代码:契约 → 实现 → 渲染

// 1. 目录:组件 + Zod schema + actions
const catalog = defineCatalog(schema, {
  components: {
    Metric: { props: z.object({
      label: z.string(),
      value: z.string(),
      format: z.enum(["currency","percent"])
        .nullable() }) },
    Button: { props: z.object({
      label: z.string(), action: z.string() }) },
  },
  actions: { export_report: {/*…*/} }
});

// 2. 注册表:目录 → 实际组件实现
const { registry } = defineRegistry(catalog, {
  components: { Metric: MyMetric, Button: MyButton }
});

// 3. 渲染:spec 进,UI 出
<Renderer spec={spec} registry={registry} />
  • 契约与实现分离:目录给 AI 看(描述+schema),注册表给运行时用——AI 永远摸不到实现代码
  • prompt 自动化:catalog.prompt() 从目录生成系统提示词,加组件就自动更新
  • 验证内建:spec 不合 schema 直接被拒,AI 输出的非法 props 到不了渲染层
  • 事件回环:Button 的 emit 触发 actions,含内置 setState
平台矩阵

同一目录,13 个落点

域目标说明
Web 四框架react / vue / svelte / solid同一 catalog 跨框架渲染;Svelte 5 runes / Solid 细粒度响应式原生适配
全栈应用next / tanstack-startJSON 变完整应用:路由、布局、SSR、metadata
移动端react-native标准移动组件渲染器
终端ink交互式 TUI——CLI 也能吃同一目录
3Dreact-three-fiber20 个内置 3D 组件,含 GaussianSplat 高斯泼溅
视频remotion时间轴 schema,Spec 生成视频
文档/图react-pdf / react-email / imagePDF、HTML 邮件、OG 图/社交卡(Satori)

这份矩阵就是「Spec 是货币」的含义:AI 学一次你的目录,产出物从网页到视频到 PDF 全通兑——渲染目标成为可替换的下游。

核心机制

Spec 不只是布局,是有状态的小程序

  • $state:任意 prop 读状态树:{"name": {"$state": "/activeTab"}}
  • $cond:条件表达式按状态选值(icon 颜色随 tab 切换)
  • $template:"Hello, ${/user/name}!" 插值
  • $computed:调用注册函数,参数也走表达式
  • visible 条件:元素按状态显隐(如「有错误且未关闭时显示 Alert」)
  • setState + watch:内置动作改状态触发全量重求值;watch 监听路径变化再触发外部 action(选国家→自动加载城市)
为什么这套语言重要

AI 只生成一次静态 JSON 的 UI 是死水。带上状态/条件/监听后,生成的界面能响应用户操作——按钮切 tab、表单联动、错误提示显隐——而这一切仍是纯数据,可校验、可 diff、可回放。

配套 directives 包预置 $format/$math/$concat/$count/$truncate/$pluralize/$join/$t(i18n)——常见格式化不用写 $computed。

核心机制

SpecStream:token 到哪,界面到哪

// 流式编译器:chunk 到一段,patch 一段
const compiler = createSpecStreamCompiler();
for await (const chunk of llmStream) {
  const { result, newPatches } = compiler.push(chunk);
  setSpec(result);  // 部分结果直接上屏
}
const final = compiler.getResult();
  • 体验差异:等完整 JSON = 秒级白屏;流式渲染 = 用户看着界面一块块长出来
  • 工程差异:SpecStream 工具内置增量 patch 语义,不用自己写「半截 JSON 怎么渲染」
  • YAML 线格式:@json-render/yaml 提供 YAML 流式解析 + 编辑模式——比 JSON 更耐流式截断
  • devtools:事件存储 / 元素选取器 / 流式分接,四框架各有适配器,一个组件挂上即用
生态

三个接口:状态库、MCP、以及……Jev

状态库适配

StateStore 官方适配 Redux/RTK、Zustand、Jotai、XState——spec 的 $state 直接挂进你现有的状态管理,不另起炉灶。

MCP Apps

@json-render/mcp 让 Claude / ChatGPT / Cursor / VS Code 里直接渲染你的组件——聊天工具变成你的应用分发渠道。

Jev 实验组合

experimental_composeSpec + createEvaluator 可用 Jev(System One 模型)替代自回归 LLM 生成 spec——typed decision 出 UI 的早期试验田。

Jev 联动值得玩味:本周看的 awesome-jev / laya 都是「typed decision」故事,json-render 把同一个模型接到 UI 生成端——新一代生成栈正在互相对齐(codegen 包还能把 spec 树反过来生成代码)。

在线体验

亲手写一个 Spec,看它变成界面

左边编辑 JSON Spec(或点预设),右边实时渲染一个迷你 catalog:改 $state 看 $cond 表达式变色、点 setState 按钮看 visible 条件显隐——json-render 的核心求值语义(动态 props / 条件可见性 / 状态动作)全部可玩。

▶ 打开 Spec 渲染实验台

求值器语义 1:1 复刻官方文档的 Dynamic Props 规则,真值表 + node 对拍双验证。

适用场景 / 风险提示

谁该用,需要警惕什么

适合
  • AI 产品团队:聊天内嵌个性化 UI(仪表盘/卡片/表单)且要求生产级可靠
  • 多端产品:一份目录出 web+移动+终端+PDF+邮件,AI 侧零改动
  • MCP 应用作者:让 Claude/Cursor 直接渲染你的组件而非贴文本
  • 内容自动化:OG 图、社交卡、报表 PDF 批量生成
警惕
  • 复杂度税:28+ 包的 monorepo,目录/注册表/状态三层心智模型,小项目杀鸡用牛刀
  • spec 表达力边界:复杂交互仍要回落到真组件——目录设计能力决定上限
  • Labs 项目属性:Vercel 实验田,API 可能快进快出(experimental_ 前缀就是信号)
  • 生态早期:109 issues、renderers 各端成熟度不齐(R3F/Remotion 明显新于 React)
潜力评估

未来空间

Generative UI 是 LLM 应用的下一站之争(Anthropic 的 server-driven UI、各家的 artifact 都在抢),json-render 用「约束生成 + 一目录多端」给出了工程上最完整的一版,Vercel 的分发能力加分。看点:MCP Apps 能否成为聊天工具里的 UI 标准、Jev 组合能否跑通、React 之外的渲染器成熟度。评分 8.5:范式清晰、执行强,扣分在心智复杂度与 Labs 属性。


上一个
MemPalace
下一个
AutoClip
1 / 13