# -*- coding: utf-8 -*- """ Модуль классификации намерений пользователя. Определяет тип запроса: METRICS, SUMMARY, CONTRADICTION, SURGICAL, GREETING и др. АДАПТАЦИЯ: теперь функция принимает промпт как аргумент, а не использует глобальный. """ import logging import time from core.services.giga_client import GigaClient logger = logging.getLogger(__name__) # Список всех допустимых кодов намерений VALID_INTENTS = { "METRICS", "SUMMARY", "CONTRADICTION", "FACT", "PROCEDURE", "COMPARISON", "CALCULATION", "SURGICAL", "GREETING", "TEMPLATE_FILL", "SPELLCHECK" } # Кэш для классификации (in-memory) _intent_cache = {} _CACHE_TTL = 300 # 5 минут async def classify_intent( giga: GigaClient, query: str, prompt_text: str, bot_config, ) -> str: """ Классифицирует намерение пользователя на основе текста запроса. Аргументы: giga (GigaClient): клиент GigaChat query (str): исходный запрос пользователя prompt_text (str): содержимое промпта классификации (передаётся из оркестратора) bot_config (BotConfig): объект конфигурации бота Возвращает: str: один из кодов VALID_INTENTS или "GENERAL" """ if not prompt_text: logger.warning("Промпт классификации пуст, возвращаем GENERAL") return "GENERAL" # Проверка кэша cache_key = query.strip().lower() now = time.time() if cache_key in _intent_cache: cached_time, cached_result = _intent_cache[cache_key] if now - cached_time < _CACHE_TTL: logger.debug(f"Кэш классификации: '{cache_key}' -> {cached_result}") return cached_result else: del _intent_cache[cache_key] # Получаем температуру из конфига intent_cfg = getattr(bot_config, 'intent', {}) temperature = intent_cfg.get('temperature', 0.1) if isinstance(temperature, dict): temperature = 0.1 # Формируем полный промпт full_prompt = f"{prompt_text}\n\nВопрос: {query}" try: response = await giga.chat( history=[], query=full_prompt, system_prompt=None, file_id=None, temperature=temperature ) answer = response.strip().upper() if answer in VALID_INTENTS: logger.debug(f"Классификация успешна: {answer}") _intent_cache[cache_key] = (now, answer) return answer else: logger.debug(f"Неизвестный ответ классификатора: {answer}, возвращаем GENERAL") return "GENERAL" except Exception as e: logger.error(f"Ошибка классификации намерения: {e}", exc_info=True) return "GENERAL"