# 美术 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 deployment(PR 预览),方便迭代 **部署拓扑:** ``` Vercel (前端) └── Next.js App └── 调用后端 API Railway (后端) ├── FastAPI 服务 └── PostgreSQL 数据库 Replicate (AI 服务) └── 图像生成 / LoRA 训练 ``` --- ## 8. 异步任务 — asyncio + SSE **选型理由:** - 图像生成等待 10-60 秒,Python asyncio 异步等待即可,不需要引入消息队列 - SSE(Server-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. 默认输出尺寸 512x512,PNG 格式,透明背景 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 # 技术选型文档(本文件) ```