commit 726db590252abb3b88dec9a14c92acc5ca986abe Author: 4hellboy4 Date: Sat Oct 5 17:35:26 2024 +0300 test commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e5c29bf --- /dev/null +++ b/.gitignore @@ -0,0 +1,161 @@ +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ diff --git a/app.py b/app.py new file mode 100644 index 0000000..9373215 --- /dev/null +++ b/app.py @@ -0,0 +1,20 @@ +import asyncio +from aiogram import Dispatcher, Bot +from aiogram.client.default import DefaultBotProperties +from config import * +from bot.handlers.user.user_handlers import user +from bot.handlers.admin.admin_handlers import admin + +dp = Dispatcher() +dp.include_router(user) +dp.include_router(admin) + +bot = Bot(token=bot_token, default=DefaultBotProperties(parse_mode='HTML')) + + +async def main(): + await dp.start_polling(bot) + + +if __name__ == '__main__': + asyncio.run(main()) \ No newline at end of file diff --git a/bot/handlers/admin/admin_handlers.py b/bot/handlers/admin/admin_handlers.py new file mode 100644 index 0000000..7ea1453 --- /dev/null +++ b/bot/handlers/admin/admin_handlers.py @@ -0,0 +1,4 @@ +from aiogram import Router + + +admin = Router() \ No newline at end of file diff --git a/bot/handlers/user/model_processing.py b/bot/handlers/user/model_processing.py new file mode 100644 index 0000000..9626c71 --- /dev/null +++ b/bot/handlers/user/model_processing.py @@ -0,0 +1,119 @@ +from aiogram.filters.callback_data import CallbackData +from aiogram.types import InlineKeyboardButton +from aiogram.utils.keyboard import InlineKeyboardBuilder + + +models_description = { + "1o": "Это базовая модель ИИ, которая \"умеет думать\". Она хороша для выполнения повседневных задач, \n\ + таких как анализ данных, обработка текста и создание отчетов. Она подходит для малого и среднего бизнеса, \n\ + где важно автоматизировать рутинные задачи и получать быстрые результаты.\n\n\ + Выберите тариф к модели 1о.", + "1o mini": "Уменьшенная версия 1о, которая также \"умеет думать\". Эта модель менее мощная, \n\ + но зато работает быстрее на устройствах с ограниченными ресурсами, таких как смартфоны или небольшие компьютеры. \n\ + Прекрасно подойдет для мобильных приложений и стартапов, где ресурсы ограничены, но нужны умные решения.\n\n\ + Выберите тариф к модели 1о mini.", + "4o": "Это мощная модель ИИ, предназначенная для сложных и объемных задач. Она хорошо справляется \n\ + с глубоким анализом больших данных, сложными прогнозами и инновационными бизнес-проектами. \n\ + Идеальна для крупных компаний, требующих высокую производительность для динамичного принятия решений и стратегического анализа.\n\n\ + Выберите тариф к модели 4о.", + "4o mini": "Уменьшенная версия модели 4о. Она сохраняет высокую мощность при меньшем использовании ресурсов. \n\ + Подходит для сложных бизнес-задач в условиях ограниченных ресурсов, таких как аналитика в режиме реального времени \n\ + на портативных и мобильных устройствах. Отличный выбор для бизнеса, который хочет получить максимум от своих технологий \n\ + без больших затрат на оборудование.\n\n\ + Выберите тариф к модели 4о." +} + +model_prices = { + "1o" : { + "base": { + "tokens": "60", + "amount": "2000" + }, + "advanced": { + "tokens": "128", + "amount": "3500" + }, + "pro": { + "tokens": "300", + "amount": "7500" + } + }, + "1o mini": { + "base": { + "tokens": "50", + "amount": "900" + }, + "advanced": { + "tokens": "100", + "amount": "1500" + }, + "pro": { + "tokens": "270", + "amount": "2700" + } + }, + "4o": { + "base": { + "tokens": "100", + "amount": "1500" + }, + "advanced": { + "tokens": "150", + "amount": "2000" + }, + "pro": { + "tokens": "303", + "amount": "3750" + } + }, + "4o mini": { + "base": { + "tokens": "800", + "amount": "400" + }, + "advanced": { + "tokens": "1650", + "amount": "650" + }, + "pro": { + "tokens": "3300", + "amount": "1250" + } + } +} + +name_of_model = { + "base" : "Базовый", + "advanced": "Продвинутый", + "pro" : "Профессиональный" +} + +class PayCallBack(CallbackData, prefix="pay"): + name_of_model: str + option_of_model: str + tokens: str + amount: str + +def get_model_page(*, name_of_model: str, sizes: tuple[int] = (1,)): + text: str = models_description[name_of_model] + + temp_kbds: InlineKeyboardBuilder = InlineKeyboardBuilder() + + for option_name, item in models_description[name_of_model].items(): + option_name_rus, tokens, amount = name_of_model[option_name], item["tokens"], item["amount"] + temp_text = f"{name_of_model[option_name]} \n {tokens} запросов за {amount} RUB" + temp_kbds.add(InlineKeyboardButton( + text=temp_text, + callback_data=PayCallBack( + name_of_model=name_of_model, + option_of_model=option_name_rus, + tokens=tokens, + amount=amount + ).pack() + )) + + return text, temp_kbds.adjust(*sizes).as_markup() + + + + diff --git a/bot/handlers/user/page_processing.py b/bot/handlers/user/page_processing.py new file mode 100644 index 0000000..c7bcf8b --- /dev/null +++ b/bot/handlers/user/page_processing.py @@ -0,0 +1,72 @@ +from aiogram.types import InlineKeyboardMarkup + +from bot.kbs.inline import get_user_main_btns, get_user_lessons_page, get_user_tarif_page, \ + get_user_model_description_page + +page_info = { + 'main' : "Привет! Это Мудрый ИИ. Этот бот создан для того, чтобы вы легко и просто использовали искусственный интеллект, \n\ + и вы можете применить его абсолютно в любых целях. Этот бот содержит в себе 4 модели ИИ:\n\n\ + 1о - Супермодель, первый уровень AGI. Она умеет размышлять и выдавать осмысленные и глубокие ответы.\n\n\ + 1о mini - Супермодель, упрощенная версия 1о, но также умеет думать и помогать в сложных задачах. \n\ + В плане цены она доступнее 1о.\n\n\ + 4о - Проверенная практикой модель, которая быстро справляется с любой задачей. \n\ + Её сила в скорости и качестве результатов, подходит для длительных, средних и сложных задач.\n\n\ + 4о mini - Лайт версия 4о. Вы практически не ограничены в запросах, эта модель эффективна, когда вы только ищете решение. \n\ + Вы сможете быстро перебирать подходящие варианты, а когда найдете, то сможете спокойно пользоваться 4о, 1о или 1о m.", + "lessons": "Список доступных уроков:\n\n\ + Чем полезен ИИ-Робот в Telegram\n\ + В этом уроке вы узнаете про возможности ИИ-Ассистента\n\n\ + Первые шаги с ИИ в Telegram Боте\n\ + Выходим в интернет с помощью ИИ\n\n\ + Загружаем в ИИ-бота информацией о вас\n\ + Первые шаги в обучении ИИ\n\n\ + Решение повторяющихся задач\n\ + В этом уроке мы быстро создаем чек-листы, регламенты, правила\n\n\ + Основные методы по обучению ИИ-Бота\n\ + Вы научитесь правильно обучать вашего нейросотрудника\n\n\ + Исследование рынка с помощью ИИ\n\ + В этом уроке вы узнаете как через ИИ-Ассистента исследовать рынок и находить новые возможности\n\n\ + Сегментирование целевой аудитории\n\ + Сможете создавать портреты ЦА с помощью ИИ-Ассистента\n\n\ + Основы технического промта\n\ + В этом уроке вы узнаете основу создания промт\n\n\ + Эти уроки раскрывают потенциал по управлению ИИ-ботом, однако некоторые функции из уроков ваш бот не сможет сделать,\n\ + например, поставить встречи в гугл календаре или работать с файлами.\n\ + Но вы точно научитесь использовать этого на 100%\n\n\ + Ссылка на бесплатное обучение - https://neirovoid.getcourse.ru/Ai_QUB" +} + + +async def main_page(page: int, name: str): + kbds: InlineKeyboardMarkup = get_user_main_btns(page=page) + text: str = page_info[name] + + return text, kbds + +async def lessons_page(page: int, name: str): + kbds: InlineKeyboardMarkup = get_user_lessons_page(page=page) + text: str = page_info[name] + + return text, kbds + +async def tarif_page(page: int, name: str): + kbds: InlineKeyboardMarkup = get_user_tarif_page(page=page) + text: str = page_info[name] + + return text, kbds + +async def models_description_page(page: int, name_of_model: str): + text, kbds = get_user_model_description_page(page=page, name_of_model=name_of_model) + + return text, kbds + +async def get_page_content(page: int, name: str, name_of_model: str = ""): + + if page == 0: + return await main_page(page, name) + if page == 1: + return await lessons_page(page, name) + if page == 2: + return await tarif_page(page, name) + if 4 <= page <= 7: + return models_description_page(page, name_of_model) \ No newline at end of file diff --git a/bot/handlers/user/user_handlers.py b/bot/handlers/user/user_handlers.py new file mode 100644 index 0000000..240d1c5 --- /dev/null +++ b/bot/handlers/user/user_handlers.py @@ -0,0 +1,25 @@ +from aiogram import Router, types +from aiogram.filters import CommandStart + +from bot.handlers.user.page_processing import get_page_content +from bot.kbs.inline import PageCallBack + +user = Router() + +@user.message(CommandStart()) +async def start(message: types.Message): + text, reply_markup = await get_page_content(page=0,name="main") + + await message.answer(text, reply_markup=reply_markup) + + +@user.callback_query(PageCallBack.filter()) +async def user_pages(callback: types.CallbackQuery, callback_data: PageCallBack): + + text, reply_markup = await get_page_content( + page=callback_data.page, + name=callback_data.page_name, + ) + + await callback.message.edit_text(text, reply_markup=reply_markup) + await callback.answer() diff --git a/bot/kbs/inline.py b/bot/kbs/inline.py new file mode 100644 index 0000000..25efe30 --- /dev/null +++ b/bot/kbs/inline.py @@ -0,0 +1,62 @@ +from aiogram.filters.callback_data import CallbackData +from aiogram.types import InlineKeyboardButton +from aiogram.utils.keyboard import InlineKeyboardBuilder + +from bot.handlers.user.model_processing import get_model_page + + +class PageCallBack(CallbackData, prefix="page"): + page: int + page_name: str + name_of_model: str + +def get_user_main_btns(*, page: int): # page 0 + btns = [ + InlineKeyboardButton(text="Бесплатные уроки", callback_data=PageCallBack(page=page+1, page_name="lessons").pack()),#1 + InlineKeyboardButton(text="Выбрать тариф", callback_data=PageCallBack(page=page+2, page_name="tarif").pack()),#2 + InlineKeyboardButton(text="Больше о моделях", callback_data=PageCallBack(page=page+3, page_name="modelsDescription").pack()),#3 + ] + + return get_kb_buttons(btns=btns) + + +def get_user_lessons_page(*, page): # page 1 + btns = [ + InlineKeyboardButton(text="Выбрать модель", callback_data=PageCallBack(page=page + 1, page_name="tarif").pack()), # 2 + InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=page - 1, page_name="main").pack()), # 2 + ] + + return get_kb_buttons(btns=btns) + +def get_user_tarif_page(*, page): # page 2 + btns = [ + InlineKeyboardButton(text="1o", callback_data=PageCallBack(page=4, name_of_model='1o').pack()), # 4 + InlineKeyboardButton(text="1o mini", callback_data=PageCallBack(page=5, name_of_model='1o mini').pack()), # 5 + InlineKeyboardButton(text="4o", callback_data=PageCallBack(page=6, name_of_model='4o').pack()), # 6 + InlineKeyboardButton(text="4o mini", callback_data=PageCallBack(page=7, name_of_model='4o mini').pack()), # 7 + InlineKeyboardButton(text="⬅️Назад", callback_data=PageCallBack(page=page - 1, page_name="main").pack()), # 1 + ] + + return get_kb_buttons(btns=btns) + +def get_user_model_description_page(*, page: int, name_of_model: str): + text, kbd = get_model_page(name_of_model=name_of_model) + + return text, kbd + +def get_kb_buttons(*, btns: list[InlineKeyboardButton], sizes: tuple[int] = (1,)): + kb_temp = InlineKeyboardBuilder() + + for btn in btns: + kb_temp = kb_temp.add(btn) + + return kb_temp.adjust(*sizes).as_markup() + +def get_callback_btns(*, btns: dict[str, str]): + keyboard = InlineKeyboardBuilder + + for text, data in btns.items(): + keyboard.add(InlineKeyboardButton(text=text, callback_data=data).pack()) + + return keyboard.as_markup() + diff --git a/config.py b/config.py new file mode 100644 index 0000000..abce423 --- /dev/null +++ b/config.py @@ -0,0 +1,7 @@ +import os +from dotenv import load_dotenv + +load_dotenv() + +bot_token = os.getenv("BOT_TOKEN") +admins = [367757357] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29