- 产品编辑入口统一走 ProductFormFull(卖点/风格/人群/品牌词全字段); 修复开任务页 <form> 套 <form> 致"编辑产品"报错、改不了、跳回首个产品 - dashboard 入口卡片对齐实际路由: 系统管理(/config) 与 工作配置(/settings) 分开; settings ?tab=products 直达改用挂载后读 URL, 消除 hydration mismatch - 新增用户管理(users API/admin service/改密页) + alembic 022/023/024 - 上线部署: Dockerfile / docker-compose.prod+https / nginx https / .env.example - A8 三套正交叙事(痛点/场景/成分背书) + beige 调色去AI化 + 飞轮 text_import 高权重信号 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
9.7 KiB
9.7 KiB
核销表 · 第6环 配图
90分级验收清单(孙总方法论·硬门禁)。已吸收独立交叉验证修正(⚠️标注处,含1处严重落点错误已修)。 规则:做完一个勾一个,每勾必附证据。auto=机器判定,human=目视。
🔴 2026-06-15 倩倩姐拍板重大调整:
- 本轮目标收缩=先打通单套配图(含去AI化+尺寸可选),3套正交A/B/C扩展挪到下一轮。
- 去AI化对齐大卫xhs实测版(
大卫/小红书系统图片定制/xhs-tool/backend/infrastructure/imagePostProcess.js只读素材源,运营实测去AI化能力强)。- 尺寸按大卫=3:4默认1024×1536(gpt原生免拉伸),原 S4/A5 写的"强缩1080×1440"作废——大卫±2%容差内不resize,零失真。
- 三套叙事措辞由倩倩姐起草,不临时占位。
🔴 2026-06-15 端到端验证发现(task58 codeproxy主通道实测):
- 根因修复:
.env图片主通道曾误配IMAGE_PROVIDER_PRIMARY=apiports,但 apiports 无 gpt-image-2 的 edits 端点(返回SPA首页HTML→Expecting value报错),违反红线「生图主=codeproxy」。已改回 codeproxy,worker重建,task58 六图全出(provider=codeproxy/success=1)。详见记忆 clover-apiports-no-image-edits-endpoint。- ⚠️ 产品名占位污染产出(待北哥真数据):product_id=1 name="素颜霜(预置样本)","(预置样本)"被画进图(02特写标题)。同"Clover"类,是测试数据污染非链路bug,换真实产品名即正常。
- ⚠️ status enum 无 'failed':任务失败只能无限重试或硬改 rejected,设计缺口待补。
🟢 本轮施工图(单套配图打通·先列后做)
| # | 改什么 | 落点 | 对应大卫 |
|---|---|---|---|
| P1 | image_postprocessor 重写:加 RATIO_MAP(1:1/3:4/4:3/9:16/16:9)、±2%容差跳过、SynthID破除(缩2px裁1px边+modulate亮度1.005/饱和0.998,env SYNTHID_HARD_MODE开关)、quality 88→100/chroma4:4:4 | image_postprocessor.py | imagePostProcess.js逐项 |
| P2 | process_image 加 aspect_ratio='3:4' 参数;pipeline_io 调用处传尺寸 | image_postprocessor.py + pipeline_io.py:204 | RATIO_MAP默认3:4 |
| P3 | 生图请求尺寸对齐 1024×1536(gpt原生3:4),确认 image_gen size 正确 | constants.py + image_gen.py | 1024×1536 |
| P4 | 配图段写 ai_call_logs(call_type='image',provider,success,latency,error_code) | pipeline_io.py:244前 | Clover自有 |
🔴 2026-06-15 倩倩姐纠偏:标绿门槛=真实数据端到端跑通: task58 是占位产品("素颜霜(预置样本)")跑的,不算端到端成功。下方 B1-B8 的"✅"降级为"🟡链路自测通过(占位数据)",必须用北哥真实数据(产品名=素颜霜/品牌词=倍分子)重跑通才能标真绿。倩倩姐原话"标绿不能随便标,得端到端测试成功之后才能标"。
- apiports 确实有生图接口(后台image key已启用/有余额/历史54万tokens),只是接法与
/images/edits不同,在大卫xhs里是可用备用通道,待coder查正确接法后修成真备用。本轮主线先codeproxy。
🟡 验收清单(本轮·单套)— 占位数据自测通过,待真实数据复验
下列✅=占位产品task58链路自测通过;🔴 = 待倍分子素颜霜真实数据重跑确认。
- B1〔auto〕单套6图入库:✅task58
image_candidatesCOUNT=6(id171-176),role齐(hook/product_closeup/ingredient/texture/applied_proof/closer),url非空,/app/uploads/3/58/ 6个jpg真落盘(1.1-1.35MB)。 - B2〔auto〕尺寸3:4=1024×1536:✅task58 PIL独立读6张全部(1024,1536),容差内未拉伸。
- B3〔auto〕去元数据:✅task58 6张 exif全NONE。(SYNTHID缩边验证归B8 coder交叉)
- B4〔auto〕尺寸可选真生效:✅单测 process_image('1:1')→(1024,1024)、('3:4')→(1024,1536)、传1080×1440→resize到(1024,1536)。
- B5〔auto〕生图写日志:✅task58
ai_call_logscall_type='image'/provider='codeproxy'/success=1/latency_ms=345907/error_code=NULL。 - B6〔auto〕禁降级硬失败保持:✅task57 need_product_image=True无参考图→拒绝降级(日志"拒绝降级纯文生图"),image_candidates COUNT=0,无"降级"成功字眼。
- B7〔human〕浏览器真验:✅倩倩姐+我目视task58封面(01_hook"早八来不及"大字清晰/三卖点勾选/产品与参考图一致/场景去AI化真实/瓶身无虚假品牌词合规)+02特写(产品居中/卖点+气泡框清晰),3:4比例画质佳。⚠️仅"(预置样本)"占位字样待真数据。
- B8〔auto〕交叉验证:✅coder独立起脚本重核task58,结论与team-lead一致:B1(COUNT=6/role齐)、B2(6张全1024×1536/exif=None/icc=None/xmp=None)、B4=B5(provider=codeproxy/success/无Expecting value报错)真绿,B3 N/A(SYNTHID_HARD_MODE未开)。无谎报无放水。
📦 下一轮:3套正交扩展(本轮不做,归档备查)
单套打通后再做。叙事措辞等倩倩姐起草。原 S1/S2/S3/S7/S8 + A1/A2/A3/A4/A7/A8 归此。
Ralph 修改步骤(下一轮)
| # | 改什么 | 落点 |
|---|---|---|
| S1 | generate_storyboard_images 循环3次(strategy A/B/C),每次传不同 strategy_hint 影响叙事维度;返回 list[dict]→list[list[dict]] | image_gen.py:121-173 |
| S2 | plan_image_set 接收 strategy 参数,按 strategy 切换叙事描述(新增A痛点先行/B场景先行/C成分背书先行3条),写进 base_prompt 叙事链路段 | storyboard.py:119-193 + constants.py:66-70 |
| S3 | run_image_generation 对 A/B/C 各调一次,存 ImageCandidate 时 strategy 分别写 A/B/C(修掉:207硬编码'A');SSE strategy 随之正确 | pipeline_io.py:156-213 |
| S4 | ⚠️强制 resize(落点已修正,见下):Image.open(...).convert('RGB') 后立即插入 img=img.resize((1080,1440),Image.LANCZOS),并把第47-49行 resize(original_size) 改为 resize((1080,1440)) |
image_postprocessor.py:41 之后 |
| S5 | run_image_generation 仿 run_text_generation:77-93,三套全完后写 AiCallLog(call_type='image',provider取实际路由,success/latency覆盖整批,单套失败不阻断,success=False写error_code) | pipeline_io.py:215 db.commit() 前 |
| S6 | ALLOW_TEXT_ONLY_IMAGE 默认 'true'→'false',与 pipeline_io:150 硬失败对齐 | image_gen.py:70 |
| S7 | 前端 generationStore 新增 imageSets:Record<'A'|'B'|'C',ImageCandidate[]>,addImageCandidate 按 strategy 分流,reset/hydrate 同步 | generationStore.ts:15-122 |
| S8 | 图片选择页加 A/B/C 切换 Tab,默认套A,每套内单张可选;DTO strategy 字段已存在无需改类型 | 新建 ImageSetTabs.tsx 或 page 内联 |
⚠️ 交叉验证补强(执行前必看)
- 🔴S4 严重修正:原清单写"在 buf.save 之前插入 resize"是错的——那个位置已经过了基于 original_size 的缩放,拿到的还是 gpt-image-2 返回的 1024×1536。正确落点:
Image.open().convert('RGB')之后立即锁死 1080×1440,且第47-49行原resize(original_size)同步改成resize((1080,1440))。 - S1+S3 必须同步:S1 改返回值 list→list[list],pipeline_io.py:165 的
enumerate(image_results)解包会变。不能只做 S1 不做 S3,中间是崩溃态。 - S6 两层说清:pipeline_io:150 是第一层(按产品 need_product_image 字段拦);image_gen:70 是第二层(直调 generate_one_image 的兜底)。两层同时维护,别只改一处。
验收清单(做完一个勾一个)
- A1〔auto〕3套各6张:
SELECT strategy,COUNT(*) FROM image_candidates WHERE task_id=<id> GROUP BY strategy→ 3行,每行 count=6(或=image_count),strategy=A/B/C。 - A2〔auto〕SSE strategy 三值:DevTools Network 找 SSE 流,grep image_candidate,strategy 出现 A/B/C 各>0次(非全'A')。
- A3〔human〕⚠️前置:S1+S2 已完成。三套 base_prompt 叙事段不同:在 plan_image_set 加
logger.info("strategy=%s base_prompt前100字=%s", strategy, base_prompt[:100]),确认套A含'痛点先行'/套B含'场景先行'/套C含'成分背书先行'。 - A4〔拆两层〕⚠️品牌词进特写图:
- ①〔auto〕代码层:storyboard.py 中 strategy=A 的第2/6张 item 包含 brand_keyword 与 brand_keyword_rule 字段(DEBUG日志或单测断言)。这是 pass/fail 判据。
- ②〔human〕效果层:下载第2/6张目视有'Clover'(best-effort,模型概率性,不作代码验收判据——gpt-image-2瓶身小字会糊已记录在案)。
- A5〔auto〕尺寸严格 1080×1440:⚠️先确认实际写盘路径(worker 日志,默认 UPLOAD_BASE_PATH='uploads/packages' 不是 /app/uploads)→
python3 -c "from PIL import Image;print(Image.open('<实际路径>/01_hook.jpg').size)"必须 (1080,1440)。 - A6〔auto〕生图写日志:
SELECT provider,success,latency_ms FROM ai_call_logs WHERE task_id=<id> AND call_type='image'→ ≥1行,provider非空、latency_ms>0、success IN(0,1)。 - A6b〔auto〕⚠️日志内容正确性(S5核心差错逻辑):三套全成功时 success=1;至少一套失败时 success=0 且 error_code 非空。
- A7〔auto〕无参考图硬失败:建 need_product_image=True 但产品无参考图的任务 → task status='failed',image_candidates 无该 task 记录,worker 日志不含'降级为纯文生图'。
- A8〔human〕前端 A/B/C Tab:图片选择页有 A/B/C 可点 Tab,点击切换图片网格内容,三套 URL 不同(非平铺混在一起)。
待北哥定义(不阻断本环代码骨架,prompt 占位先留)
- 三套叙事维度的具体文案措辞(先用 痛点/场景/成分背书 占位,北哥方案到位再填)。