feat(core): 人物正面氛围图按统一模板后端拼装(全身/纯色背景)
新增 build_person_frontal_prompt:电商真人模特,氛围正面全身照,<脚本提取/用户描述>,自然妆容,柔和影棚光,真实质感,单人,纯色背景。管线人物立绘(generate_base_asset kind=person)与模特库 seed(model_library)都改走它,不再把原始描述裸丢生图、不再半身/简洁背景。三视图 THREE_VIEW_PROMPT 保持不变。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
1ecb186ddf
commit
016c859004
@@ -13,7 +13,7 @@ import uuid
|
||||
from io import BytesIO
|
||||
|
||||
from apps.ai.models import ModelConfig
|
||||
from apps.ai.services import _asset_preview_url, build_provider, get_default_model
|
||||
from apps.ai.services import _asset_preview_url, build_person_frontal_prompt, build_provider, get_default_model
|
||||
from apps.assets.models import Asset, AssetFile
|
||||
from apps.assets.storage import TosStorage
|
||||
|
||||
@@ -67,8 +67,8 @@ def generate_model(*, team, user, brief: str, name: str | None = None) -> dict:
|
||||
raise ValueError(f"当前图像模型 {model_config.provider.name}:{model_config.name} 不支持参考图三视图(image_edit)")
|
||||
|
||||
label = name or brief[:16]
|
||||
# 1) 9:16 氛围正面图
|
||||
frontal_prompt = f"{brief},电商真人模特,9:16竖屏氛围正面半身,自然妆容,柔和影棚光,真实质感,单人,简洁背景"
|
||||
# 1) 9:16 氛围正面图(画幅由 size 控制;提示词用统一的人物正面模板:全身 / 纯色背景)
|
||||
frontal_prompt = build_person_frontal_prompt(brief)
|
||||
resp = provider.image_generation(model=model_config.name, prompt=frontal_prompt, size="1024x1536")
|
||||
frontal = _store_model_asset(
|
||||
team=team, user=user, media=provider.extract_first_media_url(resp),
|
||||
|
||||
@@ -464,6 +464,14 @@ def build_platform_cover_prompt_refs(product, has_model: bool, base_prompt: str
|
||||
return " ".join(lines)
|
||||
|
||||
|
||||
def build_person_frontal_prompt(description: str = "") -> str:
|
||||
"""人物正面氛围图提示词:把脚本提取(或用户输入)的人物描述包成统一模板。
|
||||
用户钦定格式:电商真人模特,氛围正面全身照,<描述>,自然妆容,柔和影棚光,真实质感,单人,纯色背景。"""
|
||||
desc = (description or "").strip()
|
||||
inner = f"{desc}," if desc else ""
|
||||
return f"电商真人模特,氛围正面全身照,{inner}自然妆容,柔和影棚光,真实质感,单人,纯色背景"
|
||||
|
||||
|
||||
def generate_base_asset(*, project, user, kind: str, prompt: str, label: str = "", group_id: str | None = None) -> AITask:
|
||||
"""提交基础资产生成(**异步**):Web 请求只建 RESERVED 任务 + 预留额度(秒级),
|
||||
慢出图(文生图 / 商品 image_edit)交给 Celery worker(run_base_asset_task)跑。
|
||||
@@ -480,7 +488,12 @@ def generate_base_asset(*, project, user, kind: str, prompt: str, label: str = "
|
||||
# 无主图或当前模型不支持 image_edit → 回落纯文生图(仅凭商品名脑补,不保证还原真实包装)。
|
||||
product_ref_url = _product_cover_url(project.product) if kind == BaseAssetGroup.Kind.PRODUCT else ""
|
||||
use_edit = bool(product_ref_url) and hasattr(provider, "image_edit")
|
||||
gen_prompt = build_product_triview_prompt_refs(project.product, prompt) if use_edit else prompt
|
||||
if use_edit:
|
||||
gen_prompt = build_product_triview_prompt_refs(project.product, prompt)
|
||||
elif kind == BaseAssetGroup.Kind.PERSON:
|
||||
gen_prompt = build_person_frontal_prompt(prompt) # 人物立绘:包成「电商真人模特/正面全身/纯色背景」统一模板
|
||||
else:
|
||||
gen_prompt = prompt
|
||||
payload = {
|
||||
"model": model_config.name, "endpoint": model_config.endpoint, "prompt": gen_prompt,
|
||||
"kind": kind, "label": label or "", "group_id": str(group_id) if group_id else "",
|
||||
|
||||
Reference in New Issue
Block a user