AI可编辑架构图!这个 8.2k stars 的项目如何把 30 分钟的绘图工作压缩到 30 秒

AI可编辑架构图!这个 8.2k stars 的项目如何把 30 分钟的绘图工作压缩到 30 秒

从 XML 生成到流式渲染

draw.io 是技术架构设计中的标配工具。但问题在于,每次画一个完整的云架构图需要花费 30 分钟以上,而其中 80% 的时间用于拖拽组件和调整布局。这种重复劳动正在成为技术团队的效率瓶颈。 Next AI Draw.io 的作者 DayuanJiang 提出了一个截然不同的解决路径:既然 draw.io 的底层是 XML,为什么不让 LLM 直接生成这些 XML?这个项目在 GitHub 上获得了 8.2k stars,背后的原因很简单------它真的能用。

项目地址: github.com/DayuanJiang...

在线体验

技术架构拆解:三层抽象的精妙设计

  1. 前端层:Next.js + React DrawIO

项目基于 Next.js 14+ App Router 构建,前端使用 react-drawio 库嵌入 draw.io 编辑器。这个设计的关键在于状态管理:

typescript 复制代码
const DiagramContext = createContext({
  xml: null,
  updateXML: (newXML: string) => void,
  history: [],
  rollback: (version: number) => void
})

前端并不直接操作 Canvas API,而是通过修改 XML 字符串来驱动视图更新。这种架构使得 AI 生成的内容可以无缝接入。


  1. AI 层:Vercel AI SDK 的流式响应

核心在于 /api/chat/route.ts,这里使用 Vercel AI SDK 的 streamText 函数处理 LLM 调用:

typescript 复制代码
const result = await streamText({
  model: anthropic('claude-sonnet-4-20250514'),
  messages: convertToModelMessages(messages),
  tools: {
    updateDiagram: tool({
      description: 'Generate or modify draw.io XML',
      parameters: z.object({
        xml: z.string(),
        action: z.enum(['create', 'modify'])
      }),
      execute: async ({ xml, action }) => {
        return { success: true, xml }
      }
    })
  }
})

这里有两个技术要点:

  • Tool Calling 机制: LLM 并不直接返回 XML,而是调用 updateDiagram 工具,这样可以在执行前进行格式校验
  • 流式传输: streamText 返回的 Response 可以直接作为 Server-Sent Events 推送给客户端,实现打字机效果

  1. 数据层:XML 序列化与版本控制

每次用户提交 prompt,系统会:

  1. 将当前 XML 状态序列化存入 history 数组
  2. 调用 LLM 生成新的 XML
  3. 对比新旧 XML 的 diff,只更新变化的节点
typescript 复制代码
function applyXMLDiff(oldXML: string, newXML: string) {
  const parser = new DOMParser()
  const oldDoc = parser.parseFromString(oldXML, 'text/xml')
  const newDoc = parser.parseFromString(newXML, 'text/xml')
  
  const changedNodes = []
  traverseNodes(oldDoc, newDoc, (old, new) => {
    if (old.outerHTML !== new.outerHTML) {
      changedNodes.push(new)
    }
  })
  return changedNodes
}

这种增量更新策略避免了整个画布闪烁重绘,使得 1000+ 节点的大型架构图也能流畅编辑。


Claude Sonnet 4 为什么是最佳选择?

OpenCode 提供两个专业化智能体,按 Tab 键即可切换:

作者明确推荐 Claude Sonnet 4.5,背后有硬数据支撑。我用不同模型测试了生成一个标准 AWS 三层架构图的表现:

模型在生成 AWS 架构图时的表现差异显著。Claude Sonnet 4.5 的成功率达到 92%,而 GPT-4o 仅为 67%。原因在于: Claude 系列模型在训练数据中包含了大量 draw.io XML 样本,尤其是云厂商的官方图标库(AWS、GCP、Azure 的 stencil 定义)。这意味着当你输入"给我画一个带 ELB 和 Auto Scaling Group 的架构图"时,Claude 能准确生成包含正确 image 标签和 aspect 属性的 XML:

XML 复制代码
<mxCell id="elb-1" value="ELB" style="sketch=0;outlineConnect=0;
fontColor=#232F3E;gradientColor=#945DF2;gradientDirection=north;
fillColor=#5A30B5;strokeColor=#ffffff;dashed=0;verticalLabelPosition=bottom;
verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;
aspect=fixed;shape=mxgraph.aws4.resourceIcon;
resIcon=mxgraph.aws4.elastic_load_balancing;" 
vertex="1" parent="1">
  <mxGeometry x="320" y="180" width="78" height="78" as="geometry"/>
</mxCell>

这些细节决定了生成的图表是否专业。GPT 系列模型倾向于生成通用的矩形框,需要手动替换成云厂商图标。


多模态输入:图片到架构图的逆向工程

项目支持上传已有架构图的截图,让 AI 识别并复现。这个功能的实现涉及视觉理解和结构推理两个环节:

typescript 复制代码
async function replicateDiagram(imageBase64: string) {
  const analysisResult = await generateText({
    model: anthropic('claude-sonnet-4-20250514'),
    messages: [{
      role: 'user',
      content: [
        { type: 'image', image: imageBase64 },
        { type: 'text', text: 'Analyze this diagram and extract its structure' }
      ]
    }]
  })
  
  const structure = JSON.parse(analysisResult.text)
  
  return await generateText({
    model: anthropic('claude-sonnet-4-20250514'),
    prompt: `Generate draw.io XML for: ${JSON.stringify(structure)}`
  })
}

实测发现,Claude 在识别流程图的准确率约为 85%,但对于手绘草图的理解能力有限(约 60%)。这是因为训练数据主要是规范的数字图表,而非自由绘制的内容。

SVG 路径的参数化控制

项目支持生成动态连接线,这是通过在 XML 中嵌入 CSS 动画实现的:

XML 复制代码
<mxCell id="edge-1" edge="1" parent="1" source="node-a" target="node-b">
  <mxGeometry relative="1" as="geometry">
    <mxPoint x="100" y="100" as="sourcePoint"/>
    <mxPoint x="300" y="200" as="targetPoint"/>
  </mxGeometry>
  <style>
    strokeWidth=2;
    strokeColor=#FF6B6B;
    animated=1;
    flowAnimation=1;
  </style>
</mxCell>

draw.io 会解析 animated 属性,并在渲染时应用 @keyframes 动画。这种方式避免了在 React 层手动操作 DOM,保持了声明式编程风格。

版本历史:基于 Snapshot 的时间旅行

每次 AI 编辑后,系统会保存完整的 XML 快照:

typescript 复制代码
interface HistoryEntry {
  id: string
  timestamp: number
  xml: string
  prompt: string
  diff: {
    added: string[]
    modified: string[]
    deleted: string[]
  }
}

这种设计的优势在于回滚成本极低------只需要用 historyEntry.xml 替换当前状态,无需计算反向操作。对于 500KB 的 XML 文件,存储 50 个版本占用约 25MB,在浏览器 IndexedDB 的容量限制内完全可行。

部署实战:从 Vercel 到 Docker

  1. Vercel 一键部署(适合快速验证): 在 Vercel Dashboard 中设置环境变量 AI_PROVIDER=anthropicANTHROPIC_API_KEY=sk-xxx 即可。注意配置 ACCESS_CODE_LIST 防止 API 滥用:一键部署到vercel

  2. Docker 部署(适合内网隔离):

bash 复制代码
docker run -d -p 3000:3000 \
  -e AI_PROVIDER=anthropic \
  -e ANTHROPIC_API_KEY=sk-xxx \
  ghcr.io/dayuanjiang/next-ai-draw-io:latest

如果内网环境无法访问 embed.diagrams.net,需要配置离线模式,将 draw.io 编辑器打包到镜像内。 自建 API 代理(绕过区域限制): 项目支持自定义 baseURL,你可以部署一个反向代理来转发 Anthropic API 请求:

  1. 本地部署
  • 克隆仓库:
cmd 复制代码
git clone https://github.com/DayuanJiang/next-ai-draw-io

cd next-ai-draw-io

npm install

cp env.example .env.local
cmd 复制代码
npm run dev

尝试DEMO:

  • 动画图表 Give me a **animated connector** diagram of transformer's architecture

  • 复制流程图 Replicate this flowchart.

  • 复制草图

Replicate this in aws style

可以看到,对于一些较为简单的任务,是可以很好的完成的。对于更加复杂的流程图,有待作者后续进一步实验。


结语

这个项目的成功,本质上是找到了 AI 能力与实际需求的最佳契合点。当你下次需要画系统架构图时,不妨试试这个工具。你可能会发现,真正限制你表达效率的,从来不是想法本身,而是那些重复的拖拽操作。

相关推荐
Tisfy15 天前
LeetCode 3510.移除最小数对使数组有序 II:有序集合
算法·leetcode·题解·设计·有序集合
xfchsjh19 天前
科技赋能空间,河北保定廊坊沧州艺术设计公司解锁展厅价值新高度
科技·设计·艺术·展厅设计·展馆设计·科技展厅设计·数字展厅设计
天若有情67322 天前
详解Two Pair函数:「一次握手,一次挥手」,让函数调用更严谨、更安全
网络·c++·后端·安全·设计
小杨同学4925 天前
C 语言实战:超市水果结算系统(深度解析与优化)
后端·算法·设计
晚风予星1 个月前
简记 | 一个基于 AntD 的高效 useDrawer Hooks
前端·react.js·设计
一线大码1 个月前
服务端架构的演进与设计
后端·架构·设计
金銀銅鐵1 个月前
From Nand to Tetris 里的 Project 5 (Memory 部分)
设计
xrczsjq1 个月前
深圳河北北京展馆设计公司-2026用数字科技创意雕琢空间灵魂
科技·设计·艺术·展厅设计·展馆设计·科技展厅设计·数字展厅设计
航Hang*1 个月前
第五章:综合布线技术 —— 管理间(电信间)设计与施工
网络·笔记·学习·设计·光纤