from __future__ import annotations from collections.abc import Mapping from typing import Any PERSONA_CUSTOM_ERROR_MESSAGE_EXTRA_KEY = "persona_custom_error_message" def normalize_persona_custom_error_message(value: object) -> str | None: """Normalize persona custom error reply text.""" if not isinstance(value, str): return None message = value.strip() return message or None def extract_persona_custom_error_message_from_persona( persona: Mapping[str, Any] | None, ) -> str | None: """Extract normalized custom error reply text from persona mapping.""" if persona is None: return None return normalize_persona_custom_error_message(persona.get("custom_error_message")) def extract_persona_custom_error_message_from_event(event: Any) -> str | None: """Extract normalized custom error reply text from event extras.""" try: if event is None or not hasattr(event, "get_extra"): return None raw_message = event.get_extra(PERSONA_CUSTOM_ERROR_MESSAGE_EXTRA_KEY) return normalize_persona_custom_error_message(raw_message) except Exception: return None def set_persona_custom_error_message_on_event( event: Any, message: object ) -> str | None: """Normalize and store persona custom error reply text into event extras.""" normalized = normalize_persona_custom_error_message(message) try: if event is not None and hasattr(event, "set_extra"): event.set_extra(PERSONA_CUSTOM_ERROR_MESSAGE_EXTRA_KEY, normalized) except Exception: pass return normalized async def resolve_persona_custom_error_message( *, event: Any, persona_manager: Any, provider_settings: dict | None = None, conversation_persona_id: str | None = None, ) -> str | None: """Resolve normalized custom error reply text for the selected persona.""" ( _persona_id, persona, _force_applied_persona_id, _use_webchat_special_default, ) = await persona_manager.resolve_selected_persona( umo=event.unified_msg_origin, conversation_persona_id=conversation_persona_id, platform_name=event.get_platform_name(), provider_settings=provider_settings, ) return extract_persona_custom_error_message_from_persona(persona) async def resolve_event_conversation_persona_id( event: Any, conversation_manager: Any ) -> str | None: """Resolve current conversation persona_id from event and conversation manager.""" curr_cid = await conversation_manager.get_curr_conversation_id( event.unified_msg_origin ) if not curr_cid: return None conversation = await conversation_manager.get_conversation( event.unified_msg_origin, curr_cid ) if not conversation: return None return conversation.persona_id