bot/bozenka/instances/telegram/handlers/queries/text_generation.py

270 lines
11 KiB
Python

import logging
from aiogram import types
from aiogram.fsm.context import FSMContext
from gpt4all import GPT4All
from bozenka.instances.telegram.utils.simpler.fsm_states import *
# Callbacks for GPT
from bozenka.instances.telegram.utils.callbacks_factory import (
GptCategory,
Gpt4FreeProvider,
Gpt4freeResult,
Gpt4FreeProviderPage,
Gpt4FreeModelPage, GptStop, GptBackMenu, Gpt4AllModel, Gpt4AllSelect
)
# Keyboards for messages
from bozenka.instances.telegram.utils.keyboards import (
gpt4free_models_keyboard,
gpt4free_providers_keyboard,
delete_keyboard, gpt_categories_keyboard, generate_gpt4all_page, gpt4all_model_menu
)
# Simpler utlilities
from bozenka.instances.telegram.utils.simpler import (
AnsweringGPT4Free,
AnsweringGpt4All,
)
async def inline_start_gpt(call: types.CallbackQuery, callback_data: GptBackMenu, state: FSMContext) -> None:
if call.from_user.id != callback_data.user_id:
return
await call.message.edit_text("Пожалуста, выберите сервис для ИИ.",
reply_markup=gpt_categories_keyboard(user_id=call.from_user.id))
async def inline_g4f_providers(call: types.CallbackQuery, callback_data: GptCategory, state: FSMContext) -> None:
"""
Query, what creating providers selecting menu.
:param state:
:param call:
:param callback_data:
:return:
"""
if call.from_user.id != callback_data.user_id:
return
logging.log(msg=f"Selected gpt4free category by user_id={call.from_user.id}",
level=logging.INFO)
await state.update_data(set_category=callback_data.category)
await state.set_state(AnsweringGPT4Free.set_provider)
await call.message.edit_text("Выберите пожалуйста одного из провайдеров 👨‍💻",
reply_markup=gpt4free_providers_keyboard(page=0, user_id=callback_data.user_id))
await call.answer("Выберите пожалуйста одного из провайдеров 👨‍💻")
async def inline_g4f_providers_back(call: types.CallbackQuery, callback_data: GptBackMenu, state: FSMContext) -> None:
"""
Query, what creating providers selecting menu.
:param state:
:param call:
:param callback_data:
:return:
"""
if call.from_user.id != callback_data.user_id:
return
logging.log(msg=f"Back to providers menu by user_id={call.from_user.id}",
level=logging.INFO)
await state.set_state(AnsweringGPT4Free.set_provider)
await call.message.edit_text("Выберите пожалуйста одного из провайдеров 👨‍💻",
reply_markup=gpt4free_providers_keyboard(page=0, user_id=callback_data.user_id))
await call.answer("Выберите пожалуйста одного из провайдеров 👨‍💻")
async def inline_g4f_models(call: types.CallbackQuery, callback_data: Gpt4FreeProvider, state: FSMContext) -> None:
"""
Query, what creating models selecting menu.
:param state:
:param call:
:param callback_data:
:return:
"""
if call.from_user.id != callback_data.user_id:
return
logging.log(msg=f"Selected gpt4free provider {callback_data.provider} by user_id={call.from_user.id}",
level=logging.INFO)
await state.update_data(set_provider=callback_data.provider)
await state.set_state(AnsweringGPT4Free.set_model)
await call.message.edit_text("Выберите пожалуйста модель ИИ 👾", reply_markup=gpt4free_models_keyboard(
user_id=callback_data.user_id,
provider=callback_data.provider,
page=0
))
await call.answer("Выберите пожалуйста модель ИИ 👾")
async def inline_g4f_ready(call: types.CallbackQuery, callback_data: Gpt4freeResult, state: FSMContext) -> None:
"""
Query, what says about getting ready to questions for ChatGPT from Gpt4Free.
:param state:
:param call:
:param callback_data:
:return:
"""
if call.from_user.id != callback_data.user_id:
return
logging.log(msg=f"Selected gpt4free model {callback_data.model} by user_id={call.from_user.id}",
level=logging.INFO)
await state.update_data(set_model=callback_data.model)
await state.set_state(AnsweringGPT4Free.ready_to_answer)
logging.log(msg=f"Loaded GPT answering status for user_id={call.from_user.id}",
level=logging.INFO)
await call.message.edit_text("Удача ✅\n"
"Вы теперь можете спокойно вести диалог 🤖\n"
f"Вы выбрали модель <b>{callback_data.model}</b>👾, от провайдера <b>{callback_data.provider}</b>👨‍💻\n"
"Чтобы прекратить общение, используйте /cancel ",
reply_markup=delete_keyboard(admin_id=callback_data.user_id))
await call.answer("Вы теперь можете спокойно вести диалог 🤖")
async def inline_g4a(call: types.CallbackQuery, callback_data: GptCategory, state: FSMContext) -> None:
"""
Query, what shows list for gpt4all models
:param call:
:param callback_data:
:param state:
:return:
"""
if callback_data.user_id != call.from_user.id:
return
await state.set_state(AnsweringGpt4All.set_model)
await call.message.edit_text("Выберите пожалуйста модель ИИ 👾",
reply_markup=generate_gpt4all_page(user_id=call.from_user.id))
async def inline_g4a_back(call: types.CallbackQuery, callback_data: GptCategory, state: FSMContext) -> None:
"""
Query, what shows list for gpt4all models back
:param call:
:param callback_data:
:param state:
:return:
"""
if callback_data.user_id != call.from_user.id:
return
await state.set_state(AnsweringGpt4All.set_model)
await call.message.edit_text("Выберите пожалуйста модель ИИ 👾",
reply_markup=generate_gpt4all_page(user_id=call.from_user.id))
async def inline_g4a_model(call: types.CallbackQuery, callback_data: Gpt4AllModel, state: FSMContext) -> None:
"""
Query, what show information about clicked gpt4all model from list
:param call:
:param callback_data:
:param state:
:return:
"""
if callback_data.user_id != call.from_user.id:
return
models = GPT4All.list_models()
name = models[callback_data.index]['name']
await call.message.edit_text(f"{name}\n"
f"Обученно на основе {models[callback_data.index]['parameters']} строк 👨‍💻",
reply_markup=gpt4all_model_menu(user_id=call.from_user.id, index=callback_data.index))
async def inline_g4a_select_model(call: types.CallbackQuery, callback_data: Gpt4AllSelect, state: FSMContext) -> None:
"""
Query, what says about getting ready for question for Gpt4All model
:param call:
:param callback_data:
:param state:
:return:
"""
if callback_data.user_id != call.from_user.id:
return
await state.update_data(set_model=callback_data.index)
await state.set_state(AnsweringGpt4All.ready_to_answer)
models = GPT4All.list_models()
await call.message.edit_text("Удача ✅\n"
"Вы теперь можете спокойно вести диалог 🤖\n"
f"Вы выбрали модель <b>{models[callback_data.index]['name']}</b>👾 от Gpt4All\n"
"Чтобы прекратить общение, используйте /cancel ",
reply_markup=delete_keyboard(admin_id=callback_data.user_id))
async def inline_next_g4f_providers(call: types.CallbackQuery, callback_data: Gpt4FreeProviderPage,
state: FSMContext) -> None:
"""
Query, what generates a next page of providers for user
:param call:
:param callback_data:
:param state:
:return:
"""
if call.from_user.id != callback_data.user_id:
return
logging.log(msg=f"Changed page to {str(callback_data.page + 1)} user_id={call.from_user.id}",
level=logging.INFO)
await call.message.edit_text(call.message.text,
reply_markup=gpt4free_providers_keyboard(user_id=callback_data.user_id,
page=callback_data.page))
await call.answer(f"Вы перелистнули на страницу {callback_data.page + 1}📄")
async def inline_next_g4f_models(call: types.CallbackQuery, callback_data: Gpt4FreeModelPage,
state: FSMContext) -> None:
"""
Query, what generates a next page of models for user.
:param call:
:param callback_data:
:param state:
:return:
"""
if call.from_user.id != callback_data.user_id:
return
logging.log(msg=f"Changed page to {str(callback_data.page + 1)} user_id={call.from_user.id}",
level=logging.INFO)
await call.message.edit_text(call.message.text,
reply_markup=gpt4free_models_keyboard(
user_id=callback_data.user_id,
provider=callback_data.provider,
page=callback_data.page
))
await call.answer(f"Вы перелистали на страницу {callback_data.page + 1}📄")
async def inline_return_pages(call: types.CallbackQuery) -> None:
"""
Query, made for helping purposes.
Shows current page.
:param call:
:return:
"""
logging.log(msg=f"Showed helping info for user_id={call.from_user.id}",
level=logging.INFO)
await call.answer("Здесь расположается текущая странница 📃")
async def inline_stop_dialog(call: types.CallbackQuery, callback_data: GptStop, state: FSMContext) -> None:
"""
Query, what stops dialog
:param call:
:param callback_data:
:param state:
"""
# Checking user_id of user
if callback_data.user_id != call.from_user.id:
return
# Clearing state
await state.clear()
# Answering something
await call.answer()
if state.get_state() == AnsweringGPT4Free.ready_to_answer or state.get_state() == AnsweringGpt4All.answering:
await call.message.edit_text(text=call.message.text + "\n\nДиалог остановлен ✅\n",
reply_markup=delete_keyboard(admin_id=call.from_user.id))