跳转到内容

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 时通常需要参考聊天上下文。


参考来源