Files
EPEEAIKit/docs/art-agent/TECH-STACK.md
2026-04-12 01:02:14 +08:00

288 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 美术 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 # 技术选型文档(本文件)
```