109 lines
8.3 KiB
Markdown
109 lines
8.3 KiB
Markdown
# AI玩具专利生成工作流
|
||
|
||
## 启动
|
||
- 推荐本地环境:`cd ~/Projects/code/20260518-ai-toy-patent-workflow && npm run docker:up` — Docker Compose,端口 4560
|
||
- 浏览器打开 http://localhost:4560
|
||
- 备用非 Docker 开发:`npm run dev` — 端口 4560
|
||
- 首次依赖装好:`npm install --legacy-peer-deps`(next 15 + react 19 有 peer 警告)
|
||
|
||
## 部署事实
|
||
- 平台:个人 VPS `76.13.31.179`,Docker Compose,接入现有 Coolify Traefik
|
||
- 发布状态:VPS 生产已发布,仅个人使用
|
||
- 最近生产部署:2026-05-30,视频 provider 改为默认 OpenAI Sora(`VIDEO_PROVIDER=openai_sora`),Seedance 仅作为可选回退;视频模板目标时长统一不少于 60 秒,并通过 OpenAI `/videos/extensions` 链路补足长视频;对应代码提交 `9c41caf`
|
||
- 服务名 / 容器名:`ai-toy-patent-workflow`
|
||
- 服务器路径:`/opt/ai-toy-patent-workflow`
|
||
- 主站 / 前端:https://ai-toy.kang-kang.com
|
||
- 登录页:https://ai-toy.kang-kang.com/login
|
||
- 本地 Docker:http://localhost:4560
|
||
- API / 后端:内置 Next.js API Route(生产同域名)
|
||
- 文档 / 解析:无
|
||
- 管理后台:无
|
||
|
||
## 快捷登录
|
||
- 已启用应用内登录页
|
||
- 登录地址:`https://ai-toy.kang-kang.com/login`
|
||
- 用户名 / 密码:见 `.project.json.quick_login`;生产备份在 VPS `/root/ai-toy-patent-workflow-login.txt`
|
||
- 会话:HttpOnly HMAC Cookie,生产变量只放 VPS `deploy/.env.production`
|
||
|
||
## 元数据回写清单
|
||
- 改公网域名或迁移部署时,更新 `.project.json.urls` + 本节
|
||
- 数据持久化在 `data/`(gitignored),不入库;上传原图在 `data/uploads/`
|
||
- 后端审计库:`data/app.db`(SQLite);Docker 镜像内置 `sqlite3`,记录上传、生成、选择、角色锁定、素材包进度、重做、视频提交、图库/记录查看等事件
|
||
- 审计兜底:非 Docker 本地如果缺少 `sqlite3`,写入 `data/audit-fallback.jsonl`,不阻断生成流程
|
||
- 本地 Docker 使用 `docker-compose.yml`,挂载 `./data:/app/data`,读取 `.env.local`,并强制 `PUBLIC_APP_URL=http://localhost:4560`
|
||
- VPS 生产 Docker 使用 `docker-compose.prod.yml`,挂载 `./data:/app/data`,读取 `deploy/.env.production`,并强制 `PUBLIC_APP_URL=https://ai-toy.kang-kang.com`
|
||
- VPS 数据持久化在 `/opt/ai-toy-patent-workflow/data`
|
||
- VPS 生产环境变量在 `/opt/ai-toy-patent-workflow/deploy/.env.production`,不入库
|
||
- 资源索引:运行 `npm run resources:index` 生成 `data/resource-index.json`、`data/resource-index.md` 和 `data/named/` 人类可读软链接;原始资源文件名不能直接改,避免 session JSON / 图片 URL 断链
|
||
- 风格示意图:运行 `npm run styles:previews -- --force` 用 GPT 图片模型生成 `public/style-previews/*.png`;UI 左侧风格卡片直接引用这些小图
|
||
|
||
## 环境变量
|
||
- `OPENAI_API_KEY` — GPT / OpenAI API Key;文本、结构化、图片生成以及默认 OpenAI Sora 视频生成共用
|
||
- `GPT_TEXT_MODEL` — 默认 `gpt-5.5`,用于角色设定等结构化输出
|
||
- `GPT_IMAGE_MODEL` — 默认 `gpt-image-2`,用于意向图和三类素材包图片生成
|
||
- `GPT_API_BASE` — 默认 `https://api.openai.com/v1`
|
||
- `VIDEO_PROVIDER` — 默认 `openai_sora`;需要回退时可设为 `seedance`
|
||
- `OPENAI_VIDEO_MODEL` — 默认 `sora-2-pro`,用于 OpenAI 视频生成
|
||
- `OPENAI_VIDEO_MIN_SECONDS` — 默认 `60`;视频模板目标时长不得低于 60 秒
|
||
- `OPENAI_VIDEO_QUALITY` — 默认生产建议 `high`,对应 OpenAI 允许的视频输出尺寸
|
||
- `SEEDANCE_API_KEY` — Seedance 视频生成 Key;仅 `VIDEO_PROVIDER=seedance` 时使用,未配置则视频接口返回 503
|
||
- `SEEDANCE_MODEL` — 默认 `doubao-seedance-2-0-260128`
|
||
- `SEEDANCE_API_BASE` — 默认 `https://ark.cn-beijing.volces.com/api/v3`
|
||
- `PUBLIC_APP_URL` — 生产填公网入口,用于把 `/api/img/...` 补成 Seedance 可访问的绝对 URL
|
||
- `WEB_AUTH_USERNAME` / `WEB_AUTH_PASSWORD` / `WEB_AUTH_SESSION_SECRET` — 网页登录;真实值只放 `.env.local` 和 VPS `deploy/.env.production`
|
||
- `WEB_AUTH_COOKIE_NAME` — 默认 `ai_toy_session`
|
||
- `WEB_AUTH_COOKIE_SECURE` — 本地 `false`,生产 `true`
|
||
- 配置位置:`.env.local`(gitignored),参考 `.env.local.example`
|
||
- 生产配置模板:`deploy/.env.production.example`;真实生产值只放 VPS 的 `/opt/ai-toy-patent-workflow/deploy/.env.production`
|
||
- 图片生成未配置 GPT Key 时回退 mock(SVG 占位图),视频生成不 mock,必须配置 Seedance Key
|
||
- 除 `/login`、`/api/auth/*` 和 `/api/img/*` 外,页面与 API 都需要登录;`/api/img/*` 保持公开是为了 Seedance 能从公网读取参考图
|
||
|
||
## 规则
|
||
- 全项目规则真源:`/Users/kangwan/Projects/code/20260317-rules-dashboard/RULES.md`
|
||
- 文本/结构化/图片生成统一使用 GPT 最高规格配置
|
||
- 视频生成默认使用 OpenAI Sora;Seedance 只作为可选回退 provider
|
||
- 不允许编造不存在的部署域名、账号、密码
|
||
|
||
## 图像链路事实
|
||
- 输入入口:想法、二创、复刻三段;复刻模式会把上传主体图直接作为 L0 锚图
|
||
- L0:用户选中的意向图
|
||
- L1:角色锁定时生成的白底净化锚图,写入 `CharacterSpec.cleanReferenceImageUrl`
|
||
- L2:每个素材包的根图,例如 `patent_front`、`acc_inventory_sheet`、`prod_front_spec`、`mkt_white_front`
|
||
- L3:包内其它图,基于对应 L2 根图生成
|
||
- pack 图像生成必须走真实图生图:读取 anchor 图片字节后调用 GPT image edit,不再把参考图 URL 当纯文本拼进 prompt
|
||
- 单张重做接口:`POST /api/assets/[assetId]/regenerate`,必须沿用该图的 anchor
|
||
- 单张重做需要 `confirmCost=true`;前端会二次确认,服务端会拒绝未确认请求,并对同一 session/asset 加并发锁防连点烧钱
|
||
- 生成图库:`/api/gallery/[sessionId]`,按真实图片宽高比例展示缩略图,鼠标悬停显示大图;同页可跳转操作记录
|
||
- 操作记录:`/api/audit/[sessionId]`,读取 `data/app.db` 展示事件流水和图片索引
|
||
- 视频参考优先级:宣发白底图 `mkt_white_front` → 专利主图 `patent_front` → L1 白底锚图 → L0 意向图
|
||
- 上传 API:`POST /api/uploads`,multipart 图片存入 `data/uploads/`,返回 `UploadedImage`
|
||
- 复刻建项目 API:`POST /api/projects/from-upload`,`mode=replicate` 时跳过批量生图,创建 selected L0,Vision 推断 `CharacterSpec`,并用 strict L1 净化 prompt
|
||
- 上传图锁定 API:`POST /api/character/lock-from-upload`,用于对上传主体图重新推断并 strict 净化
|
||
- 多宫格提案板 / 品牌手册 / 包装展示图上传后,strict L1 会先抽取最大最清晰的单一主角色,不保留版式、标题、包装平铺和场景小图
|
||
- 用户上传图中的原创品牌字样、帽标、服装标识、面罩图案和配件图形必须保留;只对明显第三方已注册 IP 做替换提示
|
||
- 素材包生成支持后台模式和增量保存;长耗时任务会逐张写回 session,重复触发同一 session/image/kind 会被并发锁挡住
|
||
|
||
## 注意事项
|
||
- `data/` 目录会存原图(generated/selected/refs),可能体积大,已 gitignored
|
||
- `refs/` 下放参考资料 PDF/DOCX/图(已 gitignored,但 `refs/README` 之类可放进库)
|
||
- mock 模式仅用于跑通流程,生图质量为零(只是 SVG 笑脸占位)
|
||
|
||
## 工作流
|
||
1. 输入模式:
|
||
- 想法:prompt + 可选参考图(最多 4 张)+ 风格 + 数量(4/8/12)
|
||
- 二创:上传参考图 + 变化方向 + 风格 + 数量,生成变体候选
|
||
- 复刻:上传主体图,直接作为 L0 锚图并锁定角色
|
||
2. 点 🪄 批量生成 / `⌘/Ctrl+Enter`
|
||
3. 九宫格快筛:数字键 `1-9` 选中,`Shift+1-9` 打叉
|
||
4. 选中的图自动复制到 `data/selected/`
|
||
5. 锁定角色设定 `CharacterSpec`
|
||
6. 串行生成图片包:必须从专利包开始,顺序为 `专利包 -> 配件包 -> 生产打样包 -> 宣发包`
|
||
7. 前一个图片包完整生成后,下一个图片包才解锁;不提供“一键全包”入口或全包 API
|
||
8. 四个图片包完成后,才解锁文案模板和 OpenAI Sora 视频任务:旋转展示、开箱、触感细节、角色故事、工厂预览;每条视频目标时长不少于 60 秒
|
||
9. 侧栏保留历史会话,点击切换
|
||
|
||
## 后续路线
|
||
- 导出专利包:PNG高清 + PDF合订
|
||
- ZIP/PDF 打包下载
|
||
- OpenAI Sora 长视频任务轮询 UI 细化
|