PMFlow/backend/app/services/ai_pmo_kernel_mixins_intent...

67 lines
2.6 KiB
Python

"""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"