JSON‑Render:受限 AI 提示式 UI 库(React)

JSON‑Render:受限 AI 提示式 UI 库(React)

在大型语言模型时代,开发者总在寻找把纯文本提示转化为可执行的用户界面的方法。JSON‑Render 通过为 AI 提供可预测安全的词汇表,填补了这一空白,使输出始终为可在 React 中渲染的 JSON 树——无意外,零安全漏洞。

什么是 JSON‑Render?

JSON‑Render 是一套轻量级、面向 TypeScript 的工具包,由两个 NPM 包组成:

  • @json-render/core —— 模式定义、守卫、可见性逻辑和动作处理。
  • @json-render/react —— React 组件、hooks 与渲染器,将 JSON 转化为实时 UI。

主要优势:

特性 重要性
受限 AI 只被允许使用预定义的组件类型,防止恶意代码注入。
可预测 JSON 遵循 Zod 模式。每个属性可在运行时进行类型检查。
快速 流式渲染可在模型发送数据时立即呈现,用户实时看到更新。
可组合 能将自定义 React 组件与守卫组合使用;库对样式保持中立。

快速入门指南

以下是一段最小化示例的逐步演练。假设你使用 pnpm 创建一个全新的 Node 项目。

# 克隆并启动
# Clone and bootstrap
git clone https://github.com/vercel-labs/json-render
cd json-render
pnpm install
pnpm dev

dev 命令会启动四个服务: * localhost:3000 — 文档与 Playground * localhost:3001 — 示例仪表盘应用 * 用于 API 的 websocket 端点 * 当地兼容 ChatGPT 的后端(参考仓库了解自定义 LLM 集成)

1. 定义组件目录

packages/core/src/catalog.ts,你声明 AI 可使用的所有组件。以下是一个简洁示例:

import { createCatalog } from '@json-render/core'
import { z } from 'zod'

const catalog = createCatalog({
  components: {
    Card: {
      props: z.object({ title: z.string() }),
      hasChildren: true,
    },
    Metric: {
      props: z.object({
        label: z.string(),
        valuePath: z.string(),
        format: z.enum(['currency', 'percent', 'number']),
      }),
    },
    Button: {
      props: z.object({ label: z.string(), action: ActionSchema }),
    },
  },
  actions: {
    export_report: { description: 'Export dashboard to PDF' },
    refresh_data: { description: 'Refresh all metrics' },
  },
})
export default catalog

ActionSchema 是你从 @json-render/core 导入的 Zod 模式,用于验证 action 负载的结构。

2. 注册 React 渲染器

创建一个小型注册表,将组件名映射到实际的 React 元素。

const registry = {
  Card: ({ element, children }) => (
    <div className='card'>
      <h3>{element.props.title}</h3>
      {children}
    </div>
  ),
  Metric: ({ element }) => {
    const value = useDataValue(element.props.valuePath)
    return <div className='metric'>{format(value)}</div>
  },
  Button: ({ element, onAction }) => (
    <button onClick={() => onAction(element.props.action)}>
      {element.props.label}
    </button>
  ),
}

3. 把它们连接在一起

import { useUIStream, DataProvider, ActionProvider, Renderer } from '@json-render/react'

function Dashboard() {
  const { tree, send } = useUIStream({ api: '/api/generate' })

  return (
    <DataProvider initialData={{ revenue: 125000, growth: 0.15 }}>
      <ActionProvider actions={{
        export_report: () => downloadPDF(),
        refresh_data: () => refetch(),
      }}>
        <input
          placeholder='Create a revenue dashboard…'
          onKeyDown={(e) => e.key === 'Enter' && send(e.target.value)}
        />
        <Renderer tree={tree} components={registry} />
      </ActionProvider>
    </DataProvider>
  )
}

当用户键入自然语言提示并按 Enter 时,库会流式输出 AI 的 JSON 响应,注册表渲染它,任何已定义的动作都会触发相应的回调函数。

高级功能

条件可见性

根据数据、身份验证或自定义逻辑显示或隐藏元素:

{ 'type': 'Alert', 'props': { 'message': 'Error occurred' }, 'visible': { 'and': [ { 'path': '/form/hasError' }, { 'not': { 'path': '/form/errorDismissed' } } ] } }

带确认的丰富动作

{ 'type': 'Button', 'props': { 'label': 'Refund Payment', 'action': { 'name': 'refund', 'params': { 'paymentId': { 'path': '/selected/id' } }, 'confirm': { 'title': 'Confirm Refund', 'variant': 'danger' } } } }

内置校验

{ 'type': 'TextField', 'props': { 'label': 'Email', 'valuePath': '/form/email', 'checks': [ { 'fn': 'required', 'message': 'Email is required' }, { 'fn': 'email', 'message': 'Invalid email' } ], 'validateOn': 'blur' } }

何时使用 JSON‑Render

  • 快速原型 – 仅用数分钟即可将提示转换为功能性仪表盘。
  • 解耦 UI 生成 – 将设计系统与 LLM 分离。
  • 安全 UI 渲染 – 守卫机制防止任意组件注入。
  • 跨平台 – 核心可在 React、React‑Native 或任何消费 JSON 的 UI 框架中使用。

开始使用

克隆仓库,添加你自己的 LLM 后端或使用提供的 OpenAI 适配器,随后执行 pnpm dev。新的 React 项目会自动导入渲染逻辑。欢迎根据自己的设计系统扩展目录或替换 registry 为更具样式的组件。

小贴士 – 在 localhost:3000 访问内置的 docs & playground,即可在不改动代码的情况下实验提示、更改目录并实时预览。

结论

JSON‑Render 为开发者提供了一条干净、类型安全的路径,让 LLM 能生成 UI 组件。通过始终保持可预测且受限的 JSON 格式,你可以在不牵安全、性能和用户体验的前提下,利用自然语言构建强大 UI。准备将 AI 生成的仪表盘融入你的产品了吗?从 NPM 获取包,今天就开始实验吧。

原创文章: 查看原文

分享本文