修改全能创作发现问题

This commit is contained in:
Azmat@qq.com
2026-09-03 19:00:59 +08:00
parent e7122b78fb
commit 3e904479d9
23 changed files with 1325 additions and 433 deletions
+99 -14
View File
@@ -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)
# 角色 → 场景 → 商品。同优先级内保持用户 @ 的先后。