import nest_asyncio
import asyncio
import time
import torch
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes
from transformers import GPT2LMHeadModel, GPT2Tokenizer
Инициализация модели и токенизатора
tokenizer = GPT2Tokenizer.from_pretrained(«gpt2»)
tokenizer.pad_token = tokenizer.eos_token # Устанавливаем pad_token
model = GPT2LMHeadModel.from_pretrained(«gpt2»)
Перенос модели на GPU, если доступно
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
async def start(update: Update, _context: ContextTypes.DEFAULT_TYPE) → None:
"""Обработчик команды /start."""
await update.message.reply_text(«Привет! Я нейросетевой бот. Напиши мне что-нибудь!»)
async def respond(update: Update, _context: ContextTypes.DEFAULT_TYPE) → None:
"""Генерация ответа на сообщение пользователя."""
try:
start_time = time.time()
# Токенизация и перенос на устройство
inputs = {k: v.to(device) for k, v in tokenizer(update.message.text, return_tensors='pt').items()}
outputs = model.generate(
input_ids=inputs['input_ids'],
max_length=200,
do_sample=True,
top_k=40,
top_p=0.9,
temperature=0.7,
pad_token_id=tokenizer.eos_token_id,
attention_mask=inputs['attention_mask']
)
reply = tokenizer.decode(outputs[0], skip_special_tokens=True)
await update.message.reply_text(reply)
print(f"Ответ сгенерирован за {time.time() — start_time:.2f} сек | Ввод: {update.message.text[:50]}...")
except Exception as e:
print(f"Ошибка: {e}")
await update.message.reply_text(«Произошла ошибка при обработке запроса»)
def run_bot():
"""Функция для запуска бота с обработкой event loop."""
try:
# Стандартный запуск
application = ApplicationBuilder().token(«7804714477:AAEM_d73DBM_mcPN1j1vRXWd4ymJ-44_3fY»).build()
application.add_handler(CommandHandler(«start», start))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, respond))
print(«Бот запущен...»)
application.run_polling()
except RuntimeError as e:
if «event loop is already running» in str(e):
# Обработка для сред, где цикл уже запущен (например, Jupyter, PyCharm)
import nest_asyncio
nest_asyncio.apply()
application = ApplicationBuilder().token(«mytoken»).build()
application.add_handler(CommandHandler(«start», start))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, respond))
print(«Бот запущен (nest_asyncio mode)...»)
application.run_polling()
else:
raise
if name == «main»:
run_bot()