ПОЧЕМУ-ТО ПРИ КОМАНДЕ /ai БОТ НЕ ЧЕГО НЕ ОТВЕЧАЕТ!!!


import asyncio
import telebot
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
from g4f.client import Client
import time
import requests
from yandex_tts_free import YandexFreeTTS
import os
import shutil
import logging

# Настройка логирования
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


# Установка event loop policy
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

client_dict = {}

# Доступные модели
MODELS = ["llama3-70b", "claude-3-haiku", "Yi-1.5-34B-Chat", "command-r+", "mixtral-8x7b"]

# Доступные голоса
VOICES = ["oksana", "jane", "alyss", "omazh"]

def create_model_selection_markup():
    markup = InlineKeyboardMarkup()
    for model in MODELS:
        markup.add(InlineKeyboardButton(model, callback_data=f"model_{model}"))
    return markup

def create_voice_selection_markup():
    markup = InlineKeyboardMarkup()
    for voice in VOICES:
        markup.add(InlineKeyboardButton(voice, callback_data=f"voice_{voice}"))
    return markup

@bot.message_handler(commands=['ai'])
def send_welcome(message):
    bot.reply_to(message, "Привет! 👋 Выбери модель ИИ, с которой хочешь общаться:", reply_markup=create_model_selection_markup())
    if message.chat.id not in client_dict:
        client_dict[message.chat.id] = {'client': Client(), 'model': None, 'voice': 'oksana'}

@bot.callback_query_handler(func=lambda call: True)
def handle_callback_query(call):
    data = call.data.split('_')
    if data[0] == 'model':
        client_dict[call.message.chat.id]['model'] = data[1]
        bot.send_message(call.message.chat.id, f"Модель {data[1]} выбрана! 🤖 Теперь выбери голос для синтеза речи:", reply_markup=create_voice_selection_markup())
    elif data[0] == 'voice':
        client_dict[call.message.chat.id]['voice'] = data[1]
        bot.send_message(call.message.chat.id, f"Голос {data[1]} выбран! 🎙 Отправь сообщение, чтобы получить ответ от ИИ.")
    else:
        bot.send_message(call.message.chat.id, "Неправильный ввод! Пожалуйста, начните с команды /start")

@bot.message_handler(func=lambda message: True)
def handle_message(message):
    if message.chat.id not in client_dict or client_dict[message.chat.id]['model'] is None:
        bot.reply_to(message, "Чтобы начать, используй команду /start и выбери модель ИИ. 🚀")
        return

    client_info = client_dict[message.chat.id]
    client = client_info['client']
    model = client_info['model']
    voice = client_info['voice']

    start_time = time.time()
    bot.send_message(message.chat.id, "Генерирую ответ на ваш запрос… 🤔")

    response = None
    MAX_RETRIES = 3
    retries = 0
    while retries < MAX_RETRIES:
        try:
            response = client.chat.completions.create(
                model=model,
                messages=[{"role": "user", "content": message.text}],
            )
            break
        except requests.exceptions.ConnectionError:
            retries += 1
            logger.error(f"Ошибка соединения. Попытка {retries}/{MAX_RETRIES} 📡")
            time.sleep(5)  # Ждем 5 секунд перед следующей попыткой
        except Exception as e:
            logger.exception(f"Произошла ошибка: {str(e)}")
            bot.reply_to(message, "Извините, произошла ошибка при обработке вашего запроса. Попробуйте еще раз. 😓")
            return

    if response is None:
        bot.reply_to(message, "Не удалось получить ответ от модели после нескольких попыток. Пожалуйста, попробуйте позже. 😓")
        return

    end_time = time.time()
    execution_time = end_time - start_time
    output_text = response.choices[0].message.content

    # Оповещение пользователя о времени выполнения и модели
    bot.send_message(message.chat.id, f"Запрос занял {execution_time:.2f} секунд. Ответ предоставлен моделью {model}. ⏱")

    bot.reply_to(message, output_text)
# Генерация речи с выбранным голосом
    output_path = f'output{message.chat.id}'
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    audio_file = os.path.join(output_path, 'output.mp3')

    tts = YandexFreeTTS()
    try:
        tts.generate_speech_ya(output_path, 'output.mp3', output_text, voice)

        # Отправка аудиофайла пользователю
        with open(audio_file, 'rb') as audio:
            bot.send_audio(message.chat.id, audio)

        # Удаление аудиофайла и папки после отправки
        shutil.rmtree(output_path)
    except Exception as e:
        logger.exception(f"Ошибка при генерации речи: {str(e)}")
        bot.reply_to(message, "Произошла ошибка при синтезе речи. Попробуйте еще раз. 😓")