ARTICLE · 1325549
一个基于 Go 语言的 AI 自动生成架构图工具
大家好,我是码农先森。
项目地址:https://github.com/peakxy/drawio-agent-go
📦 15 Parts + Conclusion
👉 滑动
PART 01
项目简介
项目简介
PART 02
项目展示
项目展示
PART 03
项目讲解文档
项目讲解文档
PART 04
核心能力
核心能力
PART 05
工作原理
工作原理
PART 06
快速开始
QUICK START · 快速上手
PART 07
使用指南
使用指南
PART 08
技术栈
TECH STACK · 技术选型
PART 09
架构设计
架构设计
PART 10
配置说明
CONFIG · 环境变量
PART 11
HTTP API
HTTP API
PART 12
常见问题
常见问题
PART 13
开发与验证
开发与验证
PART 14
参与贡献
参与贡献
PART 15
联系作者
联系作者
PART ///
写在最后
SUMMARY · 个人观点
01
PART
项目简介
项目简介
Drawio-Agent-Go 是一个基于 Agent 应用开发的 Go 脚手架搭建的 Draw.io 智能体,可通过多轮对话来绘制理想中的架构图。
用户只需要用自然语言描述想法,系统就会通过“需求分析、图形生成、结果检查”三个 Agent 协作,把需求转换为可编辑的 Draw.io XML,并在网页画布中直接渲染。开启“携带画布上下文”后,还可以继续通过对话调整节点、补充链路或优化布局。
02
PART
项目展示
项目展示
前端工作台由三部分组成:左侧管理绘图记录,中间嵌入 Draw.io 画布,右侧通过 AI 对话生成或修改图表。
可以从一段简单的自然语言开始:
请绘制一个微服务电商系统架构图,包含 API Gateway、用户服务、
商品服务、订单服务、Redis、MySQL 和 Kafka,并标注主要调用关系。
生成初稿后,开启“携带画布上下文”,继续输入:
在现有架构图中增加库存服务和支付服务,将异步事件统一接入 Kafka,
并调整布局,避免节点和连线重叠。
03
PART
项目讲解文档
项目讲解文档
•地址:项目文档
•内容:简历写法、项目亮点与难点解析等
04
PART
核心能力
核心能力
> [!NOTE]
> 当前“多轮修改”主要由前端保存绘图记录,并在用户开启“携带画布上下文”后提交当前 XML 实现;它不是服务端长期记忆系统。
05
PART
工作原理
工作原理
flowchart LR
User["用户描述绘图需求"] --> Web["Next.js 对话工作台"]
Web --> API["Go HTTP API"]
API --> Analyst["agent_analyst 理解需求并补全关系"]
Analyst --> Drawer["agent_drawer 生成 Draw.io XML"]
Drawer --> Reviewer["agent_reviewer 校验语法并优化布局"]
Reviewer --> XML["最终 mxfile XML"]
XML --> Canvas["react-drawio 画布"]
Canvas --> Edit["人工编辑 / SVG 导出"]
Canvas -. "携带当前画布上下文" .-> Web
三 Agent 分工
默认 Runner 使用串行工作流 sequential_draw_process:
agent_analyst -> agent_drawer -> agent_reviewer
仓库同时保留了 loop 和 parallel Workflow 的配置示例,便于继续实验循环优化和多方案生成。
06
PART
快速开始
QUICK START · 快速上手
环境要求
•Go 1.25.6+
•Node.js 20+ 和 npm
•一个 OpenAI-compatible Chat Completions 服务
•可访问的 MCP SSE 服务;如果不使用 MCP,需要从启用的 Agent 配置中移除对应 tool-mcp-list
•Docker,可选,仅用于本地 MySQL/Redis 参考环境
1. 克隆项目
git clone https://github.com/peakxy/drawio-agent-go.git
cd drawio-agent-go
2. 安装后端依赖
go mod download
go build ./...
3. 准备环境变量
cp .env.example .env
至少需要替换以下配置:
OPENAI_BASE_URL=https://api.example.com/
OPENAI_API_KEY=replace-with-your-key
BAIDU_SEARCH_MCP_BASE_URI=https://example.com/mcp/
BAIDU_SEARCH_MCP_SSE_ENDPOINT=sse?api_key=replace-with-your-key
说明:
•OPENAI_BASE_URL 可以指向 OpenAI 官方服务或兼容 Chat Completions 的模型服务。
•默认启用的 Agent YAML 声明了百度搜索 SSE MCP,因此需要提供可用的 MCP 地址。
•如果暂时不需要 MCP,请从实际启用的 configs/agent/*.yaml 中移除 tool-mcp-list,不要保留空的 base-uri。
•.env 中的变量会在加载 Agent YAML 时展开,支持 ${VAR} 和 ${VAR:-default}。
4. 启动后端
go run ./cmd/server
也可以显式指定环境变量文件和应用配置:
go run ./cmd/server -env .env -config configs/application.yaml
默认监听 :8091,可以通过健康检查确认服务状态:
curl http://localhost:8091/healthz
{"status":"ok"}
5. 启动前端
打开另一个终端:
cd frontend
npm ci
npm run dev
访问 http://localhost:3000,演示账号和密码均为:
admin / admin
登录后选择 AI交互式绘图智能体,输入绘图需求即可开始。
> [!IMPORTANT]
> admin / admin 只是前端演示登录,数据保存在浏览器 Cookie 中,不包含生产环境所需的服务端鉴权能力。
07
PART
使用指南
使用指南
创建一张新图
点击左侧新增按钮创建绘图记录。
在右侧选择“AI交互式绘图智能体”。
描述图表类型、关键节点、节点关系和期望布局。
等待三 Agent 工作流完成,最终 XML 会自动加载到中间画布。
在 Draw.io 中继续手动编辑,或点击 Export 导出 SVG。
基于当前画布继续修改
打开右侧输入框上方的“携带画布上下文”。
输入新的修改指令,例如“增加 Redis 缓存层,并将所有缓存访问改为虚线”。
前端会导出当前 Draw.io XML,并与新指令一起发送给 Agent。
Agent 返回新的 XML 后,前端更新当前画布和本地绘图记录。
管理绘图记录
•单击左侧记录切换会话和画布。
•双击记录名称进行重命名。
•点击删除按钮移除记录。
•聊天消息、后端会话 ID 和 Draw.io XML 会保存在浏览器 localStorage。
08
PART
技术栈
TECH STACK · 技术选型
09
PART
架构设计
架构设计
整体架构
flowchart TB
Browser["Browser"] --> Frontend["frontend Next.js + react-drawio"]
Frontend --> Handler["internal/trigger/http Gin handlers"]
Handler --> Chat["domain/agent/service/chat"]
Chat --> Registry["AgentRegistry in-memory"]
Chat --> Session["SessionStore in-memory"]
Registry --> Runner["Runner adapter"]
Runner --> Workflow["Sequential Agent Workflow"]
Workflow --> Model["OpenAI-compatible ChatModel"]
Workflow --> Tools["MCP Tool Router"]
Model --> LLM["Chat Completions Service"]
Tools --> MCP["MCP SSE Server"]
AppConfig["configs/application.yaml"] --> Bootstrap["internal/app/bootstrap"]
AgentConfig["configs/agent/*.yaml"] --> Bootstrap
Bootstrap --> Armory["domain/agent/service/armory"]
Armory --> Registry
后端按端口与适配器组织:
•internal/domain:定义 Agent 配置模型、领域端口、Armory 装配和聊天服务。
•internal/app:加载应用配置并连接领域服务与基础设施。
•internal/infrastructure:实现模型、MCP、ADK、日志、MySQL 和 Redis adapter。
•internal/trigger/http:处理 Gin 路由、HTTP 参数和响应。
•pkg/types:提供应用错误码与统一错误类型。
项目结构
drawio-agent-go
├── cmd/server/main.go # 后端入口
├── configs
│ ├── application.yaml # 服务、LLM 超时和 Agent 配置路径
│ └── agent
│ ├── agent-draw-io.yaml # Draw.io 三 Agent 工作流
│ ├── only-one-agent.yaml # 单 Agent 示例
│ └── skills/ # SKILL.md 资源示例
├── deployments # MySQL/Redis 参考环境
├── frontend # Next.js + react-drawio 前端
├── internal
│ ├── api # HTTP DTO 与统一响应
│ ├── app # 配置加载与应用 Bootstrap
│ ├── domain # Agent 领域模型、端口和服务
│ ├── infrastructure # 模型、MCP、ADK、DB、缓存和日志 adapter
│ └── trigger/http # Gin 路由与 Handler
├── pkg/types # 错误码与 AppError
├── .env.example
├── go.mod
└── README.md
> 仓库展示名称已经是 Drawio-Agent-Go;当前 Go module 和部分运行时配置仍保留 ai-agent-scaffold-go,因此代码导入路径不应直接按展示名称替换。
10
PART
配置说明
CONFIG · 环境变量
应用配置
configs/application.yaml 控制服务地址、LLM 超时和需要装配的 Agent 文件:
app:
name: ai-agent-scaffold-go
env: local
server:
addr: ":8091"
llm:
request-timeout: 5m
agent:
config-paths:
- configs/agent/only-one-agent.yaml
- configs/agent/agent-draw-io.yaml
默认配置会同时注册单 Agent 示例和 Draw.io Agent。前端首次进入时不保证自动选中绘图 Agent,请手动选择 AI交互式绘图智能体。
MySQL 和 Redis adapter 已经存在,但默认 Bootstrap 使用内存态 AgentRegistry 和 SessionStore,启动本项目不强制依赖 MySQL 或 Redis。
Draw.io Agent 配置
核心配置位于 configs/agent/agent-draw-io.yaml:
ai:
agent:
config:
tables:
drawIoAgent:
app-name: drawIoAgent
agent:
agent-id: "300000"
agent-name: "AI交互式绘图智能体"
agent-desc: "人 + AI + Draw.io,交互式对话完成 draw.io 绘图。"
module:
ai-api:
base-url: ${OPENAI_BASE_URL}
api-key: ${OPENAI_API_KEY}
completions-path: v1/chat/completions
chat-model:
model: "gpt-5.5"
tool-mcp-list:
- sse:
name: baidu-search
base-uri: ${BAIDU_SEARCH_MCP_BASE_URI}
sse-endpoint: ${BAIDU_SEARCH_MCP_SSE_ENDPOINT}
agents:
- name: agent_analyst
output-key: analysis_result
- name: agent_drawer
output-key: draft_diagram
- name: agent_reviewer
output-key: final_result
agent-workflows:
- type: sequential
name: sequential_draw_process
sub-agents:
- agent_analyst
- agent_drawer
- agent_reviewer
runner:
agent-name: sequential_draw_process
完整的 Agent 指令、Workflow 示例和插件配置请直接查看 configs/agent/agent-draw-io.yaml。
11
PART
HTTP API
HTTP API
/api/v1 下的成功响应统一使用以下结构:
{
"code": "0000",
"info": "success",
"data": {}
}
查询 Agent
curl http://localhost:8091/api/v1/query_ai_agent_config_list
Draw.io Agent 的响应项类似:
{
"agentId": "300000",
"agentName": "AI交互式绘图智能体",
"agentDesc": "人 + AI + Draw.io,交互式对话完成 draw.io 绘图。"
}
创建会话
curl -X POST http://localhost:8091/api/v1/create_session \
-H 'Content-Type: application/json' \
-d '{"agentId":"300000","userId":"u1001"}'
{
"code": "0000",
"info": "success",
"data": {
"sessionId": "drawIoAgent:u1001:1"
}
}
生成 Draw.io 图表
sessionId 可以为空,服务会自动创建或复用会话:
curl -X POST http://localhost:8091/api/v1/chat \
-H 'Content-Type: application/json' \
-d '{
"agentId": "300000",
"userId": "u1001",
"sessionId": "",
"message": "绘制一个包含网关、用户服务、订单服务、Redis 和 MySQL 的微服务架构图"
}'
响应中的 content 是可直接加载到 Draw.io 的 XML:
{
"code": "0000",
"info": "success",
"data": {
}
}
SSE 接口
curl -N -X POST http://localhost:8091/api/v1/chat_stream \
-H 'Content-Type: application/json' \
-d '{
"agentId": "300000",
"userId": "u1001",
"sessionId": "",
"message": "绘制一个用户登录时序图"
}'
Draw.io Workflow 会先执行完整的分析、绘图和检查流程,再通过 SSE 返回 Runner 输出;当前实现不等同于逐 Token 实时绘图。
12
PART
常见问题
常见问题
为什么打开前端后没有自动选择 Draw.io Agent?
默认 application.yaml 同时加载了两份 Agent 配置,前端会选择列表中的第一个 Agent。请在右侧下拉框中手动选择“AI交互式绘图智能体”。
为什么后端启动时报 MCP 配置错误?
默认 Agent 配置声明了 SSE MCP 工具。请配置 BAIDU_SEARCH_MCP_BASE_URI 和 BAIDU_SEARCH_MCP_SSE_ENDPOINT,或者从启用的 Agent YAML 中移除 tool-mcp-list。
如何让 AI 修改现有图表,而不是重新生成?
打开“携带画布上下文”。前端会把当前 Draw.io XML 和新指令一起发送给 Agent,生成结果后覆盖当前画布。
MySQL 和 Redis 是必需的吗?
不是。默认启动路径使用内存态 Registry 和 SessionStore;MySQL/GORM 与 Redis 目前主要作为脚手架中的可选基础设施 adapter。
前端绘图记录保存在哪里?
保存在浏览器 localStorage。清理浏览器站点数据后,本地绘图记录也会被删除。
13
PART
开发与验证
开发与验证
后端:
go test ./...
go build ./...
test -z "$(gofmt -l .)"
前端:
cd frontend
npm run lint
npm run build
14
PART
参与贡献
参与贡献
欢迎通过 Issue 提交问题或建议,也欢迎提交 Pull Request 改进 Agent 指令、绘图质量、前端交互或工程化能力。提交前请至少完成相关构建和测试命令。
15
PART
联系作者
联系作者
•邮箱:xu1feng218@163.com
///
LAST
写在最后
SUMMARY · 个人观点
感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。
既然看到这里了,如果觉得有用,随手点个赞、在看、转发三连吧。
THANKS FOR READING















































































