This commit is contained in:
2026-04-12 01:02:14 +08:00
parent 509487f155
commit 9b053e302b
14085 changed files with 2680009 additions and 12 deletions

View File

@@ -0,0 +1,287 @@
# 美术 Agent 工具 — 技术选型
> 本文档记录所有技术选型决策,与 [DECISIONS.md](DECISIONS.md) 配合使用。
---
## 选型总览
| 维度 | 选定方案 | 备选 |
|---|---|---|
| 前端框架 | Next.js (React) | — |
| 后端框架 | Python FastAPI | — |
| Agent 框架 | 自建 Agent Loop + OpenAI Function Calling | — |
| 数据库 | PostgreSQL | — |
| 对象存储 | MVP 本地文件系统 → 后期迁移云端 OSS | Cloudflare R2 / 阿里云 OSS |
| 图像生成 API | Replicate首选做抽象层方便扩展 | fal.ai / Stability AI / 国内 API |
| 部署方案 | Vercel (前端) + Railway (后端) | Docker + 云服务器 |
| 异步任务 | MVP 用 asyncio + SSE → 后期 Celery + Redis | — |
---
## 1. 前端 — Next.js (React)
**选型理由:**
- Vercel AI SDK 原生支持流式对话和 Tool Use是目前对 AI Chat UI 支持最成熟的方案
- shadcn/ui + Tailwind CSS 提供美观且高度可定制的组件库
- 社区有大量 AI Chat 界面组件可复用,降低开发成本
- App Router 支持服务端组件和流式渲染,适合对话场景
- 后续扩展到 3D 预览时React 生态的 Three.js 集成react-three-fiber也很成熟
**关键依赖:**
| 包名 | 用途 |
|---|---|
| `next` | 框架核心 |
| `ai` (Vercel AI SDK) | 流式对话、Tool Use 前端支持 |
| `shadcn/ui` + `tailwindcss` | UI 组件库 |
| `react-dropzone` | 参考图 / 资源文件上传 |
| `zustand` | 轻量客户端状态管理 |
---
## 2. 后端 — Python FastAPI
**选型理由:**
- AI/ML 生态最强Agent 编排、图像处理库Pillow、OpenCV、所有主流 AI SDK 都有 Python 客户端
- FastAPI 异步性能优秀,原生支持 async/await适合处理 AI API 调用的 I/O 等待
- Pydantic 数据校验与 OpenAI Function Calling 的 JSON Schema 天然契合
- 后处理 Pipeline去背景、超分等的库和工具以 Python 为主
**关键依赖:**
| 包名 | 用途 |
|---|---|
| `fastapi` + `uvicorn` | Web 框架 + ASGI 服务器 |
| `openai` | OpenAI API 客户端GPT 对话 + Function Calling |
| `replicate` | Replicate API 客户端(图像生成) |
| `sqlalchemy` + `asyncpg` | PostgreSQL 异步 ORM |
| `pydantic` | 数据校验FastAPI 内置) |
| `sse-starlette` | SSE 流式推送 |
| `python-frontmatter` | 解析 Skill/Rules Markdown 的 YAML frontmatter |
| `Pillow` | 图像基础处理 |
---
## 3. Agent 框架 — 自建 Agent Loop
**选型理由:**
- 美术类 Agent 逻辑高度专业化多图编排、风格上下文、审美反馈循环通用框架LangChain 等)的厚抽象层反而是负担
- Cursor 和 Claude Code 都是自建 Agent Loop验证了这条路在专业化场景下的可行性
- 直接使用 OpenAI Function Calling / Tool Use 协议,轻量且可控
- 工具注册通过 Skill 文件声明式定义,保持扩展性
**Agent Loop 核心流程:**
```
接收用户消息
→ 加载会话上下文 + 项目风格配置
→ 加载匹配的 Skills / Rules
→ 调用 LLM带 tools 定义)
→ LLM 返回文本 → 流式返回给前端
→ LLM 返回 tool_call → 执行工具 → 结果回传 LLM → 继续循环
→ 保存上下文到 Memory
→ 等待下一条消息
```
**初始工具集:**
| 工具名 | 功能 |
|---|---|
| `generate_image` | 调用 Replicate 生成图片 |
| `get_style` | 查询风格库Prompt 模板 / LoRA |
| `apply_style_ref` | 使用参考图进行风格迁移 |
| `export_asset` | 导出为指定格式MVP 仅 PNG |
---
## 4. 数据库 — PostgreSQL
**选型理由:**
- JSONB 类型兼顾结构化查询和半结构化数据存储Skill 配置、风格参数、对话上下文等)
- pgvector 扩展为未来风格相似度检索留路(根据参考图 embedding 找相似风格)
- 成熟稳定,从开发到生产都可靠
- Railway 和大部分云平台都提供托管 PostgreSQL
**主要表设计方向:**
| 表 | 存储内容 |
|---|---|
| `users` | 用户账户 |
| `projects` | 项目配置(全局风格、默认参数) |
| `conversations` | 会话元数据 |
| `messages` | 对话消息(含工具调用记录) |
| `styles` | 风格库Prompt 模板 / LoRA 元数据) |
| `generated_assets` | 生成资源记录(关联存储路径) |
---
## 5. 对象存储 — MVP 本地文件系统
**选型理由:**
- MVP 阶段减少外部依赖,加快开发速度
- 接口层做好抽象(`StorageBackend` 接口),后续一行配置切换到云端 OSS
**抽象接口设计:**
```python
class StorageBackend(ABC):
async def upload(self, file: bytes, path: str) -> str: ...
async def download(self, path: str) -> bytes: ...
async def get_url(self, path: str) -> str: ...
async def delete(self, path: str) -> None: ...
```
**后续迁移路径:**
- 海外用户 → Cloudflare R2零出站费S3 兼容 API
- 国内用户 → 阿里云 OSS
---
## 6. 图像生成 API — Replicate首选
**选型理由:**
- 模型市场最丰富Flux、Stable Diffusion 各版本、LoRA 训练 API 都有
- API 设计简洁Python SDK 使用方便
- 按秒计费,成本透明可控
- 支持异步预测prediction天然适合长时间图像生成任务
- LoRA 训练 API 成熟,为 Phase 2 的风格训练做好准备
**抽象层设计:**
```python
class ImageGenerator(ABC):
async def generate(self, prompt: str, params: GenerateParams) -> list[str]: ...
async def generate_with_ref(self, prompt: str, ref_image: str, params: GenerateParams) -> list[str]: ...
async def check_status(self, task_id: str) -> TaskStatus: ...
```
后续可实现 `ReplicateGenerator``FalAiGenerator` 等,通过配置切换。
---
## 7. 部署方案 — Vercel + Railway
**选型理由:**
- Vercel 对 Next.js 原生支持最佳(同一团队开发),零配置部署
- Railway 对 Python 服务部署简单,自动构建、自动扩缩,支持托管 PostgreSQL
- MVP 阶段不需要自管 Docker / K8s节省运维精力
- 两者都支持 preview deploymentPR 预览),方便迭代
**部署拓扑:**
```
Vercel (前端)
└── Next.js App
└── 调用后端 API
Railway (后端)
├── FastAPI 服务
└── PostgreSQL 数据库
Replicate (AI 服务)
└── 图像生成 / LoRA 训练
```
---
## 8. 异步任务 — asyncio + SSE
**选型理由:**
- 图像生成等待 10-60 秒Python asyncio 异步等待即可,不需要引入消息队列
- SSEServer-Sent Events实时推送生成进度和中间状态给前端
- 避免 MVP 阶段引入 Redis 依赖,保持架构简单
- 后期规模增大再引入 Celery + Redis 做任务持久化和重试
---
## 前后端通信协议
参考 Cursor / Claude Code 的 Agent 交互模式:
| 消息类型 | 方向 | 传输方式 | 说明 |
|---|---|---|---|
| 用户文本消息 | 前端 → 后端 | HTTP POST | 包含文本 + 可选附件(参考图) |
| LLM 流式文本 | 后端 → 前端 | SSE | 逐 token 推送 |
| 工具调用状态 | 后端 → 前端 | SSE | "正在生成图片..."、进度百分比 |
| 图片结果 | 后端 → 前端 | SSE | 结构化消息,包含图片 URL 列表 |
| 用户选择/反馈 | 前端 → 后端 | HTTP POST | 选择候选图 / 文字反馈 |
---
## Skill / Rules 文件格式
参考 Cursor 的方式,用 Markdown + YAML frontmatter
```markdown
---
name: generate-ui-icon
description: 生成 UI 图标资源
triggers:
- 图标
- icon
- 按钮图标
tools:
- generate_image
- remove_background
---
## 能力描述
当用户需要生成 UI 图标时触发本 Skill。
## 执行规则
1. 默认输出尺寸 512x512PNG 格式,透明背景
2. 使用项目默认风格(如已设置)
3. 生成 4 张候选,展示给用户选择
```
---
## 项目目录结构
```
art-agent/
frontend/ # Next.js 前端
src/
app/ # App Router 页面
components/
chat/ # 对话相关组件
gallery/ # 图片网格 / 候选图选择
style/ # 风格管理面板
upload/ # 文件上传组件
lib/ # 工具函数
stores/ # Zustand 状态管理
backend/ # Python FastAPI 后端
app/
api/ # API 路由层
agent/ # Agent Loop 核心
loop.py # 主循环逻辑
tools/ # 工具注册与实现
memory.py # 记忆系统
skills/ # Skill / Rules 加载器
models/ # SQLAlchemy 数据库模型
services/ # AI 服务抽象层
llm.py # LLM 抽象接口
image_gen.py # 图像生成抽象接口
storage/ # 文件存储抽象层
skills/ # Skill Markdown 文件目录
rules/ # Rules Markdown 文件目录
tests/ # 测试
docs/
art-agent/
DECISIONS.md # 产品决策文档
TECH-STACK.md # 技术选型文档(本文件)
```