Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6014a576ff | ||
|
|
1a297e57a9 |
@@ -1,28 +1,5 @@
|
|||||||
# 系统架构全景
|
# 系统架构全景
|
||||||
|
|
||||||
<div class="text-sm mt-2">
|
<div class="mt-2 flex justify-center">
|
||||||
|
<img src="/architecture.svg" class="w-full max-h-[500px] object-contain" />
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────┐
|
|
||||||
│ 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>
|
</div>
|
||||||
|
|||||||
@@ -2,13 +2,9 @@
|
|||||||
|
|
||||||
四表结构,清晰的实体关系
|
四表结构,清晰的实体关系
|
||||||
|
|
||||||
```mermaid {scale: 0.7}
|
<div class="flex justify-center">
|
||||||
erDiagram
|
<img src="/data-model.svg" class="w-full max-h-[250px] object-contain" />
|
||||||
USER ||--o{ PROJECT : "拥有"
|
</div>
|
||||||
PROJECT ||--|| PROJECT_STYLE : "配置"
|
|
||||||
PROJECT ||--o{ TASK : "生成"
|
|
||||||
TASK ||--o{ ASSET : "产出"
|
|
||||||
```
|
|
||||||
|
|
||||||
<div class="grid grid-cols-2 gap-4 mt-2">
|
<div class="grid grid-cols-2 gap-4 mt-2">
|
||||||
|
|
||||||
|
|||||||
@@ -2,16 +2,9 @@
|
|||||||
|
|
||||||
Docker Compose 双容器 + 一键部署
|
Docker Compose 双容器 + 一键部署
|
||||||
|
|
||||||
```mermaid {scale: 0.7}
|
<div class="flex justify-center">
|
||||||
graph TB
|
<img src="/deployment.svg" class="w-full max-h-[300px] object-contain" />
|
||||||
subgraph Docker Compose
|
</div>
|
||||||
A[nginx 容器] -->|proxy_pass| B[app 容器]
|
|
||||||
end
|
|
||||||
B --> C[七牛云 Kodo]
|
|
||||||
B --> D[DeepSeek LLM]
|
|
||||||
B --> E[Stability AI]
|
|
||||||
User -->|HTTP| A
|
|
||||||
```
|
|
||||||
|
|
||||||
<Item title="🐳 容器化方案">
|
<Item title="🐳 容器化方案">
|
||||||
nginx 容器:Vite 构建产物 + 反向代理 `/api`。app 容器:Go 二进制 + SQLite 挂载。内部网络通信,nginx 暴露 8080 端口。
|
nginx 容器:Vite 构建产物 + 反向代理 `/api`。app 容器:Go 二进制 + SQLite 挂载。内部网络通信,nginx 暴露 8080 端口。
|
||||||
|
|||||||
@@ -14,14 +14,6 @@
|
|||||||
视觉模型自动质检,不合格触发重优化(最多 3 次)。通过后组装 Spritesheet + 元数据,上传七牛云 Kodo。
|
视觉模型自动质检,不合格触发重优化(最多 3 次)。通过后组装 Spritesheet + 元数据,上传七牛云 Kodo。
|
||||||
</Item>
|
</Item>
|
||||||
|
|
||||||
<div class="mt-4 text-sm text-gray-400">
|
<div class="mt-4 flex justify-center">
|
||||||
|
<img src="/pipeline.svg" class="w-full max-h-[180px] object-contain" />
|
||||||
```mermaid {scale: 0.7}
|
|
||||||
graph LR
|
|
||||||
A[用户输入] --> B[PromptOptimizer] --> C[AssetGenerator] --> D{质检}
|
|
||||||
D -->|通过| E[FormatAdapter] --> F[输出]
|
|
||||||
D -->|不通过| B
|
|
||||||
D -->|重试≥3| E
|
|
||||||
```
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,9 +14,6 @@ Eino Chain 驱动的智能提示词生成
|
|||||||
调用 Eino Chain 发给 DeepSeek 润色。**无 API Key 自动回退模板**,失败时注入重试上下文。
|
调用 Eino Chain 发给 DeepSeek 润色。**无 API Key 自动回退模板**,失败时注入重试上下文。
|
||||||
</Item>
|
</Item>
|
||||||
|
|
||||||
```mermaid {scale: 0.65}
|
<div class="flex justify-center">
|
||||||
graph LR
|
<img src="/prompt-agent.svg" class="w-full max-h-[160px] object-contain" />
|
||||||
A[用户描述] --> B[风格合并] --> C[三段式组装] --> D[LLM 优化] --> E[最终提示词]
|
</div>
|
||||||
F[工程风格] --> B
|
|
||||||
G[任务覆盖] --> B
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -0,0 +1,146 @@
|
|||||||
|
<mxfile host="app.diagrams.net" modified="2026-05-30T00:00:00.000Z" agent="Claude" version="21.0.0">
|
||||||
|
<diagram id="architecture" name="系统架构全景">
|
||||||
|
<mxGraphModel dx="1200" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1200" pageHeight="800" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
|
||||||
|
<!-- Frontend 外框 -->
|
||||||
|
<mxCell id="fe-box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;arcSize=8;shadow=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="100" y="40" width="1000" height="140" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="fe-title" value="<b>Frontend</b> <span style="color:#666">React + Vite + TypeScript</span>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=14;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="420" y="50" width="360" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="fe-mod1" value="项目画廊" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="140" y="95" width="120" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="fe-mod2" value="工作台" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="290" y="95" width="120" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="fe-mod3" value="结果预览" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="440" y="95" width="120" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="fe-mod4" value="风格编辑器" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="590" y="95" width="120" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="fe-tech" value="Zustand 状态管理 · react-router v7" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=11;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="750" y="100" width="310" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- 连接线 -->
|
||||||
|
<mxCell id="conn" value="HTTP / WebSocket" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=12;fontColor=#666666;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="500" y="195" width="200" height="25" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="conn-arrow" value="" style="endArrow=classic;html=1;strokeWidth=2;strokeColor=#6c8ebf;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="fe-box" target="be-box">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- Backend 外框 -->
|
||||||
|
<mxCell id="be-box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;arcSize=8;shadow=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="100" y="230" width="1000" height="300" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="be-title" value="<b>Backend</b> <span style="color:#666">Go + Gin + Eino</span>" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=14;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="440" y="240" width="320" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- Handler 层 -->
|
||||||
|
<mxCell id="handler-box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;arcSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="130" y="280" width="940" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="handler-label" value="<b>Handler</b>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="140" y="287" width="70" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="handler-items" value="JWT 中间件 · 请求校验 · 错误处理" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=12;fontColor=#555;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="350" y="287" width="400" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- 箭头 Handler → Service -->
|
||||||
|
<mxCell id="hs-arrow" value="" style="endArrow=classic;html=1;strokeWidth=2;strokeColor=#9673a6;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="handler-box" target="service-box">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- Service 层 -->
|
||||||
|
<mxCell id="service-box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;arcSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="130" y="345" width="940" height="100" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="service-label" value="<b>Service</b>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="140" y="350" width="70" height="25" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- Eino Pipeline 流程 -->
|
||||||
|
<mxCell id="pipe1" value="Prompt<br>Optimizer" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=11;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="280" y="380" width="110" height="45" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="pipe2" value="Asset<br>Generator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=11;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="430" y="380" width="110" height="45" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="pipe3" value="Quality<br>Supervisor" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=11;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="580" y="380" width="110" height="45" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="pipe4" value="Format<br>Adapter" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=11;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="730" y="380" width="110" height="45" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- Pipeline 箭头 -->
|
||||||
|
<mxCell id="p12" value="" style="endArrow=classic;html=1;strokeWidth=2;strokeColor=#b85450;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="pipe1" target="pipe2">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="p23" value="" style="endArrow=classic;html=1;strokeWidth=2;strokeColor=#b85450;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="pipe2" target="pipe3">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="p34" value="" style="endArrow=classic;html=1;strokeWidth=2;strokeColor=#b85450;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="pipe3" target="pipe4">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<mxCell id="pipe-label" value="Eino compose.Graph Pipeline" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=11;fontColor=#b85450;fontStyle=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="870" y="393" width="190" height="25" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- 项目管理等 -->
|
||||||
|
<mxCell id="svc-extra" value="项目管理 · 风格系统 · 用户认证" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=11;fontColor=#555;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="140" y="385" width="130" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- 箭头 Service → Data -->
|
||||||
|
<mxCell id="sd-arrow" value="" style="endArrow=classic;html=1;strokeWidth=2;strokeColor=#d6b656;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="service-box" target="data-box">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- Data 层 -->
|
||||||
|
<mxCell id="data-box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;arcSize=10;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="130" y="460" width="940" height="50" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="data-label" value="<b>Data</b>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="140" y="467" width="50" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="data-items" value="GORM + SQLite · sync.Map 缓存" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=12;fontColor=#555;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="400" y="467" width="400" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- External Services -->
|
||||||
|
<mxCell id="ext-box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;arcSize=8;shadow=1;dashed=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="100" y="560" width="1000" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ext-title" value="<b>外部服务</b>" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="120" y="565" width="80" height="25" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ext1" value="DeepSeek LLM" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="200" y="595" width="160" height="35" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ext2" value="Stability AI" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="460" y="595" width="160" height="35" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ext3" value="七牛云 Kodo" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999999;fontSize=12;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="720" y="595" width="160" height="35" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
<!-- Backend → External 箭头 -->
|
||||||
|
<mxCell id="be-ext" value="" style="endArrow=classic;html=1;strokeWidth=2;strokeColor=#999;dashed=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="be-box" target="ext-box">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 680" font-family="Microsoft YaHei, PingFang SC, Helvetica, Arial, sans-serif">
|
||||||
|
<defs>
|
||||||
|
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||||
|
<feDropShadow dx="2" dy="2" stdDeviation="3" flood-opacity="0.15"/>
|
||||||
|
</filter>
|
||||||
|
<marker id="arrow" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#6c8ebf"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-gray" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#999"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-red" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#b85450"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-purple" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#9673a6"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- Frontend 外框 -->
|
||||||
|
<rect x="30" y="20" width="940" height="130" rx="10" fill="#dae8fc" stroke="#6c8ebf" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="420" y="50" font-size="15" font-weight="bold" fill="#333">Frontend</text>
|
||||||
|
<text x="490" y="50" font-size="13" fill="#666">React + Vite + TypeScript</text>
|
||||||
|
|
||||||
|
<rect x="60" y="65" width="130" height="40" rx="6" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="125" y="90" font-size="12" fill="#333" text-anchor="middle">项目画廊</text>
|
||||||
|
|
||||||
|
<rect x="210" y="65" width="130" height="40" rx="6" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="275" y="90" font-size="12" fill="#333" text-anchor="middle">工作台</text>
|
||||||
|
|
||||||
|
<rect x="360" y="65" width="130" height="40" rx="6" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="425" y="90" font-size="12" fill="#333" text-anchor="middle">结果预览</text>
|
||||||
|
|
||||||
|
<rect x="510" y="65" width="130" height="40" rx="6" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="575" y="90" font-size="12" fill="#333" text-anchor="middle">风格编辑器</text>
|
||||||
|
|
||||||
|
<text x="790" y="90" font-size="11" fill="#666" text-anchor="middle">Zustand 状态管理 · react-router v7</text>
|
||||||
|
|
||||||
|
<!-- 连接线 Frontend → Backend -->
|
||||||
|
<text x="500" y="172" font-size="12" fill="#666" text-anchor="middle">HTTP / WebSocket</text>
|
||||||
|
<line x1="500" y1="155" x2="500" y2="195" stroke="#6c8ebf" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
|
||||||
|
<!-- Backend 外框 -->
|
||||||
|
<rect x="30" y="200" width="940" height="290" rx="10" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="420" y="230" font-size="15" font-weight="bold" fill="#333">Backend</text>
|
||||||
|
<text x="487" y="230" font-size="13" fill="#666">Go + Gin + Eino</text>
|
||||||
|
|
||||||
|
<!-- Handler 层 -->
|
||||||
|
<rect x="60" y="245" width="880" height="45" rx="8" fill="#e1d5e7" stroke="#9673a6" stroke-width="1"/>
|
||||||
|
<text x="80" y="272" font-size="12" font-weight="bold" fill="#333">Handler</text>
|
||||||
|
<text x="400" y="272" font-size="12" fill="#555" text-anchor="middle">JWT 中间件 · 请求校验 · 错误处理</text>
|
||||||
|
|
||||||
|
<!-- Handler → Service 箭头 -->
|
||||||
|
<line x1="500" y1="292" x2="500" y2="305" stroke="#9673a6" stroke-width="2" marker-end="url(#arrow-purple)"/>
|
||||||
|
|
||||||
|
<!-- Service 层 -->
|
||||||
|
<rect x="60" y="308" width="880" height="100" rx="8" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="80" y="333" font-size="12" font-weight="bold" fill="#333">Service</text>
|
||||||
|
|
||||||
|
<!-- Eino Pipeline -->
|
||||||
|
<text x="80" y="380" font-size="11" fill="#b85450" font-weight="bold">Eino compose.Graph Pipeline</text>
|
||||||
|
|
||||||
|
<rect x="280" y="345" width="110" height="45" rx="6" fill="#f8cecc" stroke="#b85450" stroke-width="1"/>
|
||||||
|
<text x="335" y="363" font-size="11" fill="#333" text-anchor="middle">Prompt</text>
|
||||||
|
<text x="335" y="378" font-size="11" fill="#333" text-anchor="middle">Optimizer</text>
|
||||||
|
|
||||||
|
<rect x="420" y="345" width="110" height="45" rx="6" fill="#f8cecc" stroke="#b85450" stroke-width="1"/>
|
||||||
|
<text x="475" y="363" font-size="11" fill="#333" text-anchor="middle">Asset</text>
|
||||||
|
<text x="475" y="378" font-size="11" fill="#333" text-anchor="middle">Generator</text>
|
||||||
|
|
||||||
|
<rect x="560" y="345" width="110" height="45" rx="6" fill="#f8cecc" stroke="#b85450" stroke-width="1"/>
|
||||||
|
<text x="615" y="363" font-size="11" fill="#333" text-anchor="middle">Quality</text>
|
||||||
|
<text x="615" y="378" font-size="11" fill="#333" text-anchor="middle">Supervisor</text>
|
||||||
|
|
||||||
|
<rect x="700" y="345" width="110" height="45" rx="6" fill="#f8cecc" stroke="#b85450" stroke-width="1"/>
|
||||||
|
<text x="755" y="363" font-size="11" fill="#333" text-anchor="middle">Format</text>
|
||||||
|
<text x="755" y="378" font-size="11" fill="#333" text-anchor="middle">Adapter</text>
|
||||||
|
|
||||||
|
<!-- Pipeline 箭头 -->
|
||||||
|
<line x1="392" y1="367" x2="418" y2="367" stroke="#b85450" stroke-width="2" marker-end="url(#arrow-red)"/>
|
||||||
|
<line x1="532" y1="367" x2="558" y2="367" stroke="#b85450" stroke-width="2" marker-end="url(#arrow-red)"/>
|
||||||
|
<line x1="672" y1="367" x2="698" y2="367" stroke="#b85450" stroke-width="2" marker-end="url(#arrow-red)"/>
|
||||||
|
|
||||||
|
<!-- 项目管理等 -->
|
||||||
|
<text x="120" y="420" font-size="11" fill="#555">项目管理 · 风格系统 · 用户认证</text>
|
||||||
|
|
||||||
|
<!-- Service → Data 箭头 -->
|
||||||
|
<line x1="500" y1="410" x2="500" y2="425" stroke="#d6b656" stroke-width="2" marker-end="url(#arrow-purple)"/>
|
||||||
|
|
||||||
|
<!-- Data 层 -->
|
||||||
|
<rect x="60" y="428" width="880" height="45" rx="8" fill="#e1d5e7" stroke="#9673a6" stroke-width="1"/>
|
||||||
|
<text x="80" y="455" font-size="12" font-weight="bold" fill="#333">Data</text>
|
||||||
|
<text x="400" y="455" font-size="12" fill="#555" text-anchor="middle">GORM + SQLite · sync.Map 缓存</text>
|
||||||
|
|
||||||
|
<!-- Backend → External 箭头 -->
|
||||||
|
<line x1="500" y1="492" x2="500" y2="520" stroke="#999" stroke-width="2" stroke-dasharray="6,3" marker-end="url(#arrow-gray)"/>
|
||||||
|
|
||||||
|
<!-- External Services -->
|
||||||
|
<rect x="30" y="525" width="940" height="80" rx="10" fill="#f5f5f5" stroke="#999" stroke-width="1" stroke-dasharray="6,3" filter="url(#shadow)"/>
|
||||||
|
<text x="80" y="550" font-size="12" font-weight="bold" fill="#333">外部服务</text>
|
||||||
|
|
||||||
|
<rect x="120" y="560" width="180" height="35" rx="6" fill="#f5f5f5" stroke="#999" stroke-width="1"/>
|
||||||
|
<text x="210" y="582" font-size="12" fill="#333" text-anchor="middle">DeepSeek LLM</text>
|
||||||
|
|
||||||
|
<rect x="410" y="560" width="180" height="35" rx="6" fill="#f5f5f5" stroke="#999" stroke-width="1"/>
|
||||||
|
<text x="500" y="582" font-size="12" fill="#333" text-anchor="middle">Stability AI</text>
|
||||||
|
|
||||||
|
<rect x="700" y="560" width="180" height="35" rx="6" fill="#f5f5f5" stroke="#999" stroke-width="1"/>
|
||||||
|
<text x="790" y="582" font-size="12" fill="#333" text-anchor="middle">七牛云 Kodo</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.7 KiB |
@@ -0,0 +1,65 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300" font-family="Microsoft YaHei, PingFang SC, Helvetica, Arial, sans-serif">
|
||||||
|
<defs>
|
||||||
|
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||||
|
<feDropShadow dx="1" dy="1" stdDeviation="2" flood-opacity="0.12"/>
|
||||||
|
</filter>
|
||||||
|
<marker id="arrow" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#6c8ebf"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- USER -->
|
||||||
|
<rect x="40" y="80" width="150" height="120" rx="8" fill="#dae8fc" stroke="#6c8ebf" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<rect x="40" y="80" width="150" height="32" rx="8" fill="#6c8ebf"/>
|
||||||
|
<text x="115" y="102" font-size="13" fill="#fff" text-anchor="middle" font-weight="bold">USER</text>
|
||||||
|
<text x="55" y="132" font-size="11" fill="#333">🔑 id (base62)</text>
|
||||||
|
<text x="55" y="150" font-size="11" fill="#333">username</text>
|
||||||
|
<text x="55" y="168" font-size="11" fill="#333">password_hash</text>
|
||||||
|
<text x="55" y="186" font-size="10" fill="#888">(bcrypt)</text>
|
||||||
|
|
||||||
|
<!-- USER → PROJECT (1:N) -->
|
||||||
|
<line x1="192" y1="140" x2="248" y2="140" stroke="#6c8ebf" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<text x="220" y="132" font-size="10" fill="#6c8ebf" text-anchor="middle">1 : N</text>
|
||||||
|
|
||||||
|
<!-- PROJECT -->
|
||||||
|
<rect x="250" y="60" width="150" height="160" rx="8" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<rect x="250" y="60" width="150" height="32" rx="8" fill="#82b366"/>
|
||||||
|
<text x="325" y="82" font-size="13" fill="#fff" text-anchor="middle" font-weight="bold">PROJECT</text>
|
||||||
|
<text x="265" y="112" font-size="11" fill="#333">🔑 id</text>
|
||||||
|
<text x="265" y="130" font-size="11" fill="#333">user_id (FK)</text>
|
||||||
|
<text x="265" y="148" font-size="11" fill="#333">name</text>
|
||||||
|
<text x="265" y="166" font-size="11" fill="#333">description</text>
|
||||||
|
|
||||||
|
<!-- PROJECT → PROJECT_STYLE (1:1) -->
|
||||||
|
<line x1="402" y1="110" x2="458" y2="110" stroke="#82b366" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<text x="430" y="102" font-size="10" fill="#82b366" text-anchor="middle">1 : 1</text>
|
||||||
|
|
||||||
|
<!-- PROJECT_STYLE -->
|
||||||
|
<rect x="460" y="50" width="150" height="120" rx="8" fill="#fff2cc" stroke="#d6b656" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<rect x="460" y="50" width="150" height="32" rx="8" fill="#d6b656"/>
|
||||||
|
<text x="535" y="72" font-size="12" fill="#fff" text-anchor="middle" font-weight="bold">PROJECT_STYLE</text>
|
||||||
|
<text x="475" y="102" font-size="11" fill="#333">🔑 project_id (FK)</text>
|
||||||
|
<text x="475" y="120" font-size="11" fill="#333">kv_pairs (JSON)</text>
|
||||||
|
<text x="475" y="150" font-size="10" fill="#888">artStyle, palette, ...</text>
|
||||||
|
|
||||||
|
<!-- PROJECT → TASK (1:N) -->
|
||||||
|
<line x1="325" y1="222" x2="325" y2="248" stroke="#6c8ebf" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<text x="340" y="240" font-size="10" fill="#6c8ebf">1 : N</text>
|
||||||
|
|
||||||
|
<!-- TASK -->
|
||||||
|
<rect x="230" y="250" width="190" height="40" rx="6" fill="#e1d5e7" stroke="#9673a6" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="325" y="275" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">TASK</text>
|
||||||
|
<text x="240" y="275" font-size="10" fill="#888" dx="85">prompt · status · style_override</text>
|
||||||
|
|
||||||
|
<!-- TASK → ASSET (1:N) -->
|
||||||
|
<line x1="422" y1="270" x2="478" y2="270" stroke="#9673a6" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<text x="450" y="262" font-size="10" fill="#9673a6" text-anchor="middle">1 : N</text>
|
||||||
|
|
||||||
|
<!-- ASSET -->
|
||||||
|
<rect x="480" y="250" width="190" height="40" rx="6" fill="#f8cecc" stroke="#b85450" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="575" y="275" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">ASSET</text>
|
||||||
|
<text x="490" y="275" font-size="10" fill="#888" dx="85">file_url · metadata</text>
|
||||||
|
|
||||||
|
<!-- 七牛云 label -->
|
||||||
|
<text x="700" y="275" font-size="10" fill="#999">→ 七牛云 Kodo</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -0,0 +1,64 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 420" font-family="Microsoft YaHei, PingFang SC, Helvetica, Arial, sans-serif">
|
||||||
|
<defs>
|
||||||
|
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||||
|
<feDropShadow dx="1" dy="1" stdDeviation="2" flood-opacity="0.12"/>
|
||||||
|
</filter>
|
||||||
|
<marker id="arrow" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#6c8ebf"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-gray" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#999"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-green" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#82b366"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- User -->
|
||||||
|
<rect x="280" y="15" width="140" height="45" rx="8" fill="#dae8fc" stroke="#6c8ebf" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="350" y="43" font-size="14" fill="#333" text-anchor="middle" font-weight="bold">User</text>
|
||||||
|
|
||||||
|
<!-- Arrow: User → nginx -->
|
||||||
|
<line x1="350" y1="62" x2="350" y2="95" stroke="#6c8ebf" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<text x="365" y="83" font-size="10" fill="#6c8ebf">HTTP</text>
|
||||||
|
|
||||||
|
<!-- Docker Compose 外框 -->
|
||||||
|
<rect x="80" y="100" width="540" height="170" rx="10" fill="none" stroke="#82b366" stroke-width="2" stroke-dasharray="8,4"/>
|
||||||
|
<text x="100" y="125" font-size="12" fill="#82b366" font-weight="bold">Docker Compose</text>
|
||||||
|
|
||||||
|
<!-- nginx 容器 -->
|
||||||
|
<rect x="110" y="140" width="200" height="60" rx="8" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="210" y="167" font-size="13" fill="#333" text-anchor="middle" font-weight="bold">nginx 容器</text>
|
||||||
|
<text x="210" y="187" font-size="10" fill="#666" text-anchor="middle">静态资源 + 反向代理</text>
|
||||||
|
|
||||||
|
<!-- Arrow: nginx → app -->
|
||||||
|
<line x1="312" y1="170" x2="370" y2="170" stroke="#82b366" stroke-width="2" marker-end="url(#arrow-green)"/>
|
||||||
|
<text x="340" y="162" font-size="10" fill="#82b366" text-anchor="middle">proxy_pass</text>
|
||||||
|
|
||||||
|
<!-- app 容器 -->
|
||||||
|
<rect x="373" y="140" width="200" height="60" rx="8" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="473" y="167" font-size="13" fill="#333" text-anchor="middle" font-weight="bold">app 容器</text>
|
||||||
|
<text x="473" y="187" font-size="10" fill="#666" text-anchor="middle">Go 二进制 + SQLite</text>
|
||||||
|
|
||||||
|
<!-- Port label -->
|
||||||
|
<text x="210" y="230" font-size="10" fill="#666" text-anchor="middle">暴露 8080 端口</text>
|
||||||
|
|
||||||
|
<!-- Arrow: app → 外部服务 -->
|
||||||
|
<line x1="473" y1="202" x2="473" y2="295" stroke="#999" stroke-width="2" stroke-dasharray="6,3" marker-end="url(#arrow-gray)"/>
|
||||||
|
|
||||||
|
<!-- 外部服务外框 -->
|
||||||
|
<rect x="140" y="300" width="420" height="100" rx="10" fill="#f5f5f5" stroke="#999" stroke-width="1" stroke-dasharray="6,3"/>
|
||||||
|
<text x="160" y="325" font-size="11" fill="#333" font-weight="bold">外部服务</text>
|
||||||
|
|
||||||
|
<!-- 七牛云 Kodo -->
|
||||||
|
<rect x="160" y="340" width="120" height="40" rx="6" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="220" y="365" font-size="11" fill="#333" text-anchor="middle">七牛云 Kodo</text>
|
||||||
|
|
||||||
|
<!-- DeepSeek LLM -->
|
||||||
|
<rect x="295" y="340" width="120" height="40" rx="6" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="355" y="365" font-size="11" fill="#333" text-anchor="middle">DeepSeek LLM</text>
|
||||||
|
|
||||||
|
<!-- Stability AI -->
|
||||||
|
<rect x="430" y="340" width="120" height="40" rx="6" fill="#fff2cc" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="490" y="365" font-size="11" fill="#333" text-anchor="middle">Stability AI</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.7 KiB |
@@ -0,0 +1,63 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 180" font-family="Microsoft YaHei, PingFang SC, Helvetica, Arial, sans-serif">
|
||||||
|
<defs>
|
||||||
|
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||||
|
<feDropShadow dx="1" dy="1" stdDeviation="2" flood-opacity="0.12"/>
|
||||||
|
</filter>
|
||||||
|
<marker id="arrow-blue" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#6c8ebf"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-red" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#b85450"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-green" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#82b366"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- 用户输入 -->
|
||||||
|
<rect x="20" y="55" width="100" height="50" rx="8" fill="#dae8fc" stroke="#6c8ebf" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="70" y="85" font-size="13" fill="#333" text-anchor="middle" font-weight="bold">用户输入</text>
|
||||||
|
|
||||||
|
<!-- Arrow: 用户输入 → PromptOptimizer -->
|
||||||
|
<line x1="122" y1="80" x2="155" y2="80" stroke="#6c8ebf" stroke-width="2" marker-end="url(#arrow-blue)"/>
|
||||||
|
|
||||||
|
<!-- PromptOptimizer -->
|
||||||
|
<rect x="158" y="45" width="140" height="70" rx="8" fill="#f8cecc" stroke="#b85450" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="228" y="73" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">Prompt</text>
|
||||||
|
<text x="228" y="91" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">Optimizer</text>
|
||||||
|
|
||||||
|
<!-- Arrow: → AssetGenerator -->
|
||||||
|
<line x1="300" y1="80" x2="333" y2="80" stroke="#b85450" stroke-width="2" marker-end="url(#arrow-red)"/>
|
||||||
|
|
||||||
|
<!-- AssetGenerator -->
|
||||||
|
<rect x="336" y="45" width="140" height="70" rx="8" fill="#f8cecc" stroke="#b85450" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="406" y="73" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">Asset</text>
|
||||||
|
<text x="406" y="91" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">Generator</text>
|
||||||
|
|
||||||
|
<!-- Arrow: → 质检 -->
|
||||||
|
<line x1="478" y1="80" x2="511" y2="80" stroke="#b85450" stroke-width="2" marker-end="url(#arrow-red)"/>
|
||||||
|
|
||||||
|
<!-- 质检(菱形) -->
|
||||||
|
<polygon points="570,30 630,80 570,130 510,80" fill="#fff2cc" stroke="#d6b656" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="570" y="84" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">质检</text>
|
||||||
|
|
||||||
|
<!-- Arrow: 通过 → FormatAdapter -->
|
||||||
|
<line x1="632" y1="80" x2="665" y2="80" stroke="#82b366" stroke-width="2" marker-end="url(#arrow-green)"/>
|
||||||
|
<text x="648" y="72" font-size="10" fill="#82b366" text-anchor="middle">通过</text>
|
||||||
|
|
||||||
|
<!-- FormatAdapter -->
|
||||||
|
<rect x="668" y="45" width="140" height="70" rx="8" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="738" y="73" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">Format</text>
|
||||||
|
<text x="738" y="91" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">Adapter</text>
|
||||||
|
|
||||||
|
<!-- Arrow: → 输出 -->
|
||||||
|
<line x1="810" y1="80" x2="843" y2="80" stroke="#82b366" stroke-width="2" marker-end="url(#arrow-green)"/>
|
||||||
|
|
||||||
|
<!-- 输出 -->
|
||||||
|
<rect x="846" y="55" width="90" height="50" rx="8" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="891" y="85" font-size="13" fill="#333" text-anchor="middle" font-weight="bold">输出</text>
|
||||||
|
|
||||||
|
<!-- 不通过 → 回退到 PromptOptimizer -->
|
||||||
|
<path d="M 570,132 L 570,160 L 228,160 L 228,117" fill="none" stroke="#b85450" stroke-width="2" stroke-dasharray="6,3" marker-end="url(#arrow-red)"/>
|
||||||
|
<text x="400" y="153" font-size="10" fill="#b85450" text-anchor="middle">不通过(重试≥3走降级)</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.8 KiB |
@@ -0,0 +1,70 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 160" font-family="Microsoft YaHei, PingFang SC, Helvetica, Arial, sans-serif">
|
||||||
|
<defs>
|
||||||
|
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||||
|
<feDropShadow dx="1" dy="1" stdDeviation="2" flood-opacity="0.12"/>
|
||||||
|
</filter>
|
||||||
|
<marker id="arrow-blue" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#6c8ebf"/>
|
||||||
|
</marker>
|
||||||
|
<marker id="arrow-green" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
|
||||||
|
<path d="M 0 0 L 10 5 L 0 10 z" fill="#82b366"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- 用户描述 -->
|
||||||
|
<rect x="20" y="55" width="100" height="50" rx="8" fill="#dae8fc" stroke="#6c8ebf" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="70" y="75" font-size="11" fill="#333" text-anchor="middle" font-weight="bold">用户</text>
|
||||||
|
<text x="70" y="91" font-size="11" fill="#333" text-anchor="middle">描述</text>
|
||||||
|
|
||||||
|
<!-- Arrow -->
|
||||||
|
<line x1="122" y1="80" x2="148" y2="80" stroke="#6c8ebf" stroke-width="2" marker-end="url(#arrow-blue)"/>
|
||||||
|
|
||||||
|
<!-- 风格合并 -->
|
||||||
|
<rect x="150" y="40" width="120" height="80" rx="8" fill="#fff2cc" stroke="#d6b656" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="210" y="75" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">风格合并</text>
|
||||||
|
<text x="210" y="93" font-size="10" fill="#666" text-anchor="middle">merge()</text>
|
||||||
|
|
||||||
|
<!-- 工程风格 input -->
|
||||||
|
<line x1="210" y1="38" x2="210" y2="10" stroke="#d6b656" stroke-width="1.5"/>
|
||||||
|
<rect x="155" y="-15" width="110" height="25" rx="4" fill="#f5f5f5" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="210" y="2" font-size="10" fill="#333" text-anchor="middle">工程风格</text>
|
||||||
|
|
||||||
|
<!-- 任务覆盖 input -->
|
||||||
|
<line x1="210" y1="122" x2="210" y2="148" stroke="#d6b656" stroke-width="1.5"/>
|
||||||
|
<rect x="155" y="148" width="110" height="25" rx="4" fill="#f5f5f5" stroke="#d6b656" stroke-width="1"/>
|
||||||
|
<text x="210" y="165" font-size="10" fill="#333" text-anchor="middle">任务覆盖</text>
|
||||||
|
|
||||||
|
<!-- Arrow -->
|
||||||
|
<line x1="272" y1="80" x2="298" y2="80" stroke="#d6b656" stroke-width="2" marker-end="url(#arrow-blue)"/>
|
||||||
|
|
||||||
|
<!-- 三段式组装 -->
|
||||||
|
<rect x="300" y="40" width="120" height="80" rx="8" fill="#e1d5e7" stroke="#9673a6" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="360" y="68" font-size="11" fill="#333" text-anchor="middle" font-weight="bold">三段式</text>
|
||||||
|
<text x="360" y="84" font-size="11" fill="#333" text-anchor="middle" font-weight="bold">组装</text>
|
||||||
|
<text x="360" y="102" font-size="9" fill="#888" text-anchor="middle">描述+风格+规格</text>
|
||||||
|
|
||||||
|
<!-- Arrow -->
|
||||||
|
<line x1="422" y1="80" x2="448" y2="80" stroke="#9673a6" stroke-width="2" marker-end="url(#arrow-blue)"/>
|
||||||
|
|
||||||
|
<!-- LLM 优化 -->
|
||||||
|
<rect x="450" y="40" width="120" height="80" rx="8" fill="#f8cecc" stroke="#b85450" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="510" y="68" font-size="11" fill="#333" text-anchor="middle" font-weight="bold">LLM 优化</text>
|
||||||
|
<text x="510" y="84" font-size="10" fill="#666" text-anchor="middle">DeepSeek</text>
|
||||||
|
<text x="510" y="102" font-size="9" fill="#b85450" text-anchor="middle">无Key回退模板</text>
|
||||||
|
|
||||||
|
<!-- Arrow -->
|
||||||
|
<line x1="572" y1="80" x2="598" y2="80" stroke="#b85450" stroke-width="2" marker-end="url(#arrow-blue)"/>
|
||||||
|
|
||||||
|
<!-- 最终提示词 -->
|
||||||
|
<rect x="600" y="55" width="120" height="50" rx="8" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="660" y="75" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">最终</text>
|
||||||
|
<text x="660" y="91" font-size="12" fill="#333" text-anchor="middle" font-weight="bold">提示词</text>
|
||||||
|
|
||||||
|
<!-- Arrow to AssetGenerator -->
|
||||||
|
<line x1="722" y1="80" x2="748" y2="80" stroke="#82b366" stroke-width="2" marker-end="url(#arrow-green)"/>
|
||||||
|
|
||||||
|
<!-- AssetGenerator -->
|
||||||
|
<rect x="750" y="55" width="110" height="50" rx="8" fill="#d5e8d4" stroke="#82b366" stroke-width="1.5" filter="url(#shadow)"/>
|
||||||
|
<text x="805" y="75" font-size="11" fill="#333" text-anchor="middle" font-weight="bold">Asset</text>
|
||||||
|
<text x="805" y="91" font-size="11" fill="#333" text-anchor="middle" font-weight="bold">Generator</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.2 KiB |
Reference in New Issue
Block a user