react-ai-renderer 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -105
- package/dist/index.cjs +2362 -2177
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2362 -2177
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -1,26 +1,50 @@
|
|
|
1
|
-
# React AI Renderer
|
|
1
|
+
# React AI Renderer - AI 应用的专属渲染器
|
|
2
2
|
|
|
3
3
|
[English](./README_en.md) | 中文
|
|
4
4
|
|
|
5
|
-
一个专为 AI 应用程序设计的
|
|
5
|
+
> 一个专为 AI 应用程序设计的 UI 渲染器,可以极大增强 AI 与前端的交互方式。支持流式 JSX/XML 渲染、自定义组件、生命周期钩子,让 AI 输出直接变为交互式 UI。
|
|
6
6
|
|
|
7
|
-
## 📋 环境要求
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
- React
|
|
8
|
+
<p align="center">
|
|
9
|
+
<img src="./examples/demo-assets/react-ai-renderer.gif" alt="React AI Renderer Demo" width="800" />
|
|
10
|
+
</p>
|
|
11
|
+
<p align="center"><em>React AI Renderer - 实现 AI 输出到交互式 UI 的无缝转换</em></p>
|
|
11
12
|
|
|
12
|
-
##
|
|
13
|
+
## 🚀 项目愿景
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
在 AI 应用井喷式爆发的今天,以 Chat Bot 为核心的交互已成为主流。然而,传统的文本化输出方式远远无法满足现代 AI 应用对视觉渲染效果的需求。React AI Renderer 提供了完美的解决方案:
|
|
16
|
+
|
|
17
|
+
### 传统方式的痛点
|
|
18
|
+
|
|
19
|
+
1. **等待问题**:LLM 是流式输出的,但 JSON 必须等流结束才能完整交付给前端渲染
|
|
20
|
+
2. **构建成本高**:构建 JSON 和约定渲染本身成本较高,也容易出错
|
|
21
|
+
3. **缺乏生命周期管理**:无法在渲染之后触发动作,传统 Markdown 渲染器无法满足复杂交互需求
|
|
22
|
+
|
|
23
|
+
### React AI Renderer 的解决方案
|
|
24
|
+
|
|
25
|
+
React AI Renderer 彻底解决了上述问题,让 AI 可以直接输出标准的 JSX/XML 语法糖,由前端实时渲染为交互式 UI,同时支持完整的生命周期管理。
|
|
26
|
+
|
|
27
|
+
## 🌟 核心特性
|
|
28
|
+
|
|
29
|
+
### ✅ 无缝兼容 React Markdown
|
|
30
|
+
只需将引入名称从 `react-markdown` 改为 `react-ai-renderer`,即可无感知继承现有能力,零成本迁移。
|
|
31
|
+
|
|
32
|
+
### ✅ 自定义组件渲染
|
|
33
|
+
支持基于项目已有的前端 UI 进行渲染,无限拉高产品体验上限,复用现有视觉主题。
|
|
34
|
+
|
|
35
|
+
### ✅ 真正的流式渲染
|
|
36
|
+
动态 token 对应动态解析,无需像 JSON 格式那样等待模型输出完毕才能看到视觉效果。
|
|
37
|
+
|
|
38
|
+
### ✅ 组件生命周期钩子
|
|
39
|
+
单一组件渲染完毕后可触发下一个事件,轻松实现文件列表+文件内容左右分栏等复杂交互效果。
|
|
40
|
+
|
|
41
|
+
### ✅ 丰富的内置组件
|
|
15
42
|
- **AI 推理展示**:内置 Think 组件展示 AI 思考过程
|
|
16
43
|
- **代码高亮**:支持多种编程语言的代码高亮显示
|
|
17
44
|
- **数学公式**:使用 KaTeX 渲染数学公式
|
|
18
|
-
- **Mermaid
|
|
19
|
-
- **GitHub样式**:使用GitHub风格的Markdown渲染样式
|
|
20
|
-
- **自定义组件**:支持用户注册自定义组件和生命周期钩子
|
|
21
|
-
- **兼容性**:兼容现代 React 版本,提供 TypeScript 类型定义
|
|
45
|
+
- **Mermaid 图表**:支持流程图、时序图等(可选功能)
|
|
22
46
|
|
|
23
|
-
## 📦
|
|
47
|
+
## 📦 安装使用
|
|
24
48
|
|
|
25
49
|
```bash
|
|
26
50
|
npm install react-ai-renderer
|
|
@@ -42,51 +66,7 @@ npm install mermaid
|
|
|
42
66
|
|
|
43
67
|
如果不安装 mermaid,图表将不会渲染,但不会影响其他功能。
|
|
44
68
|
|
|
45
|
-
##
|
|
46
|
-
|
|
47
|
-
React AI Renderer 现在支持 GitHub 风格的 Markdown 渲染样式,使渲染的 Markdown 内容具有与 GitHub 上相同的外观和感觉。
|
|
48
|
-
|
|
49
|
-
### 特性
|
|
50
|
-
|
|
51
|
-
- GitHub风格的排版和间距
|
|
52
|
-
- 代码块的语法高亮
|
|
53
|
-
- 表格样式优化
|
|
54
|
-
- 链接样式
|
|
55
|
-
- 标题样式(包括下划线效果)
|
|
56
|
-
- 引用块样式
|
|
57
|
-
- 列表样式优化
|
|
58
|
-
|
|
59
|
-
### 使用方法
|
|
60
|
-
|
|
61
|
-
组件会自动应用GitHub样式,无需额外配置:
|
|
62
|
-
|
|
63
|
-
```jsx
|
|
64
|
-
import ReactAIRenderer from 'react-ai-renderer';
|
|
65
|
-
|
|
66
|
-
function MyComponent() {
|
|
67
|
-
const markdownContent = `
|
|
68
|
-
# 标题
|
|
69
|
-
|
|
70
|
-
这是一个 **粗体** 文本和 *斜体* 文本。
|
|
71
|
-
|
|
72
|
-
\`\`\`javascript
|
|
73
|
-
console.log('Hello, World!');
|
|
74
|
-
\`\`\`
|
|
75
|
-
|
|
76
|
-
| 列1 | 列2 |
|
|
77
|
-
|-----|-----|
|
|
78
|
-
| 数据1 | 数据2 |
|
|
79
|
-
`;
|
|
80
|
-
|
|
81
|
-
return <ReactAIRenderer content={markdownContent} />;
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
查看 [GITHUB_STYLE_USAGE.md](./GITHUB_STYLE_USAGE.md) 获取更多使用详情。
|
|
86
|
-
|
|
87
|
-
## 🚀 快速开始
|
|
88
|
-
|
|
89
|
-
查看 [examples/example.tsx](./examples/example.tsx) 文件了解完整的使用示例。
|
|
69
|
+
## 🎯 快速开始
|
|
90
70
|
|
|
91
71
|
### 基础使用
|
|
92
72
|
|
|
@@ -94,8 +74,9 @@ console.log('Hello, World!');
|
|
|
94
74
|
import ReactAIRenderer from 'react-ai-renderer';
|
|
95
75
|
|
|
96
76
|
const content = `
|
|
97
|
-
#
|
|
98
|
-
|
|
77
|
+
# 欢迎使用 React AI Renderer
|
|
78
|
+
|
|
79
|
+
这是一个 **粗体** 文本和 *斜体* 文本。
|
|
99
80
|
|
|
100
81
|
\`\`\`javascript
|
|
101
82
|
console.log('Hello World');
|
|
@@ -107,92 +88,154 @@ function App() {
|
|
|
107
88
|
}
|
|
108
89
|
```
|
|
109
90
|
|
|
110
|
-
### AI
|
|
91
|
+
### AI 流式输出渲染
|
|
111
92
|
|
|
112
93
|
```tsx
|
|
113
94
|
import ReactAIRenderer from 'react-ai-renderer';
|
|
114
95
|
|
|
115
|
-
|
|
96
|
+
// 模拟 AI 流式输出内容
|
|
97
|
+
const aiContent = `
|
|
116
98
|
正在分析用户需求...
|
|
117
99
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
100
|
+
<Table>
|
|
101
|
+
<TableHeader>
|
|
102
|
+
<TableCell header>产品名称</TableCell>
|
|
103
|
+
<TableCell header>价格</TableCell>
|
|
104
|
+
<TableCell header>库存</TableCell>
|
|
105
|
+
</TableHeader>
|
|
106
|
+
<TableRow>
|
|
107
|
+
<TableCell>iPhone 15</TableCell>
|
|
108
|
+
<TableCell>¥5999</TableCell>
|
|
109
|
+
<TableCell>50</TableCell>
|
|
110
|
+
</TableRow>
|
|
111
|
+
</Table>
|
|
122
112
|
`;
|
|
123
113
|
|
|
124
114
|
function App() {
|
|
125
|
-
return <ReactAIRenderer>{
|
|
115
|
+
return <ReactAIRenderer>{aiContent}</ReactAIRenderer>;
|
|
126
116
|
}
|
|
127
117
|
```
|
|
128
118
|
|
|
129
|
-
###
|
|
119
|
+
### 自定义组件与生命周期
|
|
130
120
|
|
|
131
121
|
```tsx
|
|
132
122
|
import ReactAIRenderer from 'react-ai-renderer';
|
|
133
123
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
124
|
+
// 自定义按钮组件
|
|
125
|
+
const Button = ({ onClick, children, style }) => (
|
|
126
|
+
<button
|
|
127
|
+
onClick={onClick}
|
|
128
|
+
style={{
|
|
129
|
+
backgroundColor: 'blue',
|
|
130
|
+
color: 'white',
|
|
131
|
+
padding: '8px 16px',
|
|
132
|
+
border: 'none',
|
|
133
|
+
borderRadius: '4px',
|
|
134
|
+
cursor: 'pointer',
|
|
135
|
+
...style
|
|
136
|
+
}}
|
|
137
|
+
>
|
|
138
|
+
{children}
|
|
139
|
+
</button>
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
// 组件生命周期钩子
|
|
143
|
+
const componentHandlers = [
|
|
144
|
+
{
|
|
145
|
+
name: 'Button',
|
|
146
|
+
component: Button,
|
|
147
|
+
selfClosing: false,
|
|
148
|
+
onRender: (item, scope) => {
|
|
149
|
+
console.log('Button 组件已渲染完成');
|
|
150
|
+
// 可以在这里触发下一个动作
|
|
151
|
+
// 例如:更新状态、发送请求等
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
];
|
|
137
155
|
|
|
138
156
|
const content = `
|
|
139
157
|
<Button onClick={() => alert('点击了按钮')}>点击我</Button>
|
|
140
158
|
`;
|
|
141
159
|
|
|
142
160
|
function App() {
|
|
143
|
-
return
|
|
161
|
+
return (
|
|
162
|
+
<ReactAIRenderer
|
|
163
|
+
components={{ Button }}
|
|
164
|
+
componentHandlers={componentHandlers}
|
|
165
|
+
>
|
|
166
|
+
{content}
|
|
167
|
+
</ReactAIRenderer>
|
|
168
|
+
);
|
|
144
169
|
}
|
|
145
170
|
```
|
|
146
171
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
```tsx
|
|
150
|
-
import ReactAIRenderer from 'react-ai-renderer';
|
|
151
|
-
|
|
152
|
-
const content = `
|
|
153
|
-
\`\`\`mermaid
|
|
154
|
-
graph TD
|
|
155
|
-
A[开始] --> B[处理]
|
|
156
|
-
B --> C[结束]
|
|
157
|
-
\`\`\`
|
|
158
|
-
`;
|
|
159
|
-
|
|
160
|
-
function App() {
|
|
161
|
-
return <ReactAIRenderer>{content}</ReactAIRenderer>;
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
## 🛠️ API
|
|
172
|
+
## 🛠️ API 参考
|
|
166
173
|
|
|
167
174
|
### ReactAIRenderer 组件
|
|
168
175
|
|
|
169
|
-
|
|
176
|
+
主渲染组件,完全兼容 ReactMarkdown API。
|
|
170
177
|
|
|
171
178
|
Props:
|
|
172
179
|
- `content`: Markdown/MDX 内容字符串
|
|
173
180
|
- `scope`: 传递给 MDX 的作用域对象
|
|
174
181
|
- `components`: 自定义组件映射
|
|
175
|
-
- `componentHandlers`:
|
|
182
|
+
- `componentHandlers`: 组件处理器数组(支持生命周期钩子)
|
|
176
183
|
- `children`: 作为内容的子元素(替代 content)
|
|
177
184
|
|
|
178
|
-
###
|
|
185
|
+
### 组件生命周期钩子
|
|
179
186
|
|
|
180
|
-
|
|
187
|
+
通过 `componentHandlers` 属性可以为组件添加生命周期钩子:
|
|
181
188
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
189
|
+
```tsx
|
|
190
|
+
const componentHandlers = [
|
|
191
|
+
{
|
|
192
|
+
name: 'MyComponent',
|
|
193
|
+
component: MyComponent,
|
|
194
|
+
selfClosing: false,
|
|
195
|
+
onRender: (item, scope) => {
|
|
196
|
+
// 组件渲染完成后的回调
|
|
197
|
+
console.log('组件已渲染:', item);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
];
|
|
201
|
+
```
|
|
185
202
|
|
|
186
|
-
|
|
203
|
+
## ⚡ 性能优势
|
|
187
204
|
|
|
188
|
-
|
|
205
|
+
### 实时渲染
|
|
206
|
+
- 流式解析,无需等待完整内容
|
|
207
|
+
- 动态组件渲染,提升用户体验
|
|
208
|
+
- 内存优化,避免重复渲染
|
|
189
209
|
|
|
190
|
-
|
|
191
|
-
-
|
|
192
|
-
-
|
|
193
|
-
-
|
|
210
|
+
### 兼容性保障
|
|
211
|
+
- 完全兼容 React 18+
|
|
212
|
+
- 支持 TypeScript 类型安全
|
|
213
|
+
- 无依赖冲突,轻松集成
|
|
214
|
+
|
|
215
|
+
## 💡 应用场景
|
|
216
|
+
|
|
217
|
+
### 1. AI 助手应用
|
|
218
|
+
让 AI 助手直接输出交互式 UI,提升用户体验
|
|
194
219
|
|
|
195
|
-
|
|
220
|
+
### 2. 代码生成工具
|
|
221
|
+
AI 生成的代码可以直接渲染为可交互的组件
|
|
222
|
+
|
|
223
|
+
### 3. 数据分析报告
|
|
224
|
+
AI 分析结果可直接渲染为图表和表格
|
|
225
|
+
|
|
226
|
+
### 4. 教育培训系统
|
|
227
|
+
AI 生成的教学内容可直接渲染为交互式课件
|
|
228
|
+
|
|
229
|
+
### 5. 智能文档系统
|
|
230
|
+
AI 生成的文档可直接渲染为富交互页面
|
|
231
|
+
|
|
232
|
+
### 6. 低代码平台
|
|
233
|
+
AI 辅助生成界面,直接渲染为可用组件
|
|
234
|
+
|
|
235
|
+
### 7. 自动化运维
|
|
236
|
+
AI 分析结果可直接渲染为操作界面
|
|
237
|
+
|
|
238
|
+
## 📖 示例运行
|
|
196
239
|
|
|
197
240
|
运行示例:
|
|
198
241
|
|
|
@@ -200,7 +243,7 @@ Props:
|
|
|
200
243
|
npm run example
|
|
201
244
|
```
|
|
202
245
|
|
|
203
|
-
然后在浏览器中访问 http://localhost:3000
|
|
246
|
+
然后在浏览器中访问 http://localhost:3000
|
|
204
247
|
|
|
205
248
|
## 🧪 测试
|
|
206
249
|
|
|
@@ -208,6 +251,79 @@ npm run example
|
|
|
208
251
|
npm test
|
|
209
252
|
```
|
|
210
253
|
|
|
254
|
+
## 🚀 高级特性
|
|
255
|
+
|
|
256
|
+
### 流式渲染优化
|
|
257
|
+
React AI Renderer 采用先进的流式解析技术,能够在 AI 模型输出的同时实时渲染内容,无需等待完整输出。
|
|
258
|
+
|
|
259
|
+
### 组件注册机制
|
|
260
|
+
支持动态组件注册,可以灵活扩展自定义组件:
|
|
261
|
+
|
|
262
|
+
```tsx
|
|
263
|
+
const customComponents = {
|
|
264
|
+
MyButton: ({ onClick, children }) => (
|
|
265
|
+
<button onClick={onClick} className="custom-button">
|
|
266
|
+
{children}
|
|
267
|
+
</button>
|
|
268
|
+
)
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
<ReactAIRenderer components={customComponents}>
|
|
272
|
+
{content}
|
|
273
|
+
</ReactAIRenderer>
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 作用域传递
|
|
277
|
+
支持向组件传递作用域变量,实现更复杂的数据交互:
|
|
278
|
+
|
|
279
|
+
```tsx
|
|
280
|
+
const scope = {
|
|
281
|
+
userData: { name: "张三", age: 25 },
|
|
282
|
+
onAction: (data) => console.log("Action triggered:", data)
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
<ReactAIRenderer scope={scope}>
|
|
286
|
+
{content}
|
|
287
|
+
</ReactAIRenderer>
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## 📊 架构设计
|
|
291
|
+
|
|
292
|
+
### 系统架构图
|
|
293
|
+
|
|
294
|
+
```mermaid
|
|
295
|
+
graph TD
|
|
296
|
+
A[AI Model] -->|Streaming Output| B[React AI Renderer]
|
|
297
|
+
B -->|Parse JSX/XML| C[MDX Streaming Parser]
|
|
298
|
+
C -->|Component Data| D[Component Renderer]
|
|
299
|
+
D -->|Render Components| E[Custom UI Components]
|
|
300
|
+
D -->|Lifecycle Hooks| F[Event Triggers]
|
|
301
|
+
E --> G[Interactive UI]
|
|
302
|
+
F --> H[Next Actions]
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 工作流程
|
|
306
|
+
|
|
307
|
+
1. AI 模型流式输出 JSX/XML 格式的内容
|
|
308
|
+
2. React AI Renderer 实时接收并解析内容
|
|
309
|
+
3. MDX Streaming Parser 动态解析组件数据
|
|
310
|
+
4. Component Renderer 渲染自定义 UI 组件
|
|
311
|
+
5. 触发生命周期钩子,执行后续动作
|
|
312
|
+
|
|
313
|
+
## ❓ 常见问题
|
|
314
|
+
|
|
315
|
+
### Q: React AI Renderer 与 react-markdown 有什么区别?
|
|
316
|
+
A: React AI Renderer 完全兼容 react-markdown,但增加了对 JSX/XML 组件的支持、流式渲染和生命周期钩子等高级功能。
|
|
317
|
+
|
|
318
|
+
### Q: 如何处理未注册的组件?
|
|
319
|
+
A: 未注册的组件会自动转换为对应的文本表示形式,不会导致页面崩溃。
|
|
320
|
+
|
|
321
|
+
### Q: 是否支持不同组件库如antd,shadcn等
|
|
322
|
+
A: 是的,React AI Renderer 无组件依赖,你可以使用任意组件库以及自定义组件
|
|
323
|
+
|
|
324
|
+
### Q: 性能如何优化?
|
|
325
|
+
A: 建议合理使用组件生命周期钩子,避免在渲染过程中执行耗时操作。
|
|
326
|
+
|
|
211
327
|
## 📄 许可证
|
|
212
328
|
|
|
213
329
|
MIT
|