diff --git a/server/src/app/services/steward_graph_planner.py b/server/src/app/services/steward_graph_planner.py index d5de644..5a39f8e 100644 --- a/server/src/app/services/steward_graph_planner.py +++ b/server/src/app/services/steward_graph_planner.py @@ -24,15 +24,6 @@ from app.services.steward_planner_fallback import StewardPlannerFallbackMixin # ---- 模块级辅助函数:gate_classify 的判断逻辑 ---- -def _matches_any_signal(message: str) -> bool: - """聚合 scene_registry 所有 signal_keywords,判断输入是否为业务相关。""" - from app.services.scenes import REGISTRY - compact = _compact_text(message) - if not compact: - return False - return any(kw in compact for kw in REGISTRY.all_signal_keywords()) - - def _compact_text(text: str) -> str: return re.sub(r"\s+", "", str(text or "")) @@ -154,13 +145,16 @@ class StewardGraphPlannerService(StewardPlannerFallbackMixin, StewardPlannerExtr 顺序: ① resume 门(用户说"再提交"+ state 有可恢复 flow → 上下文恢复) - ② off_topic 门(聚合 scene_registry signal_keywords) + ② off_topic 门(复用 _classify_irrelevant_input:legacy 94 词 + registry 信号词 + greeting/meaningless 细分) ③ 规则匹配门(按 priority 遍历 scene_registry,命中 CHOICE 规则的) ④ LLM 门(规则未命中,走 model function call) """ from app.services.scenes import REGISTRY - from app.services.scenes.gate_rules import GateRule, SceneRoute + from app.services.scenes.gate_rules import GateRule + request = state.get("request") + if request is None: + return {"gate_decision": "off_topic", "gate_scene_id": None} message = str(state.get("message") or "").strip() steward_state = state.get("steward_state") or {} @@ -169,8 +163,9 @@ class StewardGraphPlannerService(StewardPlannerFallbackMixin, StewardPlannerExtr if resume_scene: return {"gate_decision": "resume", "gate_scene_id": resume_scene} - # ② off_topic 门 - if not _matches_any_signal(message): + # ② off_topic 门:复用成熟的 _classify_irrelevant_input(含城市名/时间词/金额词等 94 词 + greeting/meaningless 细分) + scenario = self._classify_irrelevant_input(message, request) + if scenario is not None: return {"gate_decision": "off_topic", "gate_scene_id": None} # ③ 规则匹配门(按 priority 遍历,命中 CHOICE 规则的) @@ -186,8 +181,7 @@ class StewardGraphPlannerService(StewardPlannerFallbackMixin, StewardPlannerExtr # ④ LLM 门(规则未命中) # 走 model_intent 时,如 state 已有 active_flow 且 LLM 准备 fallback,可优先做 candidate_flow - request = state.get("request") - if request is not None and self._looks_like_ambiguous_travel_flow( + if self._looks_like_ambiguous_travel_flow( message, self._resolve_base_date_from_request(request), request ): return {"gate_decision": "ambiguous", "gate_scene_id": None}