Files
beige/PRD/PRD-后端.md
yangqianqian 6a2632da70 baseline: Clover 独立仓库首次基线提交
将 Clover 从上层产品包旧仓库中独立出来,建立专属版本控制。
当前状态=纵切片端到端已打通(登录→选品→出文出图→审核→下载包),
M1文案质量去套路化已验收。此提交作为后续按核销清单逐条修复的基线。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:30:22 +08:00

115 lines
9.7 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.
# Clover PRD-后端
> 后端技术框架。**本文是"承接层"**:架构决策见 `../Clover架构方案.md`(v0.3,金标准)本文只做①引用架构决策②补PRD独有工程细节③承接扒包上线版新事实。
> 技术栈FastAPI + Celery + MySQL + MongoDB + Redis栈范式扒自banana全新重建
> 🔴 源码只读复制:扒**上线版** `万牛会L1准备/worker/src`(非旧版产品包) + banana。
## 0. 怎么读这份PRD
- 数据模型16表/基石ABCDEF/三期构建顺序/复用复活新造清单 → **见架构方案 §三/§〇.5/§五/§四**,本文不复制。
- 本文重点第3章API契约细节、第9章环境变量、第10章工程规范这些架构方案没细化
- 与架构方案冲突时:**以架构方案v0.3 + CLAUDE.md为准**。
## 1. 后端架构总览
- 分层API层 / Service层(AI引擎) / Model层(双库) / 队列层(Celery+SSE) —— 详见架构方案§一
- AIProvider抽象层(扒banana)**gpt-image-2主/Gemini备**,由环境变量 IMAGE_PROVIDER_PRIMARY 配置(不写死)
- 🔴 三条铁律入口(详见架构方案§〇.5)A业务参数不写死 / B key不进Celery+Fernet加密 / C workspace逻辑隔离
## 2. 数据模型
- **完整16表清单+字段+Alembic001-004分批 → 见架构方案§三**,本文不重抄。
- 🔴 PRD骨架旧表名修正(以架构方案为准)
- api_keys→**user_api_keys**(UNIQUE user_id+workspace_id+provider)
- tasks→**generation_tasks**(审核字段平铺:review_status/reviewer_id/reviewed_at/reject_reason/approved_at/archived_at)
- 无assets表→实为 **text_candidates + image_candidates**(text_candidates有source=ai/import区分双轨)
-**login_records**(扒banana) / 补 **ai_call_logs**(usage记录,按key计费排障基础,一期必做)
- data_ownership是**preference_events的字段**(client_data/platform_asset),不是独立表
- 任务状态机7态pending→generating→pending_selection→pending_review→approved/rejected→archived(打回回pending_selection)
- MongoDB**只存AI debug trace**(业务不依赖)可调prompt在 products 表字段,**不在Mongo**
- 关键索引(架构没列,PRD补)generation_tasks(workspace_id,status) / preference_events(workspace_id,product_id,created_at)
## 3. API 契约 → 唯一冻结源:`启动包/API契约.md`
> ⚠️ 契约统一:本 PRD **不再另写一套契约**。端点/响应包络/错误码/SSE事件/分页,
> 全部以 `Clover/启动包/API契约.md` 为唯一冻结源避免前后端分叉外部AI审核P0-1/2/8
> 开工首步Lead 据 API契约.md 生成并冻结 `Clover/contracts/openapi.yaml`"契约优先"落地,非口号)。
本 PRD 第3章只补**契约文档未覆盖的后端实现约定**(不重复端点定义):
- 任务软删用标记位不物理删DELETE /tasks/{id} 走 archived 态。
- 限流同用户并发生成任务数上限建议2可配生图每张~4min 异步不占连接。
- SSE token 走 headerAuthorization不走 query对齐契约纠 banana 旧法)。
- preference 写入**不暴露独立埋点端点**:选择/审核业务接口内部写 events前端只调业务动作外部AI审核P1-14
- preference 读GET /preference/context 已列入 API契约端点清单外部AI审核P2-13
## 4. AI 引擎(扒上线版 worker/src 重写Python·核心
> 算法逻辑整体扒上线版copy.js/image.js/split.js重写为Python逻辑照搬防走样(TDD对照)。
### 4.1 文案引擎扒copy.js上线版
- **轨A**:一次调强模型返**N角度JSON**(N=用户设定text_count不串行不并发新造generate_text_variants)——这是去同质化关键,勿照抄旧版单条循环。数量不写死(基石A)。
- **轨B**:导入外部文案(豆包等)直接进候选池跳过AI(text_import_handler,text_candidates.source=import,洞2)
- 保留(扒上线版重写Python集成进轨A)三层兜底Claude→Gemini→本地 / 五维打分90过线 / 自动优化循环 / **正文+开头去重(splitPublishableContent/contentSignature)** / **角度槽位(angleSlotsForCategory,作可迁移数据非代码常量)** / 内部提示剥离(content只放可发布正文)
- 可调promptproducts表字段北哥可配(等北哥优质样本+判断标准注入,质量责任在北哥侧)
### 4.2 生图引擎扒image.js上线版+改造)
- 扒保留storyboard 10角色分镜 / getNarrativeRoles(3/6/8张链路) / 6品类proofStrategy / 素材路由 / buildVisualSystem成组视觉
- 🔴 生图通道(扒上线版已成熟,直接用)
- 主备由 IMAGE_PROVIDER_PRIMARY=gpt/FALLBACK=gemini 配置(imageProviderOrder)
- GPT走 **edits带产品参考图**(requestGptImageWithReferences)**禁纯文生图防跑偏**(无产品图报错)
- 产品图=**不可修改商品锚点**,禁改包装/换产品/混历史产品(防串货)
- 🔴 补(上线版仍缺)**生图通道加重试退避**(gpt-image-2实测502,baseline验证必要)
- 🔴 一期执行模型(纠正混淆,外部AI审核P0-3/4)
- **一期只做 storyboard 分镜图**:一篇笔记出 N 张叙事图(N=用户设定image_count默认3**合法1-8**对齐worker getNarrativeRoles 3/6/8档链路**不是固定10选3**)
- 每张 storyboard 图走 provider 主备(gpt edits→gemini fallback) + 重试退避
- **A/B/C 三策略不在一期主链路**A/B/C 是"同一目标图的三种改图策略",留给二期的"单图重生成/改图"功能,不与 storyboard 分镜混跑(否则任务数×UI 爆)
- getNarrativeRoles 角色框架(hook/pain_scene/applied_proof/texture/scenario/tutorial/social_proof/closer)是可迁移数据,按 image_count 取前 N 个角色
### 4.3 裂变引擎扒split.js上线版
- 1爆款→N完整笔记包(标题+正文+标签+imagePlan分镜+维度+人群+场景+痛点)
- 爆款参考度调节(低30/中/高85防抄袭) ; generateImages=true串生图
- _combine_benchmarks1-5篇标杆合并成综合reference(新造)
### 4.4 去水印image_postprocessor·新造·洞3
- 🔴 主方案=**重编码去C2PA元数据+转JPG+轻重采样削像素水印+压缩**(Pillow,对客户透明);保留可视质量,**C2PA元数据可去除私有像素水印只能削弱不保证100%清除**(诚实表述,外部AI审核P1-9)
- 备选=banana remove_watermark(Gemini重绘)——⚠️对海报中文大字有改字风险,仅特殊场景用,非主通道
- eval_score**一期留NULL**,不接banana假评分(88分污染飞轮),等组长标准蒸馏真评分(三期)
## 5. 异步队列扒banana骨架
- Celery任务生图异步(每张~4min) / **只传task_id绝不传key(基石B)** / worker内查库取encrypted_key→FERNET_KEY解密→局部变量,不落盘不打日志
- gemini_factory每任务用自己key构建实例(新造,解决全局单例)
- 失败处理Celery task失败→更新任务状态→SSE推task_failed(带code) ; 生图502重试退避
- SSERedis Pub/Sub推进度(扒banana event_bus)
## 6. 多租户与安全基石BC,扒banana JWT
- JWT HS256每请求验签,放user_id/workspace_id/role加速字段
- 🔴 读写分层(基石C外部AI审核P1-7细化)
- **写操作+切workspace**:必须查 workspace_members 校验权限
- **列表读**:用 JWT 的 current_workspace_id 过滤即可(加速)
- **单资源读**(任务详情/候选详情/下载包):仍须校验 resource.workspace_id == current_workspace_id不能笼统信JWT(防越权读他人资源)
- base_workspace_repo所有workspace相关Repo继承,强制带workspace_id过滤(新造,防串数据)
- workspace_guard中间件FastAPI依赖注入,所有业务接口强制注入workspace_id
- token-url收口统一自家中转站endpoint**账号表只存encrypted_key不存url字段**(旧"兼容任意url"已废止)
- 上传安全(扒banana)magic number校验+扩展名白名单+路径穿越防护
## 7. 存档打包package_exporter·新造·洞6
- 达人素材交付包:按笔记分文件夹+图(01/02/03命名防错序)+文案.txt(标题+正文+标签)+📋发布清单.txt+✅合规说明.txt(违禁词已过/已去水印)
- delivery_packages表:status(pending/ready/downloaded)/package_path
- 数据可导出(归客户,client_data) ; 飞轮偏好归平台(platform_asset)
## 8. 偏好飞轮(新造·灵魂·开放测试即启动)
- 三信号入口(preference_collector写events):选文案+3/选图+3/通过+5/打回-3/重生成-1(初始默认权重,北哥可校准)
- 实时聚合(preference_aggregator)查最近50条→最常选角度+打回原因近3条原文拼进prompt;不足5条用产品档案冷启动
- 三层继承L1品牌基线>L2人设(二期)>L3个人手感;⚠️按产品维度分开学(素颜霜不串精华)
- 🔴 飞轮MVP验收四点(基石E,全过才达标)events正确写入✓ / aggregator返回明确prompt片段✓ / 下次prompt trace含该片段✓ / UI显示"本次已注入:最近偏好/打回原因"✓
## 9. 配置与环境(架构没列,PRD补
- 环境变量完整清单(必填项启动时校验,缺失则启动失败报错不静默)
- FERNET_KEY(必填,key解密,绝不进代码库) / JWT_SECRET(必填≥32字符) / DATABASE_URL / MONGO_URI / REDIS_URL
- IMAGE_PROVIDER_PRIMARY=gpt / IMAGE_PROVIDER_FALLBACK=gemini / IMAGE_API_BASE(自家中转站url) / IMAGE_MODEL=gpt-image-2
- CLAUDE_API_URL / GEMINI_API_URL(都收口自家站)
- 6容器Docker Compose(扒banana,调环境变量名) ; 文件存储:交付包路径规则uploads/packages/{workspace}/{task}/
## 10. 工程规范与可观测
- 健康检查 GET /health(Docker健康检查用)
- Alembic迁移001-004按序;回滚策略;FERNET_KEY缺失启动保护
- 可观测每次AI调用记ai_call_logs(谁/多少token,失败归因到个人key) ; MongoDB存调用trace排障
- 错误处理:统一错误码(§3.2) ; Celery失败SSE推送