fix: trim gen2D slide content to prevent overflow beyond header/footer
Deploy Slides / build-and-deploy (push) Successful in 1m16s

- Reduce Item count per slide: pipeline 4→3, solution 4→2, highlights 6→4
- Remove tech-stack architecture layering Item (moved to tech-stack grid)
- Simplify eino-graph: shorter Go code, 3 Items→2
- Simplify prompt-agent: smaller mermaid, shorter Item text
- Simplify async-task: merge 3 Items→2, remove footer
- Simplify data-model: merge 4 grid items→2
- Simplify architecture: reduce ASCII diagram from 38 to 20 lines
- Simplify dedup-ws: remove JSON code block, shorter Items
- Simplify deployment: smaller mermaid, shorter Items
- Simplify problem: shorter Item text, remove bullet lists
- Simplify style-system: fix typo, shorter Item text
This commit is contained in:
2026-05-30 14:43:23 +08:00
parent d479504f12
commit 19075592e5
13 changed files with 116 additions and 300 deletions
+20 -38
View File
@@ -3,44 +3,26 @@
<div class="text-sm mt-2">
```
┌──────────────────────────────────────────────────────────────────┐
│ Frontend (React + Vite + TypeScript) │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌───────────┐ │
│ │ 项目画廊 │ │ 工作台面板 │ │ 结果预览 │ │ 风格编辑器 │ │
│ └──────────┘ └──────────────┘ └──────────┘ └───────────┘ │
│ │ Zustand 状态管理 │
│ │ react-router v7 路由 │
└────────────────────────┼─────────────────────────────────────────┘
│ HTTP (REST API) + WebSocket
┌────────────────────────┼─────────────────────────────────────────┐
│ Backend (Go + Gin + Eino) │
│ │ │
│ ┌────────────────────▼─────────────────────────────────────┐ │
│ │ Handler Layer (Gin Router) │ │
│ │ JWT 中间件 · 请求校验 · 错误处理 │ │
│ └────────────────────┬─────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────▼─────────────────────────────────────┐ │
│ │ Service Layer (业务逻辑) │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ Eino compose.Graph Pipeline │ │ │
│ │ │ PromptOptimizer → AssetGenerator → QualitySupervisor│ │ │
│ │ │ ↓ │ │ │
│ │ │ FormatAdapter │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ ┌──────────┐ ┌───────────┐ ┌──────────┐ │ │
│ │ │ 项目管理 │ │ 风格系统 │ │ 用户认证 │ │ │
│ │ └──────────┘ └───────────┘ └──────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────▼─────────────────────────────────────┐ │
│ │ Data Layer (数据访问) │ │
│ │ GORM + SQLite sync.Map 缓存 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 外部依赖:DeepSeek LLM · Stability AI · 七牛云 Kodo │
└──────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Frontend (React + Vite + TypeScript) │
│ 项目画廊 · 工作台 · 结果预览 · 风格编辑器 │
│ Zustand 状态管理 · react-router v7 │
└─────────────────────────┬───────────────────────────┘
│ HTTP / WebSocket
┌─────────────────────────▼───────────────────────────┐
│ Backend (Go + Gin + Eino) │
│ │
│ Handler: JWT 中间件 · 请求校验 · 错误处理 │
│ ↓ │
│ Service: Eino compose.Graph Pipeline │
│ PromptOptimizer → AssetGenerator │
│ → QualitySupervisor → FormatAdapter │
│ 项目管理 · 风格系统 · 用户认证 │
│ ↓ │
│ Data: GORM + SQLite · sync.Map 缓存 │
│ │
│ 外部: DeepSeek LLM · Stability AI · 七牛云 Kodo │
└──────────────────────────────────────────────────────┘
```
</div>
+13 -23
View File
@@ -2,33 +2,23 @@
提交即返回,后台并发执行
<Item title="📤 任务提交流程">
<Item title="📤 任务提交 → 后台执行">
1. 用户提交生成请求 → 创建 Task 记录(状态 `running`)
2. 立即返回 `taskId`,前端开始轮询 / 建立 WebSocket
3. 后台启动 goroutine 执行管线
1. 提交请求 → 创建 Task(`running`)→ 立即返回 `taskId`
2. 前端轮询 / WebSocket 获取进度
3. 后台 goroutine 执行管线,完成后上传素材
</Item>
<Item title="🔄 管线执行与进度推送">
<Item title="🔄 进度与重试">
| 阶段 | 进度范围 | 说明 |
|------|---------|------|
| PromptOptimizer | 5% → 25% | 风格合并 + LLM 优化 |
| AssetGenerator | 25% → 60% | 调用文生图 API |
| QualitySupervisor | 60% → 80% | 视觉模型质检 |
| FormatAdapter | 80% → 100% | 格式组装 + 上传 |
| 阶段 | 进度 | 说明 |
|------|------|------|
| PromptOptimizer | 5→25% | 风格合并 + LLM 优化 |
| AssetGenerator | 25→60% | 调用文生图 API |
| QualitySupervisor | 60→80% | 视觉模型质检 |
| FormatAdapter | 80→100% | 格式组装 + 上传 |
质检重试最多 3 次,任务级重试 1 次,超限降级输出。
</Item>
<Item title="🔁 重试策略">
- **质检重试**(管线内):QualitySupervisor 不合格 → 回退 PromptOptimizer,最多 3 次
- **任务级重试**(管线外):整个管线失败 → 5 秒间隔重试,最多 1 次
- **降级兜底**:超过重试次数后,使用当前最优结果输出
</Item>
<div class="mt-4 text-sm text-gray-400">
任务生命周期:running → completed / failed
</div>
+8 -21
View File
@@ -2,7 +2,7 @@
四表结构,清晰的实体关系
```mermaid {scale: 0.8}
```mermaid {scale: 0.7}
erDiagram
USER ||--o{ PROJECT : "拥有"
PROJECT ||--|| PROJECT_STYLE : "配置"
@@ -12,28 +12,15 @@ erDiagram
<div class="grid grid-cols-2 gap-4 mt-2">
<Item title="👤 USER 用户表">
- `id`:前缀 + 随机 base62(6 字节 crypto/rand)
- `username`:唯一用户名
- `password_hash`:bcrypt 哈希
<Item title="👤 USER + PROJECT">
- 用户:`id`(base62)、`username`、`password_hash`(bcrypt)
- 工程:`id`、`user_id`、`name`、`description`
</Item>
<Item title="📁 PROJECT 工程表">
- `id`:唯一标识
- `user_id`:外键关联用户
- `name` / `description`:工程信息
</Item>
<Item title="🎨 PROJECT_STYLE 风格表">
- `project_id`:一对一关联工程
- `kv_pairs`:JSON 存储风格键值对
- 支持 `custom:` 前缀自定义标签
</Item>
<Item title="📦 TASK + ASSET 任务/素材表">
- Task:`id` / `project_id` / `prompt` / `status` / `style_override`
- Asset:`id` / `task_id` / `file_url` / `metadata`
- 文件存储:七牛云 Kodo,CDN 签名访问
<Item title="🎨 STYLE + TASK + ASSET">
- 风格表:`project_id` 一对一,`kv_pairs` JSON 存储
- 任务:`prompt`、`status`、`style_override`
- 素材:`file_url`、`metadata`,存于七牛云 Kodo
</Item>
</div>
+2 -23
View File
@@ -3,30 +3,9 @@
两项关键的工程优化
<Item title="🔍 请求去重(Request Dedup)">
- **策略**:`hash(prompt + assetType + params)` 生成唯一键
- **存储**:`sync.Map` 内存缓存,TTL 自动过期
- **逻辑**:相同参数的并发请求自动合并,返回已有 `taskId`
- **效果**:避免重复生成,节省 API 调用成本,提升用户体验
`hash(prompt + assetType + params)` 生成唯一键,`sync.Map` 内存缓存。相同参数并发请求自动合并,返回已有 `taskId`,节省 API 调用成本。
</Item>
<Item title="📡 WebSocket 实时推送">
- 用户建立 `ws://host/api/v1/tasks/:taskId/ws` 连接
- 管线各阶段执行时推送实时状态消息:
```json
{
"type": "progress",
"stage": "asset_generator",
"progress": 45,
"message": "正在生成素材..."
}
```
- 质检重试时推送额外信息:重试次数、重试原因
- 管线完成时推送最终结果:素材 URL、元数据
- **兼容方案**:同时支持 HTTP 轮询(`GET /api/v1/tasks/:taskId`)
建立 `ws://host/api/v1/tasks/:taskId/ws` 连接,管线各阶段推送进度、质检重试信息、最终结果。同时兼容 HTTP 轮询方案。
</Item>
+7 -25
View File
@@ -2,39 +2,21 @@
Docker Compose 双容器 + 一键部署
```mermaid {scale: 0.8}
```mermaid {scale: 0.7}
graph TB
subgraph Docker Compose
A[nginx 容器<br/>前端静态文件 + 反向代理]
B[app 容器<br/>Go 后端 + SQLite]
A[nginx 容器] -->|proxy_pass| B[app 容器]
end
A -->|proxy_pass| B
B --> C[七牛云 Kodo<br/>素材文件存储]
B --> D[DeepSeek LLM<br/>提示词优化]
B --> E[Stability AI<br/>文生图 API]
B --> C[七牛云 Kodo]
B --> D[DeepSeek LLM]
B --> E[Stability AI]
User -->|HTTP| A
```
<Item title="🐳 容器化方案">
- **nginx 容器**:Vite 构建产物 + 反向代理 `/api` 到后端
- **app 容器**:Go 二进制 + SQLite 数据库文件挂载
- **网络**:Docker 内部网络通信,nginx 暴露 8080 端口
nginx 容器:Vite 构建产物 + 反向代理 `/api`。app 容器:Go 二进制 + SQLite 挂载。内部网络通信,nginx 暴露 8080 端口。
</Item>
<Item title="🚀 一键部署">
```bash
# 构建并启动
docker compose up -d --build
# 或使用部署脚本
./deploy.sh
```
- Gitee CI/CD 自动触发:push → 构建 → 部署
- SQLite 嵌入式数据库,无需额外数据库服务
- 配置通过环境变量 / `.env` 文件注入
`docker compose up -d --build` 或 `./deploy.sh`。Gitee CI/CD 自动触发,SQLite 嵌入式零外部依赖。
</Item>
+6 -22
View File
@@ -1,27 +1,19 @@
# Eino 管线编排 — compose.Graph
四阶段智能体协作的核心实现
<div class="mt-2">
```go {all|1-8|10-15|17-22|24-28}
// 类型定义
```go
type PipelineInput struct {
UserID string
ProjectID string
TaskID string
Prompt string
AssetType string
StyleMap map[string]string
UserID, ProjectID, TaskID string
Prompt, AssetType string
StyleMap map[string]string
}
type PipelineState struct {
OptimizedPrompt string
ImageURL string
QualityPassed bool
RetryCount int
}
type PipelineOutput struct {
AssetURL string
Metadata map[string]any
@@ -30,18 +22,10 @@ type PipelineOutput struct {
</div>
<v-clicks>
<Item title="graph.Build() — 构建管线">
使用 `compose.NewGraph[PipelineInput, PipelineOutput]()` 创建有向图,依次注册四个节点:PromptOptimizer → AssetGenerator → QualitySupervisor → FormatAdapter。质检节点支持条件分支:通过则进入格式适配,不通过则回退到提示词优化。
</Item>
<Item title="stateHandler — 状态管理">
通过 `AddLambda` 注册状态处理器,在节点间传递优化后的提示词、图片 URL、重试计数等状态。质检节点根据 `RetryCount` 决定重优化还是降级输出。
`compose.NewGraph` 创建有向图,注册四节点。质检节点条件分支:通过 → 格式适配,不通过 → 回退提示词优化。
</Item>
<Item title="graph.Invoke() — 执行管线">
传入 `PipelineInput`,管线自动按拓扑顺序执行各节点。每个节点执行完成后通过回调更新进度(5% → 25% → 60% → 80% → 100%)。
传入 `PipelineInput`,按拓扑顺序执行。每节点完成回调更新进度(5% → 25% → 60% → 80% → 100%)。
</Item>
</v-clicks>
+6 -18
View File
@@ -1,29 +1,17 @@
# 核心亮点总结
<v-clicks>
<Item title="🤖 多智能体协作管线">
Eino `compose.Graph` 编排四阶段智能体,支持质检重试(最多 3 次)与降级输出。每个节点独立可测试、可替换。
Eino `compose.Graph` 编排四阶段智能体,支持质检重试(最多 3 次)与降级输出。
</Item>
<Item title="🧠 提示词优化 Agent">
Eino Chain 驱动,支持任意 OpenAI 兼容 API(默认 DeepSeek)。无 API Key 自动回退模板,保证功能可用。
Eino Chain 驱动,支持任意 OpenAI 兼容 API。无 Key 自动回退模板,保证功能可用。
</Item>
<Item title="📡 实时进度推送">
WebSocket 推送管线各阶段状态、进度百分比与质检重试信息。兼容 HTTP 轮询方案。
<Item title="📡 实时进度 + 🔍 请求去重">
WebSocket 推送各阶段进度与质检信息。相同参数并发请求自动合并,节省 API 成本。
</Item>
<Item title="🔍 请求去重">
`hash(prompt + assetType + params)` + `sync.Map` 缓存,相同参数并发请求自动合并,节省 API 调用成本。
<Item title="🎨 风格系统 + 🚀 一键部署">
两层风格架构(Project + Task Override)保证一致性。Docker Compose + Gitee CI/CD 零依赖部署。
</Item>
<Item title="🎨 工程级风格系统">
两层风格架构(Project Style + Task Override),六个维度预设键 + 自定义标签,保证素材风格一致性。
</Item>
<Item title="🚀 一键部署">
Docker Compose 双容器架构 + Gitee CI/CD 自动部署。SQLite 嵌入式数据库,零外部依赖。
</Item>
</v-clicks>
+14 -21
View File
@@ -2,33 +2,26 @@
基于 Eino `compose.Graph` 编排的四阶段智能体协作管线
```mermaid {scale: 0.75}
graph LR
A[用户输入] --> B[PromptOptimizer<br/>提示词优化]
B --> C[AssetGenerator<br/>素材生成]
C --> D{QualitySupervisor<br/>质检}
D -->|通过| E[FormatAdapter<br/>格式适配]
D -->|不通过| B
E --> F[输出素材]
D -->|重试 ≥ 3| E
```
<v-clicks>
<Item title="① PromptOptimizer — 提示词优化">
合并工程风格 + 任务风格覆盖,将用户描述转化为三段式规范提示词(主体描述 + 风格约束 + 技术规格)。调用 Eino Chain 驱动的 LLM 优化,无 API Key 时自动回退模板。
合并工程风格 + 任务风格覆盖,生成三段式规范提示词。调用 Eino Chain 驱动 LLM 优化,无 Key 自动回退模板。
</Item>
<Item title="② AssetGenerator — 素材生成">
调用 OpenAI 兼容的文生图 API(默认 Stability AI),根据优化后的提示词生成素材。支持 `/v1/images/generations` 标准接口。
调用 OpenAI 兼容的文生图 API(默认 Stability AI),根据优化后提示词生成素材。
</Item>
<Item title="③ QualitySupervisor — 质检">
使用视觉模型自动检测生成结果,不合格则触发重优化流程(最多 3 次)。超过重试次数后降级输出当前最优结果。
<Item title="③ QualitySupervisor → ④ FormatAdapter">
视觉模型自动质检,不合格触发重优化(最多 3 次)。通过后组装 Spritesheet + 元数据,上传七牛云 Kodo。
</Item>
<Item title="④ FormatAdapter — 格式适配">
组装输出素材与元数据,支持 Spritesheet 打包。素材上传至七牛云 Kodo,返回 CDN 访问链接。
</Item>
<div class="mt-4 text-sm text-gray-400">
</v-clicks>
```mermaid {scale: 0.7}
graph LR
A[用户输入] --> B[PromptOptimizer] --> C[AssetGenerator] --> D{质检}
D -->|通过| E[FormatAdapter] --> F[输出]
D -->|不通过| B
D -->|重试≥3| E
```
</div>
+3 -19
View File
@@ -1,33 +1,17 @@
# 痛点:2D 游戏素材制作
<div class="mt-4">
<Item title="🎨 美术成本高">
- 像素画 / 手绘需要专业美术人员,独立开发者难以负担
- 外包费用高,单张精绘素材 50-500 元不等
- 迭代周期长,试错成本高 —— 一次修改可能需要数天
专业美术人员费用高,独立开发者难以负担。外包单张 50-500 元,迭代周期长,试错成本高。
</Item>
<Item title="🔧 管线适配难">
- 生成素材尺寸 / 格式不统一,无法直接导入游戏引擎
- 精灵表(Spritesheet)需手动拆分与对齐
- 多张素材之间风格一致性难以保证
素材尺寸/格式不统一,Spritesheet 需手动拆分。多张素材之间风格一致性难以保证。
</Item>
<Item title="🤖 现有 AI 工具的局限">
- 通用文生图模型缺乏游戏素材领域知识
- 无法理解 "像素风"、"赛璐璐" 等游戏美术术语
- 输出结果不可控,没有质检和重试机制
通用文生图模型缺乏游戏素材领域知识,无法理解"像素风"等术语,输出不可控,无质检重试。
</Item>
</div>
<div class="mt-4 text-center text-gray-400">
<b>核心诉求</b>:低门槛 · 风格一致 · 管线友好 · 质量可控
</div>
+10 -17
View File
@@ -2,28 +2,21 @@
Eino Chain 驱动的智能提示词生成
```mermaid {scale: 0.8}
graph LR
A[用户描述] --> B[风格合并]
B --> C[三段式组装]
C --> D[LLM 优化]
D --> E[最终提示词]
F[工程风格] --> B
G[任务覆盖] --> B
H[重试注入] --> D
```
<Item title="① 风格合并">
`finalStyle = merge(projectStyle, taskStyle)` — 工程风格为基底,任务风格逐键覆盖。自定义标签(`custom:` 前缀)自动提取。
`finalStyle = merge(projectStyle, taskStyle)` — 工程风格为基底,任务风格逐键覆盖。自定义标签自动提取。
</Item>
<Item title="② 三段式提示词组装">
将合并后的风格信息组装为三段式规范提示词:
- **主体描述**:用户输入的角色/场景描述
- **风格约束**:美术风格、色调、线条等风格键
- **技术规格**:尺寸、格式、透明背景等引擎适配参数
**主体描述**(用户输入)+ **风格约束**(美术风格、色调、线条)+ **技术规格**(尺寸、格式、透明背景)
</Item>
<Item title="③ LLM 优化 + 回退机制">
调用 Eino Chain 将三段式提示词发给 DeepSeek 等 LLM 进行润色优化。**无 API Key 时自动回退到模板生成**,保证功能可用。优化失败时注入重试上下文,指导模型修正。
调用 Eino Chain 发给 DeepSeek 润色。**无 API Key 自动回退模板**,失败时注入重试上下文。
</Item>
```mermaid {scale: 0.65}
graph LR
A[用户描述] --> B[风格合并] --> C[三段式组装] --> D[LLM 优化] --> E[最终提示词]
F[工程风格] --> B
G[任务覆盖] --> B
```
+4 -16
View File
@@ -1,29 +1,17 @@
# gen2D 的解决方案
<div class="mt-4">
| 输入 | 处理 | 输出 |
|------|------|------|
| 自然语言描述 + 风格参数 | 多智能体协作管线 | Sprite、背景、UI 元素、动画帧 |
</div>
<v-clicks>
<Item title="🗣️ 自然语言驱动">
用文字描述你想要的素材,AI 自动理解需求并生成。支持中英文,无需编写 Prompt 工程。
<Item title="🗣️ 自然语言驱动 + 🎨 风格一致">
用文字描述素材需求,AI 自动生成。工程级风格预设保证同一项目素材风格统一。
</Item>
<Item title="🎨 风格一致性">
工程级风格预设系统(Project Style)+ 任务级覆盖(Task Override),保证同一项目素材风格统一。
</Item>
<Item title="📦 管线友好">
标准尺寸输出,适配 Unity / Godot 等主流引擎。自动组装 Spritesheet,附带元数据。
</Item>
<Item title="✅ 质量可控">
多智能体质检(QualitySupervisor)自动检测不合格素材,触发重优化(最多 3 次),最终降级兜底。
<Item title="📦 管线友好 + ✅ 质量可控">
标准尺寸输出,适配 Unity / Godot。自动质检 + 重试(最多 3 次)+ 降级兜底。
</Item>
</v-clicks>
+4 -24
View File
@@ -3,33 +3,13 @@
保证一致性与灵活性的风格管理方案
<Item title="🏗️ 工程风格(Project Style)">
- 工程级别的全局风格配置,存储在 `project_style` 表中
- 以 Key-Value 对(kvPairs)形式存储,如 `artStyle=pixel`, `palette=warm`
- 同一工程下所有素材自动继承,保证风格统一
全局风格配置,以 kvPairs 存储(如 `artStyle=pixel`)。同一工程下所有素材自动继承,保证风格统一。
</Item>
<Item title="🔀 任务风格覆盖(Task Override))">
- 单次生成任务可覆盖部分风格键,仅指定需要变化的项
- 未指定的键自动继承工程风格
- 适合在同一工程下生成不同变体(如:同一角色的不同表情)
<Item title="🔀 任务风格覆盖(Task Override)">
单次任务可覆盖部分风格键,未指定的自动继承工程风格。适合生成同一角色的不同变体。
</Item>
<div class="mt-6">
<Item title="⚙️ 合并逻辑">
```
finalStyle = merge(projectStyle, taskStyle)
```
- 工程风格作为基底,任务风格逐键覆盖
- 自定义标签(`custom:` 前缀)自动提取到 Prompt 中
- 合并后的风格键注入三段式提示词的风格约束段
`finalStyle = merge(projectStyle, taskStyle)` — 工程风格为基底,任务风格逐键覆盖。自定义标签(`custom:` 前缀)自动提取注入提示词。
</Item>
</div>
+19 -33
View File
@@ -1,51 +1,37 @@
# 技术栈一览
<div class="grid grid-cols-3 gap-6 mt-4">
<div class="grid grid-cols-3 gap-4 mt-4">
<Item title="⚙️ 后端">
- **语言**:Go 1.26
- **框架**:Gin 1.12
- **AI 编排**:Eino 0.8(compose.Graph)
- **ORM**:GORM + SQLite
- **认证**:JWT + bcrypt
- **配置**:Viper(多层配置)
- **存储**:七牛云 Kodo
- Go 1.26 + Gin 1.12
- Eino 0.8 管线编排
- GORM + SQLite
- JWT + bcrypt 认证
- Viper 多层配置
- 七牛云 Kodo
</Item>
<Item title="🖥️ 前端">
- **框架**:React 18 + TypeScript 5.6
- **构建**:Vite 6
- **状态管理**:Zustand
- **路由**:react-router v7
- **样式**:CSS Modules + 暗色主题
- **API 层**:封装 Fetch + 类型安全
- React 18 + TypeScript
- Vite 6 构建
- Zustand 状态管理
- react-router v7
- CSS Modules 暗色主题
- 封装 Fetch API 层
</Item>
<Item title="🏗️ 基础设施">
- **容器化**:Docker 多阶段构建
- **反向代理**:nginx
- **CI/CD**:Gitee Actions 自动部署
- **数据库**:SQLite 嵌入式
- **文件存储**:七牛云 Kodo CDN
- **通信**:REST API + WebSocket
</Item>
</div>
<div class="mt-6">
<Item title="📐 架构分层原则">
- **Handler 层**(薄):请求校验、参数绑定、错误处理
- **Service 层**(厚):业务逻辑、管线编排、风格合并
- **Model 层**(数据):GORM 实体定义、数据库操作
- **日志系统**:基于 `log/slog`,分级别记录(Debug / Info / Warn / Error)
- Docker 多阶段构建
- nginx 反向代理
- Gitee CI/CD 自动部署
- SQLite 嵌入式 DB
- 七牛云 Kodo CDN
- REST + WebSocket
</Item>