Flint 完全指南:微软开源的 AI Agent 可视化中间语言,一行语义规范生成 Vega-Lite/ECharts/Chart.js 图表
让 AI 编码 Agent 在对话中生成图表是一件让无数开发者头疼的事——Agent 生成的 ECharts 配置要么缺轴线标签,要么图例堆成一团,要么在工具切换后渲染崩掉。问题是:Agent 生成的是「文本描述图表」而不是「图表本身」,它不知道数据量多大该用多大字号、什么位置该放图例。
Flint 正是微软研究院为解决这个痛点的开源方案——一个可视化中间语言,让 Agent 只输出紧凑的语义化规范,编译器自动推导出完整的高质量图表配置。它的核心价值在于:同样的 Flint 规范,可以编译到 Vega-Lite、ECharts 或 Chart.js 三种后端,且每个后端产出的都是开箱即用的成品。
安装与环境
Flint 以 npm 包形式发布,同时提供独立的 MCP 服务端用于 Agent 集成:
npm install flint-chart npx -y flint-chart-mcp
Node.js 18+ 即可,无需额外运行时。Python 移植版目前为源码预览,正式包待发布。
实战场景 1:用三行代码生成散点图
Flint 的核心 API 是 assembleVegaLite。你不需要碰 Vega-Lite 的 JSON Schema,只需提供数据、语义类型和图表类型:
import { assembleVegaLite } from 'flint-chart';
const spec = assembleVegaLite({
data: { values: carsData },
semantic_types: {
weight: 'Quantity',
mpg: 'Quantity',
origin: 'Country',
},
chart_spec: {
chartType: 'Scatter Plot',
encodings: {
x: { field: 'weight' },
y: { field: 'mpg' },
color: { field: 'origin' },
},
baseSize: { width: 400, height: 300 },
},
});
// → 返回可直接传给 Vega-Lite 渲染器的 spec 对象
这里的 semantic_types 是关键创新:Flint 内置了 70+ 语义类型(Rank, Temperature, Price, Country 等),编译器据此自动选择颜色映射、轴标签格式和刻度密度——Agent 不需要告诉它「把 Y 轴标签旋转 45 度」,因为 Quantity 类型意味着「数值轴,自动计算范围」。
实战场景 2:同一输入切三个后端
Flint 最有价值的能力是后端无关——同一个 ChartAssemblyInput,不改任何字段,同时编译到三个后端:
import {
assembleVegaLite,
assembleECharts,
assembleChartjs,
} from 'flint-chart';
const input = {
data: { values: salesData },
semantic_types: { month: 'Date', revenue: 'Price', region: 'Country' },
chart_spec: {
chartType: 'Grouped Bar Chart',
encodings: {
x: { field: 'month' },
y: { field: 'revenue' },
color: { field: 'region' },
},
baseSize: { width: 500, height: 350 },
},
};
const vlSpec = assembleVegaLite(input); // 可以渲染到 Vega-Embed
const echartsOpt = assembleECharts(input); // 直接传给 ECharts init
const chartjsCfg = assembleChartjs(input); // 传给 Chart.js new Chart()
这意味着你的 Agent 可以在同一个回合内「先用 Chart.js 快速预览,出图后再切到 ECharts 做交互式展示」——不需要重新学习每个后端特有的配置语法。
实战场景 3:通过 MCP 让 Agent 自主生成图表
flint-chart-mcp 是专为 AI Agent 设计的 MCP 服务端。启动后,Agent 可以像调用工具一样创建图表:
npx -y flint-chart-mcp
MCP 服务暴露的工具包括:
- 模板选择:Agent 从 30+ 种图表模板中选择
- 验证:检查 Flint 规范是否合法
- 渲染:返回 PNG/SVG 或后端原生 spec
在 Claude Code 或 Cursor 中配置 MCP:
{
"mcpServers": {
"flint-chart": {
"command": "npx",
"args": ["-y", "flint-chart-mcp"]
}
}
}
之后 Agent 可以在对话中直接说「把这份销售数据按月份和地区画成分组柱状图」,Flint MCP 服务器自动完成规范编译和渲染。数据可以直接嵌入 data.values,或通过 data.url 读取本地 JSON/CSV 文件。
最佳实践
- 优先用语义类型而非手动配置:Flint 的 70+ 语义类型覆盖了日期、货币、排名、温度、国家等常见语义,比手动调 legend 和 axis 高效得多。发现数据展示不理想时,先检查
semantic_types是否赋值正确,而非直接改 chart_spec。 - 开发阶段用 Chart.js 后端:Chart.js 的 bundle 最小(~60KB),适合在开发调试阶段快速渲染验证。定稿后用 Vega-Lite 或 ECharts 获得更丰富的交互能力。
- MCP 模式下合理设置
baseSize:Agent 生成的baseSize如果不匹配容器,图表会被截断或留白。建议在 MCP 客户端配置中设定容器的参考宽高比。 - 大型数据集预先聚合:Flint 不内置数据聚合,传给
data.values的数组应预先在服务端或 Agent 工作流中做 group-by 和聚合,避免浏览器端渲染卡顿。
总结
Flint 的创新不在于「新增一个图表库」,而在于让 AI Agent 和图表之间的交互从「猜配置」变成「说语义」。Agent 不必知道 Vega-Lite 的 scale.domain 或 ECharts 的 grid.right 怎么填,它只需要说出「这是什么数据、要画什么图」,Flint 编译器负责剩下的工作。
对于需要 Agent 定期生成报表、数据看板或演示文稿的团队,Flint 的 MCP 集成能做到「一句指令出图」,而三后端支持则让团队不受单一渲染框架的锁定。
相关链接