feat: align product suite prompts with reference images

This commit is contained in:
chengma
2026-07-17 17:06:47 +08:00
parent 1fabd8afcf
commit f64dfffe40
9 changed files with 77 additions and 17 deletions
+6
View File
@@ -33,6 +33,7 @@ class ProductSuitePromptDialog(QDialog):
base_prompt,
settings,
item_id,
source_image_count=0,
parent=None,
):
super().__init__(parent)
@@ -44,6 +45,10 @@ class ProductSuitePromptDialog(QDialog):
self.base_prompt = str(base_prompt or "")
self.settings = product_suite.normalize_suite_settings(settings)
self.item_id = str(item_id or "")
self.reference_asset_count = product_suite.reference_asset_count(
self.settings,
source_image_count,
)
self._saved_text = ""
self._allow_close = False
@@ -193,6 +198,7 @@ class ProductSuitePromptDialog(QDialog):
category,
self.item_id or "未绑定商品",
source_index=1,
reference_asset_count=self.reference_asset_count,
)
def refresh_preview(self):
+5
View File
@@ -3138,15 +3138,20 @@ class ProductSuiteTab(QWidget):
settings = state.settings
base_prompt = state.prompt
item_id = state.item_id or "未绑定商品"
source_image_count = len(
[asset for asset in self._original_assets(state) if _asset_usable(asset)]
)
else:
settings = product_suite.default_suite_settings()
base_prompt = ""
item_id = "未绑定商品"
source_image_count = 0
dialog = ProductSuitePromptDialog(
prompt_path=self.product_suite_prompt_path,
base_prompt=base_prompt,
settings=settings,
item_id=item_id,
source_image_count=source_image_count,
parent=self,
)
self.prompt_settings_dialog = dialog
+38 -7
View File
@@ -253,25 +253,53 @@ def validate_product_suite_prompt(template_text):
return str(template_text)
def reference_asset_count(settings, source_image_count):
"""Return the effective reference-image count for a planned cmhub request."""
normalized = normalize_suite_settings(settings)
if normalized["per_image_primary"]:
return 0
try:
image_count = max(0, int(source_image_count or 0))
except (TypeError, ValueError):
image_count = 0
return min(7, max(0, image_count - 1))
def product_suite_reference_rule(settings, reference_asset_count=0):
normalized = normalize_suite_settings(settings)
try:
count = max(0, min(7, int(reference_asset_count or 0)))
except (TypeError, ValueError):
count = 0
if normalized["per_image_primary"] or count <= 0:
return (
"参考图规则:当前上传图片是本任务唯一主参考图;保持商品主体、款式、颜色和关键细节准确;"
"不编造用户与参考图均未提供的信息。"
)
return (
"参考图规则:第1张为主商品图,请保持其主体、款式、颜色和关键细节准确;"
"第2至%d张仅作为风格、构图、场景或排版参考,不得替换主商品;"
"不编造用户与参考图均未提供的信息。" % (count + 1)
)
def product_suite_prompt_context(
base_prompt,
settings,
category,
item_id,
source_index=1,
reference_asset_count=0,
):
normalized = normalize_suite_settings(settings)
item_text = str(item_id or "").strip()
if not item_text or item_text.startswith("draft_"):
item_text = "未绑定商品"
reference_index = max(1, int(source_index or 1))
if normalized["per_image_primary"]:
reference_rule = (
"参考图规则:当前上传图片是本任务唯一主参考图;保持商品主体、款式、颜色和关键细节准确;"
"不编造用户与参考图均未提供的信息。"
)
else:
reference_rule = "参考图规则:使用第一張上傳圖作為主商品圖,其餘圖片只作為參考。"
reference_rule = product_suite_reference_rule(
normalized,
reference_asset_count,
)
return {
"生成目标": category_description(category),
"套图名称": str(category or ""),
@@ -329,6 +357,7 @@ def build_suite_prompt(
category,
item_id,
source_index=1,
reference_asset_count=0,
*,
template_text,
):
@@ -338,6 +367,7 @@ def build_suite_prompt(
category,
item_id,
source_index=source_index,
reference_asset_count=reference_asset_count,
)
return render_product_suite_prompt(template_text, context)
@@ -376,6 +406,7 @@ def build_job_specs(source_assets, base_prompt, settings, item_id, *, template_t
category,
item_id,
source_index=source_index,
reference_asset_count=len(reference_asset_ids),
template_text=template_text,
),
}