@ia-ccun/idea-plugin-share 0.0.79 → 0.0.80
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/package.json
CHANGED
package/plugins/GPT-Vis/346/234/254/345/234/260/351/203/250/347/275/262/346/211/213/345/206/214.md
ADDED
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
# GPT-Vis 本地部署手册
|
|
2
|
+
|
|
3
|
+
> AntV GPT-Vis 三件套在本机的完整搭建、接入、排障手册
|
|
4
|
+
> 最后更新:2026-10-29
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0. TL;DR
|
|
9
|
+
|
|
10
|
+
本机跑着三个进程、占两个端口:
|
|
11
|
+
|
|
12
|
+
| 进程 | 端口 | 目录 | 作用 |
|
|
13
|
+
|---|---|---|---|
|
|
14
|
+
| Next.js 站点 | 3000 | `~/icode/GPT-Vis/site` | 文档 + 26 种图表交互示例(给人看) |
|
|
15
|
+
| chart-render-server | 3001 | `~/icode/chart-render-server` | SSR 渲染 API,出 PNG(给 MCP 调) |
|
|
16
|
+
| mcp-server-chart | stdio | npx 拉起 | MCP 协议层,转发到 3001 |
|
|
17
|
+
|
|
18
|
+
启动:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 渲染服务(MCP 依赖它,必须先起)
|
|
22
|
+
cd ~/icode/chart-render-server && npm start # → http://localhost:3001
|
|
23
|
+
|
|
24
|
+
# 站点(可选,只是看示例用)
|
|
25
|
+
cd ~/icode/GPT-Vis/site && npm run dev # → http://localhost:3000
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
MCP 配置(已生效):`~/.aicode-cli/agent/mcp.json` → `mcp-server-chart` 项,
|
|
29
|
+
端点被 wrapper 脚本 `~/.aicode-cli/agent/bin/mcp-chart-server.sh` 钉死为
|
|
30
|
+
`http://localhost:3001/render`。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 1. GPT-Vis 是什么
|
|
35
|
+
|
|
36
|
+
[antvis/GPT-Vis](https://github.com/antvis/GPT-Vis) 是面向 LLM 应用的 AI 原生可视化库,
|
|
37
|
+
**不止是 UI 组件**,核心是一套让大模型能吐出来的图表语法。
|
|
38
|
+
|
|
39
|
+
仓库由三块组成,本地部署时用途完全不同:
|
|
40
|
+
|
|
41
|
+
| 组成 | 位置 | 本机用途 |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| 库本体 `@antv/gpt-vis` | 仓库根 `src/` | 构建产物供站点 / 自己的项目引用 |
|
|
44
|
+
| 文档站点 | 仓库 `site/` | Next.js 16 静态站,看文档和 26 个图表示例 |
|
|
45
|
+
| SSR 绑定 `@antv/gpt-vis-ssr` | 仓库 `bindings/gpt-vis-ssr/` | Node 里无头渲染成 PNG |
|
|
46
|
+
|
|
47
|
+
### 能力
|
|
48
|
+
|
|
49
|
+
- **26 种图表**:G2 引擎 20 种(area / bar / boxplot / column / dual-axes / funnel /
|
|
50
|
+
histogram / line / liquid / pie / radar / sankey / scatter / summary / table /
|
|
51
|
+
treemap / venn / violin / waterfall / word-cloud)+ G6 引擎 6 种
|
|
52
|
+
(fishbone-diagram / flow-diagram / indented-tree / mindmap / network-graph /
|
|
53
|
+
organization-chart)
|
|
54
|
+
- **3 套主题**:`default`(亮)/ `dark` / `academy`
|
|
55
|
+
- **两种输入**:JS 对象配置,或类 Markdown 的 DSL 语法
|
|
56
|
+
- **流式渲染**:`isVisSyntax()` 判断缓冲区是否是图表语法,LLM 边吐边画
|
|
57
|
+
|
|
58
|
+
### DSL 语法长这样
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
vis line
|
|
62
|
+
data
|
|
63
|
+
- time 2020
|
|
64
|
+
value 100
|
|
65
|
+
- time 2021
|
|
66
|
+
value 120
|
|
67
|
+
title My Chart
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
解析后等价于 `{ type: 'line', data: [...], title: 'My Chart' }`。
|
|
71
|
+
`data` / `categories` / `series` / `children` / `nodes` / `edges` 解析成数组,
|
|
72
|
+
`style` 解析成嵌套对象,值自动转 number / boolean(要保留字符串就加引号)。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 2. 环境快照
|
|
77
|
+
|
|
78
|
+
| 组件 | 版本 |
|
|
79
|
+
|---|---|
|
|
80
|
+
| Node.js | v24.21.0(要求 ≥ 20) |
|
|
81
|
+
| npm | 11.19.0 |
|
|
82
|
+
| pnpm | 12.11.2(要求 ≥ 8,CI 用 9) |
|
|
83
|
+
| Next.js | 16.4.3(Turbopack) |
|
|
84
|
+
| React | 19.2.3 |
|
|
85
|
+
| `@antv/gpt-vis` | 1.0.2 |
|
|
86
|
+
| `@antv/gpt-vis-ssr` | 0.3.8 |
|
|
87
|
+
| `@antv/mcp-server-chart` | 0.9.10 |
|
|
88
|
+
|
|
89
|
+
> ⚠️ Node 24 默认把 unhandled rejection 当致命错误直接杀进程。
|
|
90
|
+
> 渲染服务必须加 `--unhandled-rejections=warn`,见 §7.3。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 3. 部署
|
|
95
|
+
|
|
96
|
+
### 3.1 克隆 + 构建库本体
|
|
97
|
+
|
|
98
|
+
上游默认分支已经叫 `ai`(不是 `main`):
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cd ~/icode
|
|
102
|
+
git clone --depth 1 https://github.com/antvis/GPT-Vis.git
|
|
103
|
+
cd GPT-Vis
|
|
104
|
+
|
|
105
|
+
pnpm install # 装依赖(root)
|
|
106
|
+
pnpm build # father build → dist/{esm,cjs,umd}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
产物:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
dist/esm/index.js # ESM(package.json 的 module 字段)
|
|
113
|
+
dist/cjs/index.js # CommonJS
|
|
114
|
+
dist/umd/index.min.js # UMD,2.2 MB / gzip 653 KB
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**必须先构建库,站点才能装**——站点通过 `"@antv/gpt-vis": "file:.."` 引用父目录,
|
|
118
|
+
解析的是父目录 `package.json` 里的 `module: dist/esm/index.js`。
|
|
119
|
+
|
|
120
|
+
其他常用脚本:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
pnpm dev # 开发构建,只出 ESM,快
|
|
124
|
+
pnpm test # vitest
|
|
125
|
+
pnpm lint:ts # eslint
|
|
126
|
+
pnpm format # prettier
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 3.2 文档站点
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
cd ~/icode/GPT-Vis/site
|
|
133
|
+
npm install # file:.. 会把父目录软链进 node_modules
|
|
134
|
+
npm run dev # → http://localhost:3000
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
页面:
|
|
138
|
+
|
|
139
|
+
| 路径 | 内容 |
|
|
140
|
+
|---|---|
|
|
141
|
+
| `/` | 首页 |
|
|
142
|
+
| `/docs` | 文档(安装、语法、示例代码) |
|
|
143
|
+
| `/examples` | 示例画廊 |
|
|
144
|
+
| `/examples/<id>` | 单个图表详情,26 个 id 见 §5 |
|
|
145
|
+
|
|
146
|
+
**生产构建**:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
cd ~/icode/GPT-Vis/site
|
|
150
|
+
npm run build # → site/out/(33 个静态页)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
⚠️ `site/next.config.ts` 里是 `output: 'export'`,所以 **`npm start` 用不了**
|
|
154
|
+
(仓库 DEPLOYMENT.md 那段是错的,Next 16 的静态导出不支持 `next start`)。
|
|
155
|
+
实测报错:`Error: "next start" does not work with "output: export" configuration. Use "npx serve@latest out" instead.`
|
|
156
|
+
用任意静态服务器托管 `out/`:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
cd site/out && npx serve@latest out # Next 官方推荐
|
|
160
|
+
cd site/out && python3 -m http.server 3002 # 或 nginx / caddy
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> ⚠️ 静态托管时 `/examples/line-chart` 这种路由要落到 `.html` 文件,
|
|
164
|
+
> 纯静态服务器一般靠目录索引或 rewrite 规则处理。
|
|
165
|
+
|
|
166
|
+
### 3.3 SSR 渲染服务(chart-render-server)
|
|
167
|
+
|
|
168
|
+
本机已有这个项目:`~/icode/chart-render-server`,Express + `@antv/gpt-vis-ssr`,
|
|
169
|
+
把图表渲染成 PNG 存到 `public/charts/`,返回图片 URL。
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
server.js # 业务逻辑
|
|
173
|
+
public/charts/ # 渲染出来的 PNG
|
|
174
|
+
package.json
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
接口:
|
|
178
|
+
|
|
179
|
+
| 方法 | 路径 | 说明 |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| POST | `/render` | 渲染图表 → `{success, resultObj}` |
|
|
182
|
+
| GET | `/healthz` | 探活 → `{"ok":true}` |
|
|
183
|
+
| GET | `/charts/<file>.png` | 取渲染结果 |
|
|
184
|
+
|
|
185
|
+
启动:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
cd ~/icode/chart-render-server
|
|
189
|
+
npm start # → http://localhost:3001
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
(端口 3001 是 2026-10-29 调整的,原默认 3000 与站点冲突。)
|
|
193
|
+
|
|
194
|
+
冒烟测试:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
curl -s http://localhost:3001/healthz
|
|
198
|
+
curl -s -X POST http://localhost:3001/render \
|
|
199
|
+
-H "Content-Type: application/json" \
|
|
200
|
+
-d '{"type":"line","data":[{"time":"2025-05","value":512},{"time":"2025-06","value":1024}]}'
|
|
201
|
+
# {"success":true,"resultObj":"http://localhost:3001/charts/1793243083369-e2d615c9.png"}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 4. 接入 MCP
|
|
207
|
+
|
|
208
|
+
### 4.1 链路
|
|
209
|
+
|
|
210
|
+
```
|
|
211
|
+
AI 客户端
|
|
212
|
+
│ MCP stdio (JSON-RPC)
|
|
213
|
+
▼
|
|
214
|
+
mcp-server-chart (npx)
|
|
215
|
+
│ POST {type, ...options, source:"mcp-server-chart"}
|
|
216
|
+
▼
|
|
217
|
+
chart-render-server :3001
|
|
218
|
+
│ @antv/gpt-vis-ssr → g2-ssr / g6-ssr
|
|
219
|
+
▼
|
|
220
|
+
PNG 落盘 public/charts/ → 返回图片 URL
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
MCP 把返回的 URL 当文本交给模型,模型用 `` 渲染成图。
|
|
224
|
+
|
|
225
|
+
### 4.2 配置文件
|
|
226
|
+
|
|
227
|
+
`~/.aicode-cli/agent/mcp.json`:
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"mcpServers": {
|
|
232
|
+
"mcp-server-chart": {
|
|
233
|
+
"command": "/Users/jianjiang/.aicode-cli/agent/bin/mcp-chart-server.sh",
|
|
234
|
+
"args": [],
|
|
235
|
+
"lifecycle": "lazy-keep-alive",
|
|
236
|
+
"env": {
|
|
237
|
+
"VIS_REQUEST_SERVER": "http://localhost:3001/render"
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
wrapper 脚本 `~/.aicode-cli/agent/bin/mcp-chart-server.sh`:
|
|
245
|
+
|
|
246
|
+
```sh
|
|
247
|
+
#!/bin/sh
|
|
248
|
+
# Wrapper for @antv/mcp-server-chart: force the chart API endpoint.
|
|
249
|
+
# The Deck app spawns MCP servers from a cached spec (stale VIS_REQUEST_SERVER),
|
|
250
|
+
# so pin the endpoint here instead of relying on the config's env block.
|
|
251
|
+
export VIS_REQUEST_SERVER="http://localhost:3001/render"
|
|
252
|
+
exec npx -y @antv/mcp-server-chart "$@"
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
> 为什么要有 wrapper:Deck / 桌面端会**缓存 MCP spec**再拉起子进程,
|
|
256
|
+
> 配置文件里的 `env` 改动可能不生效,wrapper 里 `export` 才稳。
|
|
257
|
+
|
|
258
|
+
### 4.3 关键环境变量
|
|
259
|
+
|
|
260
|
+
| 变量 | 作用 | 默认 |
|
|
261
|
+
|---|---|---|
|
|
262
|
+
| `VIS_REQUEST_SERVER` | 自定义渲染服务地址(**不是网页地址**) | `https://antv-studio.alipay.com/api/gpt-vis` |
|
|
263
|
+
| `SERVICE_ID` | 服务标识,用于生成记录 | 无 |
|
|
264
|
+
| `DISABLED_TOOLS` | 逗号分隔的禁用工具名 | 无 |
|
|
265
|
+
|
|
266
|
+
### 4.4 地图工具要关掉
|
|
267
|
+
|
|
268
|
+
`generate_district_map` / `generate_path_map` / `generate_pin_map` 三个工具走的是
|
|
269
|
+
另一套报文 `{serviceId, tool, input, source}`,而本地 `/render` 只认 `type`,
|
|
270
|
+
会返回 `Missing 'type' field.`。
|
|
271
|
+
|
|
272
|
+
```json
|
|
273
|
+
"env": {
|
|
274
|
+
"VIS_REQUEST_SERVER": "http://localhost:3001/render",
|
|
275
|
+
"DISABLED_TOOLS": "generate_district_map,generate_path_map,generate_pin_map"
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### 4.5 验证 MCP 通了
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
{
|
|
283
|
+
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}'
|
|
284
|
+
sleep 1
|
|
285
|
+
printf '%s\n' '{"jsonrpc":"2.0","method":"notifications/initialized"}'
|
|
286
|
+
sleep 1
|
|
287
|
+
printf '%s\n' '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"generate_line_chart","arguments":{"type":"line","data":[{"time":"2025-05","value":512},{"time":"2025-06","value":1024}]}}}'
|
|
288
|
+
sleep 25
|
|
289
|
+
} | VIS_REQUEST_SERVER=http://localhost:3001/render npx -y @antv/mcp-server-chart
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
预期返回:
|
|
293
|
+
|
|
294
|
+
```json
|
|
295
|
+
{"content":[{"type":"text","text":"http://localhost:3001/charts/1793243098450-74981eda.png"}]}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 5. 图表类型支持矩阵
|
|
301
|
+
|
|
302
|
+
| 图表 | 站点示例 id | MCP 工具 | SSR 支持 |
|
|
303
|
+
|---|---|---|---|
|
|
304
|
+
| 面积图 | area-chart | `generate_area_chart` | ✅ area |
|
|
305
|
+
| 条形图 | bar-chart | `generate_bar_chart` | ✅ bar |
|
|
306
|
+
| 箱线图 | boxplot | `generate_boxplot_chart` | ✅ boxplot |
|
|
307
|
+
| 柱状图 | column-chart | `generate_column_chart` | ✅ column |
|
|
308
|
+
| 双轴图 | dual-axes | `generate_dual_axes_chart` | ✅ dual-axes |
|
|
309
|
+
| 鱼骨图 | fishbone-diagram | `generate_fishbone_diagram` | ✅ fishbone-diagram |
|
|
310
|
+
| 流程图 | flow-diagram | `generate_flow_diagram` | ✅ flow-diagram |
|
|
311
|
+
| 漏斗图 | funnel-chart | `generate_funnel_chart` | ✅ funnel |
|
|
312
|
+
| 直方图 | histogram | `generate_histogram_chart` | ✅ histogram |
|
|
313
|
+
| 折线图 | line-chart | `generate_line_chart` | ✅ line |
|
|
314
|
+
| 水波图 | liquid-chart | `generate_liquid_chart` | ✅ liquid |
|
|
315
|
+
| 思维导图 | mindmap | `generate_mind_map` | ✅ mind-map |
|
|
316
|
+
| 网络图 | network-graph | `generate_network_graph` | ✅ network-graph |
|
|
317
|
+
| 组织架构图 | organization-chart | `generate_organization_chart` | ✅ organization-chart |
|
|
318
|
+
| 饼图 | pie-chart | `generate_pie_chart` | ✅ pie |
|
|
319
|
+
| 雷达图 | radar-chart | `generate_radar_chart` | ✅ radar |
|
|
320
|
+
| 桑基图 | sankey-diagram | `generate_sankey_chart` | ✅ sankey |
|
|
321
|
+
| 散点图 | scatter-chart | `generate_scatter_chart` | ✅ scatter |
|
|
322
|
+
| 表格 | table | —(MCP 用 spreadsheet) | ✅ spreadsheet |
|
|
323
|
+
| 树图 | treemap | `generate_treemap_chart` | ✅ treemap |
|
|
324
|
+
| 韦恩图 | venn-diagram | `generate_venn_chart` | ✅ venn |
|
|
325
|
+
| 小提琴图 | violin-chart | `generate_violin_chart` | ✅ violin |
|
|
326
|
+
| 瀑布图 | waterfall-chart | `generate_waterfall_chart` | ✅ waterfall |
|
|
327
|
+
| 词云 | wordcloud | `generate_word_cloud_chart` | ✅ word-cloud |
|
|
328
|
+
| 指标卡 | summary | — | ❌ 仅浏览器端 |
|
|
329
|
+
| 缩进树 | indented-tree | — | ❌ 仅浏览器端 |
|
|
330
|
+
| 行政区地图 | — | `generate_district_map` | ❌ 需另配 |
|
|
331
|
+
| 路径地图 | — | `generate_path_map` | ❌ 需另配 |
|
|
332
|
+
| 钉钉地图 | — | `generate_pin_map` | ❌ 需另配 |
|
|
333
|
+
|
|
334
|
+
- 库本体:**26** 种(20 个 G2 + 6 个 G6)
|
|
335
|
+
- SSR:**24** 种
|
|
336
|
+
- MCP:**27** 个工具(24 个 SSR 图表 + 3 个地图)
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 6. 渲染 API 契约
|
|
341
|
+
|
|
342
|
+
### 6.1 请求
|
|
343
|
+
|
|
344
|
+
```http
|
|
345
|
+
POST /render
|
|
346
|
+
Content-Type: application/json
|
|
347
|
+
|
|
348
|
+
{
|
|
349
|
+
"type": "line",
|
|
350
|
+
"data": [...],
|
|
351
|
+
"title": "可选标题",
|
|
352
|
+
"theme": "default | dark | academy",
|
|
353
|
+
"width": 600,
|
|
354
|
+
"height": 400,
|
|
355
|
+
"style": { "texture": "default | rough" },
|
|
356
|
+
"source": "mcp-server-chart"
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
`type` 决定用哪个渲染器;`source` 是 MCP 客户端自动加的,忽略即可。
|
|
361
|
+
|
|
362
|
+
### 6.2 响应
|
|
363
|
+
|
|
364
|
+
```json
|
|
365
|
+
{ "success": true, "resultObj": "http://localhost:3001/charts/xxx.png" }
|
|
366
|
+
{ "success": false, "errorMessage": "Unknown chart type: xxx" }
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
出错也返回 **HTTP 200**,靠 `success` 字段判断——所以别只看 HTTP 状态码。
|
|
370
|
+
|
|
371
|
+
### 6.3 数据形状速查
|
|
372
|
+
|
|
373
|
+
| 类型 | data 形状 |
|
|
374
|
+
|---|---|
|
|
375
|
+
| 常规统计图(line / bar / pie / area …) | `[{x, y}]`,字段名随意,如 `{"time":"2025-05","value":512}` |
|
|
376
|
+
| tree 系列(mind-map / organization-chart / treemap) | `{"name":"根","children":[{"name":"子"}]}`,最多 3 层 |
|
|
377
|
+
| graph 系列(network-graph / flow-diagram) | `{"nodes":[{"name":"A"}],"edges":[{"source":"A","target":"B"}]}` |
|
|
378
|
+
| word-cloud | `[{"word":"AI","value":100}]` |
|
|
379
|
+
| spreadsheet | 二维数据(对应库里的 `table`) |
|
|
380
|
+
|
|
381
|
+
> ⚠️ network-graph / flow-diagram 的 `data` 必须是 `{nodes, edges}`,
|
|
382
|
+
> 传别的形状会报 `Cannot read properties of undefined (reading 'map')`。
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## 7. 日常运维
|
|
387
|
+
|
|
388
|
+
### 7.1 启停
|
|
389
|
+
|
|
390
|
+
```bash
|
|
391
|
+
# 渲染服务
|
|
392
|
+
cd ~/icode/chart-render-server
|
|
393
|
+
npm start # 前台
|
|
394
|
+
pkill -f "server.js" # 停
|
|
395
|
+
|
|
396
|
+
# 站点
|
|
397
|
+
cd ~/icode/GPT-Vis/site
|
|
398
|
+
npm run dev # 前台
|
|
399
|
+
pkill -f "next dev" # 停
|
|
400
|
+
|
|
401
|
+
# 站点生产构建 + 静态托管
|
|
402
|
+
npm run build && cd out && python3 -m http.server 3002
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### 7.2 日志位置
|
|
406
|
+
|
|
407
|
+
| 内容 | 位置 |
|
|
408
|
+
|---|---|
|
|
409
|
+
| 站点运行日志 | 前台终端;后台跑时自己重定向,如 `> /tmp/gpt-vis-dev.log` |
|
|
410
|
+
| **浏览器端报错** | 浏览器 F12 Console。静态导出站没有服务端日志,图表错误只在这 |
|
|
411
|
+
| Next dev 的浏览器报错转发 | 站点终端里 `[browser] ...` 前缀的行(Next 16 dev 特性) |
|
|
412
|
+
| 渲染服务日志 | `~/icode/chart-render-server/server.log`(`npm start` 时是终端;nohup 重定向到 `/tmp/chart-render-server.log`) |
|
|
413
|
+
| Next 构建诊断 | `~/icode/GPT-Vis/site/.next/diagnostics/build-diagnostics.json` |
|
|
414
|
+
| Next dev 性能 trace | `~/icode/GPT-Vis/site/.next/trace` |
|
|
415
|
+
| npm 安装日志 | `~/.npm/_logs/` |
|
|
416
|
+
| pnpm store | `~/.local/share/pnpm/store` |
|
|
417
|
+
|
|
418
|
+
### 7.3 已知稳定性问题
|
|
419
|
+
|
|
420
|
+
**渲染服务会被 g2-ssr 的异步异常打死。** Node 24 默认 unhandled rejection = 崩溃,
|
|
421
|
+
一个失败请求可能在响应发出后把整个进程带走,之后所有 MCP 调用都是 ECONNREFUSED。
|
|
422
|
+
|
|
423
|
+
已处理:`package.json` 的 start 脚本加了 `--unhandled-rejections=warn`。
|
|
424
|
+
|
|
425
|
+
```json
|
|
426
|
+
"start": "PORT=3001 node --unhandled-rejections=warn server.js"
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**站点 dev 下有 G6 销毁竞态**:StrictMode 双挂载时 `destroy()` 早于异步 `draw()`,
|
|
430
|
+
控制台报 `Cannot read properties of undefined (reading 'draw')` +
|
|
431
|
+
`[G6 v5.1.1] The graph instance has been destroyed`。
|
|
432
|
+
来自 `@antv/g6/esm/runtime/graph.js:917` 的 `this.context.element.draw(...)` 无空值保护。
|
|
433
|
+
不影响页面显示,仅 dev 出现,静态产物里没有。
|
|
434
|
+
|
|
435
|
+
### 7.4 健康检查
|
|
436
|
+
|
|
437
|
+
```bash
|
|
438
|
+
curl -s http://localhost:3001/healthz # {"ok":true}
|
|
439
|
+
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3000/ # 站点 200
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## 8. 故障排查
|
|
445
|
+
|
|
446
|
+
| 症状 | 原因 | 处理 |
|
|
447
|
+
|---|---|---|
|
|
448
|
+
| MCP 报 `success` undefined / `Error (undefined)` | `VIS_REQUEST_SERVER` 指到了网页而不是渲染 API | 改成 `http://localhost:3001/render` |
|
|
449
|
+
| MCP 报 `Missing 'type' field.` | 地图工具走了另一套报文 | 加 `DISABLED_TOOLS` 关掉 3 个地图工具 |
|
|
450
|
+
| MCP `ECONNREFUSED` | 渲染服务没起,或被 g2-ssr 异步异常打死 | `npm start` 重起;确认启动参数带 `--unhandled-rejections=warn` |
|
|
451
|
+
| 改了 mcp.json 但端点没变 | 客户端缓存了 MCP spec | 用 wrapper 脚本 `export` 钉死端点 |
|
|
452
|
+
| 站点 `Module not found: '@antv/gpt-vis'` | 库本体没构建 | 根目录 `pnpm build` 后重装 site 依赖 |
|
|
453
|
+
| 站点 `/examples/xxx` 500 `missing param in generateStaticParams` | URL 的 id 写错了 | 用 §5 里的真实 id(如 `line-chart`,不是 `line`) |
|
|
454
|
+
| `npm start` 报 `"next start" does not work with "output: export"` | 站点是静态导出 | `npx serve out` 托管 `site/out/` |
|
|
455
|
+
| 渲染报 `Unknown chart type: xxx` | type 用了 MCP 工具名 | 用图表类型名(`mind-map` 不是 `mind_map`) |
|
|
456
|
+
| 渲染报 `reading 'map'` | network-graph / flow-diagram 的 data 形状错 | 传 `{nodes, edges}` |
|
|
457
|
+
| 端口起不来 EADDRINUSE | 3000/3001 被占 | `lsof -nP -iTCP -sTCP:LISTEN \| grep node` |
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## 9. 在自己的项目里用这个库
|
|
462
|
+
|
|
463
|
+
只想画图、不需要 MCP 的话,直接装 npm 包,不用 clone:
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
npm install @antv/gpt-vis
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
```js
|
|
470
|
+
import { GPTVis } from '@antv/gpt-vis';
|
|
471
|
+
|
|
472
|
+
const gptVis = new GPTVis({
|
|
473
|
+
container: 'container', // string | HTMLElement
|
|
474
|
+
width: 600,
|
|
475
|
+
height: 400,
|
|
476
|
+
theme: 'default', // 'default' | 'dark' | 'academy'
|
|
477
|
+
wrapper: false, // true = 带 Chart/Code 切换 + 下载/复制/缩放的外壳
|
|
478
|
+
locale: 'zh-CN',
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
gptVis.render({
|
|
482
|
+
type: 'line',
|
|
483
|
+
data: [
|
|
484
|
+
{ time: '2020', value: 100 },
|
|
485
|
+
{ time: '2021', value: 120 },
|
|
486
|
+
],
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
gptVis.destroy();
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
流式渲染(LLM 边生成边画):
|
|
493
|
+
|
|
494
|
+
```js
|
|
495
|
+
import { GPTVis, isVisSyntax } from '@antv/gpt-vis';
|
|
496
|
+
|
|
497
|
+
const gptVis = new GPTVis({ container: 'container', width: 600, height: 400 });
|
|
498
|
+
let buffer = '';
|
|
499
|
+
|
|
500
|
+
function onToken(token) {
|
|
501
|
+
buffer += token;
|
|
502
|
+
if (isVisSyntax(buffer)) gptVis.render(buffer); // 直接传 DSL 字符串
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## 10. 目录索引
|
|
509
|
+
|
|
510
|
+
```
|
|
511
|
+
~/icode/GPT-Vis/ # 上游 clone,默认分支 ai
|
|
512
|
+
├── src/ # 库源码(26 种图表)
|
|
513
|
+
├── site/ # Next.js 16 站点
|
|
514
|
+
│ ├── app/{docs,examples}/
|
|
515
|
+
│ └── out/ # npm run build 产物
|
|
516
|
+
├── bindings/gpt-vis-ssr/ # SSR 绑定(只读参考,本机用的是 npm 包)
|
|
517
|
+
├── public/, evaluations/, skills/
|
|
518
|
+
└── CLAUDE.md # 仓库开发说明
|
|
519
|
+
|
|
520
|
+
~/icode/chart-render-server/ # 本机自建渲染服务
|
|
521
|
+
├── server.js # Express + gpt-vis-ssr
|
|
522
|
+
├── public/charts/ # PNG 输出目录
|
|
523
|
+
├── package.json # start: PORT=3001 node --unhandled-rejections=warn server.js
|
|
524
|
+
└── server.log
|
|
525
|
+
|
|
526
|
+
~/.aicode-cli/agent/mcp.json # MCP 配置
|
|
527
|
+
~/.aicode-cli/agent/bin/mcp-chart-server.sh # 端点 wrapper
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
## 11. 参考
|
|
533
|
+
|
|
534
|
+
- 上游仓库:https://github.com/antvis/GPT-Vis
|
|
535
|
+
- 官方站点:https://gpt-vis.antv.vision
|
|
536
|
+
- MCP 服务:https://github.com/antvis/mcp-server-chart
|
|
537
|
+
- SSR 绑定:https://github.com/antvis/GPT-Vis/tree/main/bindings/gpt-vis-ssr
|
|
538
|
+
- 仓库自带开发说明:`~/icode/GPT-Vis/CLAUDE.md`
|
|
Binary file
|
|
Binary file
|