fix: PMC 测试清单未完成项 + YYX#row22 未读角标
PMC#16 账户登录地址不正确: - 写死的 https://airshelf.com/login(不存在的域名)改成 ${location.origin}/login, 与邀请链接同源,成员拿到的就是当前真实访问地址。 PMC#17/#18 成员三档额度只有月度生效、日/总纯装饰 → 列表显示与配置对不上: - TeamMember 新增 daily_credit_limit / total_credit_limit(0=不限,迁移 0006); - reserve_credit 逐档真实管控(每日/每月/累计总额),口径=窗口内 CHARGE 流水 + 在途预留; - 成员列表"每日额度"由写死"不限"改成真实日额度+今日已用,并新增"总额度"列; - 创建/编辑弹窗三档额度真入库真生效;补 3 个计费单测(日/总拦截、0=不限)。 PMC#24 同批生成的图片文字/内容雷同: - 根因=套图/自由创作同批 N 张用同一 prompt 且无变化(只有模特上身图按 index 变); - 给平台套图/自由参考/纯文生图都加按 index 的版式变体,避开传 seed(防中转站 400)。 PMC#25 重跑应在原任务上重跑而非新开任务: - 全批"重跑"改为原地复位同一批次卡;"重跑这张/再生成"改为补图进原卡(不覆盖好图、不新开任务)。 YYX#row22 图片生成未读角标(本仓库既有改动一并提交): - AITask 新增 read_at(迁移 0020 + 索引一致性迁移 0021);导航栏"图片生成"未读胶囊、 商品预览右下角未读分数;查看某商品即标记其生成任务已读、清零角标。 注:PMC#14/#15/#20/#22/#23 早前提交已修,需部署重测;PMC#13/#21 为 provider 侧 生成失败,代码侧重试/退费/僵尸回收/错误外露已就位,需部署后看真实 error_message 定位; PMC#19 收件箱标记与设计稿逐字一致,待截图复现。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -962,9 +962,22 @@ def build_model_tryon_prompt_refs(product, has_model: bool, base_prompt: str = "
|
||||
return " ".join(lines)
|
||||
|
||||
|
||||
def build_platform_cover_prompt_refs(product, has_model: bool, base_prompt: str = "") -> str:
|
||||
# 平台套图同批多张要「同款商品、不同版式」,否则 N 张文案/构图雷同(PMC#24)。
|
||||
# 锁死商品一致性,只让排版/构图/视角/配色基调按张变化。
|
||||
_COVER_VARIATIONS = [
|
||||
"本张:正面居中主图版式,商品占画面主体,纯净背景,经典电商主图构图",
|
||||
"本张:换一种排版——商品偏置 + 卖点文案分区,场景化背景,杂志感构图",
|
||||
"本张:特写细节版式,放大商品材质/做工,近景视角,突出质感",
|
||||
"本张:生活场景套图版式,商品置于真实使用情境,环境光,氛围感构图",
|
||||
"本张:多角度组合版式,商品换一个朝向/视角,几何分区背景,现代简约风",
|
||||
"本张:促销封面版式,留出标题/价签区,高对比配色,强视觉冲击构图",
|
||||
]
|
||||
|
||||
|
||||
def build_platform_cover_prompt_refs(product, has_model: bool, base_prompt: str = "", index: int = 0) -> str:
|
||||
"""平台套图 image_edit 提示词(refs 版):参考图1=商品真实主图(锁外形/品牌/配色/Logo),
|
||||
有模特时参考图2=出镜模特(锁人脸/身形)。生成电商平台主图 / 封面套图,商品须还原真实包装。"""
|
||||
有模特时参考图2=出镜模特(锁人脸/身形)。生成电商平台主图 / 封面套图,商品须还原真实包装。
|
||||
`index` 让同批每张的版式/构图/视角不同,避免 N 张雷同(PMC#24)。"""
|
||||
name = (getattr(product, "title", "") or "商品").strip()
|
||||
lines = [f"参考图1是「{name}」的真实商品主图。"]
|
||||
if has_model:
|
||||
@@ -978,12 +991,13 @@ def build_platform_cover_prompt_refs(product, has_model: bool, base_prompt: str
|
||||
"商品的外形、品牌文字、配色、Logo、材质必须与参考图1高度一致,严禁改动或重新设计包装;"
|
||||
"干净背景、电商主图构图、真实质感。"
|
||||
)
|
||||
lines.append(_COVER_VARIATIONS[index % len(_COVER_VARIATIONS)] + "。")
|
||||
if base_prompt and base_prompt.strip():
|
||||
lines.append(base_prompt.strip())
|
||||
return " ".join(lines)
|
||||
|
||||
|
||||
def build_free_reference_prompt(base_prompt: str, n_refs: int = 1) -> str:
|
||||
def build_free_reference_prompt(base_prompt: str, n_refs: int = 1, index: int = 0) -> str:
|
||||
"""图片创作自由模式 · 带用户上传参考图时的提示词。
|
||||
纯把用户原话丢给图生图,模型只会松散借个色调、不会真的保留参考图里的主体(背心/商品/人物),
|
||||
这正是「没参考我上传的素材」的根因。这里显式把参考图钉成「画面主体的唯一依据」,要求严格保留其
|
||||
@@ -1005,6 +1019,9 @@ def build_free_reference_prompt(base_prompt: str, n_refs: int = 1) -> str:
|
||||
lines.append(f"在此基础上,按用户要求创作:{base}")
|
||||
else:
|
||||
lines.append("在此基础上,生成干净、专业的电商视觉画面。")
|
||||
# 同批多张要不同构图/视角,否则雷同(PMC#24);主体一致性已在上面钉死,这里只变表现。
|
||||
if index > 0:
|
||||
lines.append(_COVER_VARIATIONS[index % len(_COVER_VARIATIONS)] + ",在保持主体一致的前提下换一种表现。")
|
||||
lines.append("画面真实、构图协调、细节清晰。")
|
||||
return " ".join(lines)
|
||||
|
||||
@@ -2177,7 +2194,7 @@ def run_standalone_image_task(*, task_id: str) -> None:
|
||||
elif mode == "cover" and product_url:
|
||||
# 平台套图:参考图1=商品真实主图(锁包装一致性),有模特则参考图2=模特(锁人脸/身形)
|
||||
edit_images = [product_url] + ([model_url] if model_url else [])
|
||||
edit_prompt = build_platform_cover_prompt_refs(product, has_model=bool(model_url), base_prompt=prompt)
|
||||
edit_prompt = build_platform_cover_prompt_refs(product, has_model=bool(model_url), base_prompt=prompt, index=index)
|
||||
elif bool(payload.get("reference_product")) and product_url:
|
||||
edit_images = [product_url]
|
||||
edit_prompt = build_product_triview_prompt_refs(product, "")
|
||||
@@ -2185,7 +2202,7 @@ def run_standalone_image_task(*, task_id: str) -> None:
|
||||
# 图片创作自由模式:以用户上传的参考图为基底出图。提示词必须显式要求「保留参考图主体」,
|
||||
# 否则图生图只会松散借个色调、不真的还原上传的素材(=用户反馈的「没参考我的图」)。
|
||||
edit_images = ref_urls
|
||||
edit_prompt = build_free_reference_prompt(prompt, n_refs=len(ref_urls))
|
||||
edit_prompt = build_free_reference_prompt(prompt, n_refs=len(ref_urls), index=index)
|
||||
use_edit = bool(edit_images)
|
||||
try:
|
||||
if use_edit and can_edit:
|
||||
@@ -2201,7 +2218,11 @@ def run_standalone_image_task(*, task_id: str) -> None:
|
||||
vsize = "2304x1728" if payload.get("reference_product") else _ratio_to_volcano_size(str(payload.get("ratio") or ""))
|
||||
response = provider.image_generation(model=model_config.name, endpoint=model_config.endpoint, prompt=edit_prompt, image=edit_images, size=vsize)
|
||||
else:
|
||||
response = provider.image_generation(model=model_config.name, endpoint=model_config.endpoint, prompt=prompt)
|
||||
# 纯文生图同批多张要不同构图,否则雷同(PMC#24);index>0 追加换版式指令。
|
||||
gen_prompt = prompt
|
||||
if index > 0:
|
||||
gen_prompt = f"{prompt}。{_COVER_VARIATIONS[index % len(_COVER_VARIATIONS)]},换一种构图与视角。"
|
||||
response = provider.image_generation(model=model_config.name, endpoint=model_config.endpoint, prompt=gen_prompt)
|
||||
media = provider.extract_first_media_url(response)
|
||||
with transaction.atomic():
|
||||
task.status = AITask.Status.SUCCEEDED
|
||||
|
||||
Reference in New Issue
Block a user