修改全能创作发现问题
This commit is contained in:
@@ -231,6 +231,19 @@ def refs_from_elicit_answers(team, fields, answers: dict) -> list[dict]:
|
||||
return refs
|
||||
|
||||
|
||||
def _person_meta_facts(metadata) -> list[str]:
|
||||
"""角色/模特库里填过的性别、年龄。聊天模型不一定看得到图,这些字必须进事实块。"""
|
||||
meta = metadata if isinstance(metadata, dict) else {}
|
||||
lines = []
|
||||
gender = str(meta.get("gender") or meta.get("sex") or "").strip()
|
||||
age = str(meta.get("age") or meta.get("age_range") or "").strip()
|
||||
if gender:
|
||||
lines.append(f"性别:{gender}")
|
||||
if age:
|
||||
lines.append(f"年龄:{age}")
|
||||
return lines
|
||||
|
||||
|
||||
def product_facts_text(product) -> str:
|
||||
"""商品事实块。全能创作没有 project,所以不能复用 script_agent._product_context()。
|
||||
这里只给**客观事实**(标题/品牌/品类/规格/卖点),不带人设和口吻 —— 那些由策略卡决定。"""
|
||||
@@ -270,6 +283,56 @@ def _asset_reference(asset, type_: str, label: str) -> dict | None:
|
||||
}
|
||||
|
||||
|
||||
|
||||
def _product_triview_asset(product):
|
||||
"""商品三视图是独立 Asset(metadata.view=three_view),不在商品图列表里。没有就返回 None。"""
|
||||
return (
|
||||
Asset.objects.filter(
|
||||
team_id=product.team_id,
|
||||
is_deleted=False,
|
||||
purged_at__isnull=True,
|
||||
metadata__product_id=str(product.id),
|
||||
metadata__view="three_view",
|
||||
)
|
||||
.order_by("-created_at")
|
||||
.first()
|
||||
)
|
||||
|
||||
|
||||
def _character_triview_asset(team, portrait_id):
|
||||
"""角色立绘配对的三视图:metadata.triview_of = 立绘 id。没有就返回 None。"""
|
||||
if not portrait_id:
|
||||
return None
|
||||
return (
|
||||
Asset.objects.filter(
|
||||
team=team,
|
||||
is_deleted=False,
|
||||
purged_at__isnull=True,
|
||||
category=Asset.Category.TRI_VIEW,
|
||||
metadata__triview_of=str(portrait_id),
|
||||
)
|
||||
.order_by("-created_at")
|
||||
.first()
|
||||
) or (
|
||||
Asset.objects.filter(
|
||||
team=team,
|
||||
is_deleted=False,
|
||||
purged_at__isnull=True,
|
||||
metadata__triview_of=str(portrait_id),
|
||||
)
|
||||
.order_by("-created_at")
|
||||
.first()
|
||||
)
|
||||
|
||||
|
||||
def _append_ref(resolved: ResolvedRefs, asset, type_: str, label: str) -> bool:
|
||||
entry = _asset_reference(asset, type_, label)
|
||||
if not entry:
|
||||
return False
|
||||
resolved.references.append(entry)
|
||||
return True
|
||||
|
||||
|
||||
def _product_reference(product) -> dict | None:
|
||||
"""商品参考图:**真实上传图优先,排除 AI 生成图** —— 拿生成图当真相再喂回模型会误差累积。
|
||||
一张真实图都没有才回落封面(可能是 AI 图,但好过纯文生图)。
|
||||
@@ -314,6 +377,9 @@ def resolve_refs(team, refs: list[dict]) -> ResolvedRefs:
|
||||
entry = _product_reference(product)
|
||||
if entry:
|
||||
resolved.references.append(entry)
|
||||
triview = _product_triview_asset(product)
|
||||
if triview is not None:
|
||||
_append_ref(resolved, triview, "product", f"{product.title}三视图")
|
||||
continue
|
||||
if type_ == "model":
|
||||
model = Model.objects.filter(
|
||||
@@ -322,15 +388,23 @@ def resolve_refs(team, refs: list[dict]) -> ResolvedRefs:
|
||||
if model is None:
|
||||
resolved.missing.append(ref)
|
||||
continue
|
||||
if (model.description or "").strip():
|
||||
resolved.facts.append(f"模特「{model.name}」:{model.description.strip()}")
|
||||
# 锁脸优先用三视图(正/侧/背都在一张 16:9 里,信息量最大),没有才回落形象图
|
||||
entry = _asset_reference(model.triview_asset, "model", model.name) or _asset_reference(
|
||||
model.portrait_asset, "model", model.name
|
||||
)
|
||||
if entry:
|
||||
resolved.references.append(entry)
|
||||
person_lines = []
|
||||
desc = (model.description or "").strip()
|
||||
meta_lines = _person_meta_facts(model.metadata)
|
||||
if desc:
|
||||
person_lines.append(f"模特「{model.name}」:{desc}")
|
||||
else:
|
||||
person_lines.append(f"模特「{model.name}」")
|
||||
person_lines.extend(meta_lines)
|
||||
if desc or meta_lines:
|
||||
resolved.facts.append("\n".join(person_lines))
|
||||
# 形象图和三视图都带上(有就带,没有不加、不报错)。三视图锁脸更稳。
|
||||
added = False
|
||||
if _append_ref(resolved, model.portrait_asset, "model", model.name):
|
||||
added = True
|
||||
if _append_ref(resolved, model.triview_asset, "model", f"{model.name}三视图"):
|
||||
added = True
|
||||
if not added:
|
||||
resolved.missing.append(ref)
|
||||
continue
|
||||
asset = Asset.objects.filter(
|
||||
@@ -339,12 +413,23 @@ def resolve_refs(team, refs: list[dict]) -> ResolvedRefs:
|
||||
if asset is None:
|
||||
resolved.missing.append(ref)
|
||||
continue
|
||||
if (asset.description or "").strip():
|
||||
resolved.facts.append(f"{TYPE_LABELS[type_]}「{asset.name}」:{asset.description.strip()}")
|
||||
entry = _asset_reference(asset, type_, asset.name)
|
||||
if entry:
|
||||
resolved.references.append(entry)
|
||||
else:
|
||||
desc = (asset.description or "").strip()
|
||||
meta_lines = _person_meta_facts(asset.metadata)
|
||||
label = TYPE_LABELS[type_]
|
||||
person_lines = [f"{label}「{asset.name}」:{desc}" if desc else f"{label}「{asset.name}」"]
|
||||
person_lines.extend(meta_lines)
|
||||
if desc or meta_lines:
|
||||
resolved.facts.append("\n".join(person_lines))
|
||||
added = _append_ref(resolved, asset, type_, asset.name)
|
||||
# 角色/模特立绘若有配对三视图,一并带给出片;没有就跳过,不要当成引用失败。
|
||||
if type_ in {"character", "model", "asset"}:
|
||||
portrait_id = asset.id
|
||||
# 用户 @ 的就是三视图本身时,不再反查。
|
||||
if asset.category != Asset.Category.TRI_VIEW:
|
||||
paired = _character_triview_asset(team, portrait_id)
|
||||
if paired is not None:
|
||||
_append_ref(resolved, paired, type_, f"{asset.name}三视图")
|
||||
if not added:
|
||||
resolved.missing.append(ref)
|
||||
|
||||
# 角色 → 场景 → 商品。同优先级内保持用户 @ 的先后。
|
||||
|
||||
Reference in New Issue
Block a user