fix(product-suite): allow braces in business prompts

This commit is contained in:
chengma
2026-07-22 17:23:20 +08:00
parent a887186280
commit 2f05974a61
7 changed files with 108 additions and 19 deletions
+15
View File
@@ -294,6 +294,21 @@ class ProductSuiteTests(unittest.TestCase):
self.assertIn("商品ID:未绑定商品", rendered)
self.assertIn("参考图序号:2", rendered)
def test_business_prompt_braces_are_not_reparsed_as_template_variables(self):
template = prompts.load_default_product_suite_prompt()
business_prompt = "适合 {儿童} 使用,支持 {日常通勤} 场景"
rendered = product_suite.build_suite_prompt(
business_prompt,
product_suite.default_suite_settings(),
"白底图",
"51100639510",
template_text=template,
)
self.assertIn(business_prompt, rendered)
self.assertEqual([], product_suite.product_suite_prompt_errors(template))
if __name__ == "__main__":
unittest.main()
+64
View File
@@ -3501,6 +3501,70 @@ class ProductSuiteGuiTests(TempDirMixin, unittest.TestCase):
self.assert_removed(temp_dir)
def test_generation_accepts_business_prompt_with_braces(self):
with self.make_temp_dir() as temp_dir:
config = self._config(temp_dir)
project, _assets = self._create_project_with_assets(temp_dir, config, 1)
tab = ProductSuiteTab(config=config, db_path=config["db_path"])
self.addCleanup(tab.close)
state = tab._displayed_state
state.account_alias = "alias-a"
state.item_id = project.item_id
state.project_id = project.id
state.project_binding_state = project.binding_state
state.prompt = "适合 {儿童} 使用"
tab._load_state(state)
captured = []
tab._start_generation_price_confirmation = (
lambda _state, _assets, specs, *_args: captured.extend(specs) or True
)
self.assertTrue(tab.start_generation(state))
self.assertTrue(captured)
self.assertIn("适合 {儿童} 使用", captured[0]["prompt"])
self.assertEqual([], image_studio.list_jobs(project.id, path=config["db_path"]))
self.assert_removed(temp_dir)
def test_generation_renders_error_as_chinese_feedback_without_side_effects(self):
with self.make_temp_dir() as temp_dir:
config = self._config(temp_dir)
project, _assets = self._create_project_with_assets(temp_dir, config, 1)
tab = ProductSuiteTab(config=config, db_path=config["db_path"])
self.addCleanup(tab.close)
state = tab._displayed_state
state.account_alias = "alias-a"
state.item_id = project.item_id
state.project_id = project.id
state.project_binding_state = project.binding_state
state.prompt = "正常商品卖点"
tab._load_state(state)
messages = []
statuses = []
tab._message = lambda title, message, **_kwargs: messages.append((title, message))
tab._status = lambda message, level=None: statuses.append((message, level))
with mock.patch(
"app.gui.tabs.product_suite.product_suite.build_job_specs",
side_effect=product_suite.ProductSuitePromptError("内部渲染失败"),
), mock.patch.object(tab, "_start_generation_price_confirmation") as confirmation:
self.assertFalse(tab.start_generation(state))
self.assertEqual(
[("无法生成商品套图", "提示词渲染失败,请检查提示词设置中的变量格式。")],
messages,
)
self.assertEqual(
[("提示词渲染失败,请检查提示词设置中的变量格式。", "danger")],
statuses,
)
confirmation.assert_not_called()
self.assertIsNone(state.worker)
self.assertEqual([], image_studio.list_jobs(project.id, path=config["db_path"]))
self.assert_removed(temp_dir)
def test_generation_confirmation_uses_planned_specs_for_cached_image_price(self):
with self.make_temp_dir() as temp_dir:
config = self._config(temp_dir)