From 13b99f4dd3a8fbbc82150dd23fb927a8cdc9fcd5 Mon Sep 17 00:00:00 2001 From: pangkaicheng <924366729@qq.com> Date: Wed, 7 Jan 2026 12:19:50 +0800 Subject: [PATCH] FIX: Failed to find single item will not terminate whole process --- app/server/ChatbotAgent/core/prompt.py | 4 +- .../ChatbotAgent/core/stylist_agent_server.py | 51 +++++++----------- docs/Styling AI rules.xlsx | Bin 29736 -> 30699 bytes 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/app/server/ChatbotAgent/core/prompt.py b/app/server/ChatbotAgent/core/prompt.py index dce71f0..0d1dc2d 100644 --- a/app/server/ChatbotAgent/core/prompt.py +++ b/app/server/ChatbotAgent/core/prompt.py @@ -52,7 +52,8 @@ GENERAL_RULES = """## General Rule ### **Layering:** * Style at least 2-3 layers - +* Show white t-shirt, shirt hem under pull over cardigan and hoodies; Don't show hem in layerinmg except sweaters, cardigan and hoodies (if capable) +* Style hoodie under blazer/ bomber jacker, leathe jacket/ trechcoat to create a street style casual look (if capable) """ GENERAL_RULES_DICT = { @@ -78,6 +79,7 @@ GENERAL_RULES_DICT = { * Acceesory wear in a set of same metal colour (gold earrings with gold belt buckle) * Wear chokers or short necklaces with V-necks; wear long pendants with crew necks or turtlenecks. * Wear a belt in tuck-in outfits +* Style silk scarf for the neck; tie it on your bag handle, around your wrist, or use it as a belt for a pop of color. * No watches, No hats, No sunglasses""", } diff --git a/app/server/ChatbotAgent/core/stylist_agent_server.py b/app/server/ChatbotAgent/core/stylist_agent_server.py index fdccb18..199f8b0 100644 --- a/app/server/ChatbotAgent/core/stylist_agent_server.py +++ b/app/server/ChatbotAgent/core/stylist_agent_server.py @@ -182,33 +182,28 @@ class AsyncStylistAgent: gender=gender, n_results=1 ) - except ValueError as e: - print(f"检测到无效参数错误:{e}") - results = [] - if not results: - self.post_operation( - status="failed", - message=f"数据库中未找到符合 '{category}/{subcategory}' 和描述的单品。", - callback_url=self.callback_url, - img_path="", - ) - raise Exception(f"数据库中未找到符合 '{category}/{subcategory}' 和描述的单品。") + if not results: + print(f"No matching item found for description: {item_description}, category: {category}, subcategory: {subcategory}") + return None - # 3. 模拟 Agent 审核(实际应用中,你需要将图片发回给 Agent进行审核) - best_meta = results[0] # 第一个 batch 的第一个 metadata - item_id = best_meta['item_id'].replace("_img", "") - batch_source = best_meta['batch_source'] - return { - "item_id": item_id, # 从 metadata 字典中安全获取 - "category": best_meta['category'], - 'description': best_meta['description'], - "subcategory": best_meta['subcategory'], - "brand": best_meta['brand'], - "gpt_description": item_description, - "gpt_subcategory": subcategory, - "image_path": os.path.join(settings.DATA_ROOT, batch_source, 'image_data', f"{item_id}.jpg") - } + # 3. 模拟 Agent 审核(实际应用中,你需要将图片发回给 Agent进行审核) + best_meta = results[0] # 第一个 batch 的第一个 metadata + item_id = best_meta['item_id'].replace("_img", "") + batch_source = best_meta['batch_source'] + return { + "item_id": item_id, # 从 metadata 字典中安全获取 + "category": best_meta['category'], + 'description': best_meta['description'], + "subcategory": best_meta['subcategory'], + "brand": best_meta['brand'], + "gpt_description": item_description, + "gpt_subcategory": subcategory, + "image_path": os.path.join(settings.DATA_ROOT, batch_source, 'image_data', f"{item_id}.jpg") + } + except Exception as e: + print((f"Internal error in _get_next_item: {str(e)}")) + return None def _build_system_prompt(self, template: str, general_rule: str, request_summary: str = "", occasion: str = "", stylist_guide: str = "", current_category: str = "clothing", allowed_subcategories: list = [], max_len: int = 4) -> str: # 1. 材质偏好 (Occasion Material Map) @@ -426,12 +421,6 @@ class AsyncStylistAgent: allowed_subcategories = self._get_allowed_subcategories(occasions[0], category) # 4a. 检查类别是否有效 (重要步骤) if subcategory not in allowed_subcategories: - self.post_operation( - status="continue", - message=f"Invalid subcategory recommended by Agent: {subcategory} not in allowed subcategory list: {allowed_subcategories}. Ignore and continue", - callback_url=url, - img_path=merged_image_path, - ) failed_found_item_count += 1 continue diff --git a/docs/Styling AI rules.xlsx b/docs/Styling AI rules.xlsx index 64cedcc87dbd47f9b05b12f2356080ea73e8aa3b..d904c472f859bc95368e66ae279856236114988b 100644 GIT binary patch delta 13757 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