跳转到内容

Generative UI(Artifacts)系统

Generative UI(Artifacts)系统

学习目标

本章聚焦 LibreChat 的 Artifacts 系统。你将了解:

  • Artifacts 的前端组件架构与版本管理
  • React 组件、HTML 与 Mermaid 图表的三种渲染模式
  • 代码编辑器与预览窗口的同步机制
  • 下载与分享功能

前置知识

  • React 组件基础
  • 沙箱 iframe 安全模型

项目实践

前端组件架构

Artifacts 系统的核心组件:

Artifacts/
├── Artifacts.tsx # 主容器,管理 artifact 状态
├── Artifact.tsx # 单个 artifact 展示
├── ArtifactTabs.tsx # 代码/预览/可视化标签页切换
├── ArtifactCodeEditor.tsx # 代码编辑器(Monaco)
├── ArtifactPreview.tsx # 实时预览窗口
├── ArtifactButton.tsx # artifact 触发按钮
├── ArtifactVersion.tsx # 版本回溯
├── DownloadArtifact.tsx # 下载功能
├── Code.tsx # 代码渲染
└── Mermaid.tsx # Mermaid 图表渲染

三种渲染模式

Artifacts 支持三种内容类型:

类型渲染方式安全性
React 组件沙箱 iframe + Monaco 编辑器高(iframe 隔离)
HTML 页面沙箱 iframe + srcdoc中(CSP 限制)
Mermaid 图表mermaid.js 直接渲染高(纯 SVG)

React 组件渲染流程

1. LLM 输出 React 组件代码
2. 代码存入 artifact 状态
3. Monaco 编辑器展示代码(可编辑)
4. 预览 iframe 通过 srcdoc 加载
5. 版本切换回溯历史代码

版本管理

ArtifactVersion.tsx 支持多版本管理:

每次 LLM 生成 artifact 内容时:
1. 创建新版本号
2. 保留旧版本
3. 用户可切换查看历史版本
4. 用户可下载任意版本

下载功能

DownloadArtifact.tsx 支持多种下载格式:

React 组件 → .jsx/.tsx 文件
HTML 页面 → .html 文件
Mermaid 图表 → .svg/.png 文件

问题与规避

问题 1:iframe 中的 React 组件执行环境不安全

规避:使用沙箱 iframe 的 sandbox 属性限制权限:

  • allow-scripts:允许 JS 执行(渲染 React 组件需要)
  • 不设置 allow-same-origin:防止访问父页面 DOM
  • 不设置 allow-forms:防止表单提交

问题 2:Mermaid 图表渲染阻塞主线程

规避Mermaid.tsx 使用异步渲染,mermaid.run() 不阻塞组件挂载。大图表使用 Web Worker(如果可用)。

问题 3:artifact 内容过大影响聊天性能

规避:artifact 内容通过引用传递,不直接嵌入聊天消息。聊天消息仅包含 artifact 的元数据(类型、版本、尺寸),实际内容按需加载。


设计取舍

内嵌预览 vs 弹出窗口

方案优势代价
内嵌(LibreChat)保留聊天上下文、代码与预览并排占用聊天区域空间
弹出窗口更大预览空间丢失聊天上下文

LibreChat 选择了内嵌,因为用户在查看 artifact 时通常需要参考聊天上下文。


参考来源