fix: 优化裤装上身图裤长与景别
This commit is contained in:
@@ -1039,6 +1039,7 @@ def _build_model_tryon_prompt_v2(
|
||||
from apps.ai.tryon_prompt import (
|
||||
ClassificationResult,
|
||||
ProductContext,
|
||||
TrouserFacts,
|
||||
build_tryon_prompt_plan,
|
||||
classify_product_details,
|
||||
default_ratio_for_kind,
|
||||
@@ -1059,6 +1060,7 @@ def _build_model_tryon_prompt_v2(
|
||||
classification = ClassificationResult.from_payload(payload.get("tryon_classification"))
|
||||
if classification is None:
|
||||
classification = classify_product_details(context, str(payload.get("prompt") or ""))
|
||||
trouser_facts = TrouserFacts.from_payload(payload.get("tryon_trouser_facts"))
|
||||
|
||||
requested_ratio = str(payload.get("ratio") or "").strip()
|
||||
resolved_ratio = requested_ratio or default_ratio_for_kind(classification.kind)
|
||||
@@ -1071,10 +1073,11 @@ def _build_model_tryon_prompt_v2(
|
||||
has_model_portrait=has_model,
|
||||
has_model_triview=False,
|
||||
classification=classification,
|
||||
trouser_facts=trouser_facts,
|
||||
)
|
||||
prompt = plan.prompts[index]
|
||||
trace = {
|
||||
"version": "v2.5",
|
||||
"version": "v2.6",
|
||||
"applied": True,
|
||||
"rollout_source": rollout_source,
|
||||
"effective_prompt": prompt,
|
||||
@@ -1088,6 +1091,7 @@ def _build_model_tryon_prompt_v2(
|
||||
"model_portrait_number": plan.references.model_portrait_number,
|
||||
"model_triview_number": plan.references.model_triview_number,
|
||||
},
|
||||
"trouser_facts": plan.trouser_facts.as_payload() if plan.trouser_facts is not None else None,
|
||||
}
|
||||
return prompt, trace, resolved_ratio
|
||||
|
||||
@@ -2796,8 +2800,15 @@ def enqueue_standalone_images(*, team, user, prompt: str, mode: str = "image", c
|
||||
# Step 2.1:只为“模特上身图 + 商品”记录一次确定性分类快照。这里不读取图片、不调用模型;
|
||||
# Step 3 的 Worker 根据 MODEL_TRYON_PROMPT_V2_ENABLED 决定使用 V2 或旧提示词。
|
||||
tryon_classification: dict[str, str | None] | None = None
|
||||
tryon_trouser_facts: dict[str, str | None] | None = None
|
||||
if mode == "model" and product_id:
|
||||
from apps.ai.tryon_prompt import ClassificationResult, ProductContext, ProductKind, classify_product_details
|
||||
from apps.ai.tryon_prompt import (
|
||||
ClassificationResult,
|
||||
ProductContext,
|
||||
ProductKind,
|
||||
classify_product_details,
|
||||
extract_trouser_facts,
|
||||
)
|
||||
from apps.products.models import Product
|
||||
|
||||
product_for_classification = Product.objects.filter(id=product_id, team=team).only(
|
||||
@@ -2811,14 +2822,26 @@ def enqueue_standalone_images(*, team, user, prompt: str, mode: str = "image", c
|
||||
"product_not_found",
|
||||
)
|
||||
else:
|
||||
classification = classify_product_details(
|
||||
ProductContext.create(
|
||||
title=product_for_classification.title,
|
||||
category=product_for_classification.category,
|
||||
description=product_for_classification.description,
|
||||
classification_context = ProductContext.create(
|
||||
title=product_for_classification.title,
|
||||
category=product_for_classification.category,
|
||||
description=product_for_classification.description,
|
||||
)
|
||||
product_context = ProductContext.create(
|
||||
title=classification_context.title,
|
||||
category=classification_context.category,
|
||||
description=classification_context.description,
|
||||
selling_points=tuple(
|
||||
product_for_classification.selling_points.values_list("title", flat=True)[:8]
|
||||
),
|
||||
)
|
||||
classification = classify_product_details(
|
||||
classification_context,
|
||||
prompt,
|
||||
)
|
||||
trouser_facts = extract_trouser_facts(product_context, classification.kind, prompt)
|
||||
if trouser_facts is not None:
|
||||
tryon_trouser_facts = trouser_facts.as_payload()
|
||||
tryon_classification = classification.as_payload()
|
||||
|
||||
tasks: list[AITask] = []
|
||||
@@ -2827,6 +2850,8 @@ def enqueue_standalone_images(*, team, user, prompt: str, mode: str = "image", c
|
||||
request_payload = {"model": model_config.name, "endpoint": model_config.endpoint, "prompt": prompt, "mode": mode, "index": index, "product_id": str(product_id) if product_id else None, "reference_product": bool(reference_product), "model_id": str(model_id) if model_id else None, "model_entity_id": str(model_entity_id) if model_entity_id else None, "batch_id": batch_id, "ratio": str(ratio) if ratio else None, "reference_image_ids": ref_ids, "platform_id": platform_key or None, "platform_name": platform_name or None}
|
||||
if tryon_classification is not None:
|
||||
request_payload["tryon_classification"] = dict(tryon_classification)
|
||||
if tryon_trouser_facts is not None:
|
||||
request_payload["tryon_trouser_facts"] = dict(tryon_trouser_facts)
|
||||
request_payload["tryon_batch_count"] = count
|
||||
# 仅供内部 A/B 工具使用;GenerateImageView 不接收这两个参数,用户请求无法绕过全局开关。
|
||||
if tryon_prompt_v2_override:
|
||||
@@ -2946,7 +2971,7 @@ def run_standalone_image_task(*, task_id: str) -> None:
|
||||
)
|
||||
except Exception as exc: # noqa: BLE001 — 规划器异常时安全回落旧提示词,不让已预扣任务悬空
|
||||
tryon_prompt_trace = {
|
||||
"version": "v2.5",
|
||||
"version": "v2.6",
|
||||
"applied": False,
|
||||
"rollout_source": tryon_rollout_source,
|
||||
"effective_prompt": legacy_prompt,
|
||||
@@ -2985,7 +3010,7 @@ def run_standalone_image_task(*, task_id: str) -> None:
|
||||
elif mode == "model" and product_id and tryon_rollout_source is not None:
|
||||
# 没有真实商品参考图时维持原纯文生图行为,但明确留下未应用原因,不能伪装成 V2 已生效。
|
||||
tryon_prompt_trace = {
|
||||
"version": "v2.5",
|
||||
"version": "v2.6",
|
||||
"applied": False,
|
||||
"rollout_source": tryon_rollout_source,
|
||||
"effective_prompt": prompt,
|
||||
|
||||
Reference in New Issue
Block a user