"""AI PMO kernel intent resolve mixin.""" from __future__ import annotations from . import ai_pmo_kernel_common as _common for _name, _value in vars(_common).items(): if not _name.startswith("__"): globals()[_name] = _value class KernelIntentResolveMixin: async def _resolve_intent( self, *, message_text: str, session: Optional[ConversationSession], world_model: dict[str, Any], ) -> tuple[CanonicalIntent, str]: project_id = _safe_int(world_model.get("resolved_project_id")) raw_rule_intent = self.intent_resolver.resolve(text=message_text, project_id=project_id) rule_intent = self._apply_slot_guard(intent=raw_rule_intent, message_text=message_text) # 查询/噪音场景优先走规则意图,避免额外触发 LLM 分类链路导致不必要失败重试。 if rule_intent.name in {INTENT_QUERY, INTENT_IGNORE} and float(rule_intent.confidence or 0.0) >= 0.85: return rule_intent, "rule_preferred" if self._is_short_confirmation_message(message_text=message_text, session=session): if session is None: return rule_intent, "rule_fallback" return ( self._build_short_confirm_intent( message_text=message_text, session=session, world_model=world_model, ), "session_inherited", ) # 默认规则优先:仅在规则低置信/默认兜底时才触发 LLM。 if not self._intent_llm_enabled(): return rule_intent, "rule_fallback" if not self._should_invoke_llm_last_resort(rule_intent=rule_intent): return rule_intent, "rule_preferred" llm_intent = await self._resolve_intent_with_llm( message_text=message_text, session=session, world_model=world_model, rule_intent=rule_intent, ) if llm_intent is not None: if self._intent_arbitration_enabled(): selected_intent, source = self._arbitrate_intent( rule_intent=rule_intent, llm_intent=llm_intent, message_text=message_text, ) else: selected_intent, source = llm_intent, "llm" return self._apply_slot_guard(intent=selected_intent, message_text=message_text), source logger.info( "ai_pmo_intent_rule_fallback", tenant_id=self.tenant_id, reason="intent_llm_empty_or_failed_or_timeout", ) return rule_intent, "rule_fallback"