test commit
This commit is contained in:
commit
726db59025
161
.gitignore
vendored
Normal file
161
.gitignore
vendored
Normal file
@ -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/
|
20
app.py
Normal file
20
app.py
Normal file
@ -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())
|
4
bot/handlers/admin/admin_handlers.py
Normal file
4
bot/handlers/admin/admin_handlers.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from aiogram import Router
|
||||||
|
|
||||||
|
|
||||||
|
admin = Router()
|
119
bot/handlers/user/model_processing.py
Normal file
119
bot/handlers/user/model_processing.py
Normal file
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
72
bot/handlers/user/page_processing.py
Normal file
72
bot/handlers/user/page_processing.py
Normal file
@ -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)
|
25
bot/handlers/user/user_handlers.py
Normal file
25
bot/handlers/user/user_handlers.py
Normal file
@ -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()
|
62
bot/kbs/inline.py
Normal file
62
bot/kbs/inline.py
Normal file
@ -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()
|
||||||
|
|
7
config.py
Normal file
7
config.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
bot_token = os.getenv("BOT_TOKEN")
|
||||||
|
admins = [367757357]
|
0
requirements.txt
Normal file
0
requirements.txt
Normal file
Loading…
Reference in New Issue
Block a user