"""提取/评估提示词建材化: 字段与占位符静态断言(Task 4)。""" from app.services.ai_service import EVALUATOR_PROMPT, EXTRACTOR_PROMPT # 建材字段清单(与 system.md "关注的信息"节口径一致) PIPE_FIELDS = ( "意向品类", # HDPE给水管/PVC排水管/PPR… "规格要求", # 自由文本保留客户原话 "标准要求", # ISO4427/ASTM/EN/SCH 单列 "采购数量", "用途", # 给水/燃气/排污/灌溉… "项目类型", "目标国家", # email_service.send_lead_email 按此键取国家 "预算提及", "联系方式", ) # 汽车项目遗留字段——建材化后不得残留 AUTO_WORDS = ("车型", "意向品牌", "车况要求", "年份要求", "运输方式", "购车", "试驾") def test_extractor_has_pipe_fields(): for field in PIPE_FIELDS: assert field in EXTRACTOR_PROMPT, field def test_extractor_no_auto_fields(): for word in AUTO_WORDS: assert word not in EXTRACTOR_PROMPT, word def test_extractor_spec_is_free_text(): # 规格要求 = 自由文本保留客户原话,不拆分不过度结构化 assert "原话" in EXTRACTOR_PROMPT assert "不拆分" in EXTRACTOR_PROMPT def test_extractor_standard_only_when_mentioned(): # 标准要求客户提到才记,不猜测 assert "客户提到才记" in EXTRACTOR_PROMPT def test_extractor_placeholders_and_contact_contract_intact(): # 占位符(ai_service.replace 依赖)与联系方式四层合并的 extractor 层契约 assert "$existing_info" in EXTRACTOR_PROMPT assert "$messages" in EXTRACTOR_PROMPT assert '{"手机": "xxx", "WhatsApp": "xxx", "邮箱": "xxx", "微信": "xxx"}' in EXTRACTOR_PROMPT assert "整条消息只有号码" in EXTRACTOR_PROMPT def test_evaluator_keeps_three_levels_and_placeholders(): for level in ("interested", "not_interested", "pending"): assert level in EVALUATOR_PROMPT, level assert "$profile" in EVALUATOR_PROMPT assert "$recent_messages" in EVALUATOR_PROMPT # _normalize_evaluation 消费的输出字段 for key in ("intent_level", "reasoning", "contact_info", "info_sufficient"): assert key in EVALUATOR_PROMPT, key def test_evaluator_no_auto_fields(): for word in AUTO_WORDS: assert word not in EVALUATOR_PROMPT, word def test_evaluator_pipe_procurement_examples(): # 管道采购语义示例: 品类+规格+数量=interested; 泛泛浏览=pending; 无采购计划=not_interested assert "采购需求" in EVALUATOR_PROMPT assert "随便看看" in EVALUATOR_PROMPT # not_interested: 明确不买 assert "泛泛" in EVALUATOR_PROMPT # pending: 仅泛泛浏览 # ---- Task 5/6b: 质量审查移交的提示词微修 ---- def test_extractor_field_values_chinese_summary(): # 字段值统一中文概括;唯一例外是规格要求原样保留 assert "中文概括" in EXTRACTOR_PROMPT assert "绝不翻译" in EXTRACTOR_PROMPT def test_extractor_standard_example_with_number_kept(): # 标准要求示例 ASTM D3035(具体编号)+ 编号原样保留 assert "ASTM D3035" in EXTRACTOR_PROMPT assert "编号原样保留" in EXTRACTOR_PROMPT def test_evaluator_positive_signals_are_bonus_not_required(): # 询价/索联系方式移出 interested 必要条件,单独"积极信号"小节 assert "积极信号(加分项,非必要条件)" in EVALUATOR_PROMPT assert "非必要条件" in EVALUATOR_PROMPT def test_evaluator_interested_example_mentions_rounds(): # interested 示例补"聊了几轮后"(轮次语境) assert "聊了几轮后" in EVALUATOR_PROMPT