andykras / gptbot

Telegram bot with Assistant AsyncOpenAI API client and aiogram lib
MIT License
12 stars 2 forks source link

Обработка ошибки Rate limit #34

Open svejooo opened 1 month ago

svejooo commented 1 month ago

Rate limit reached for gpt-4o in organization org-..... on tokens per min (TPM): Limit 30000, Used 19460, Requested 18151. Please try again in 15.221s. Visit https://platform.openai.com/account/rate-limits to learn more.

svejooo commented 1 month ago

коммент от gpt

Введите токен вашего Telegram бота

TELEGRAM_BOT_TOKEN = 'your_telegram_bot_token'

Создаем экземпляры бота и диспетчера

bot = Bot(token=TELEGRAM_BOT_TOKEN) dp = Dispatcher(bot) dp.middleware.setup(LoggingMiddleware())

Устанавливаем уровень логирования

logging.basicConfig(level=logging.INFO)

Очередь для контроля частоты запросов

request_queue = []

Функция для получения ответа от OpenAI

async def get_openai_response(prompt: str) -> str: global request_queue

# Обработка лимитов запросов
current_time = time.time()
request_queue = [timestamp for timestamp in request_queue if timestamp > current_time - 60]

if len(request_queue) >= 20:  # Предполагаем лимит в 20 запросов в минуту
    await asyncio.sleep(60 - (current_time - request_queue[0]))

request_queue.append(time.time())

try:
    response = openai.Completion.create(
        engine="text-davinci-003",  # или другой доступный движок OpenAI
        prompt=prompt,
        max_tokens=150
    )
    return response.choices[0].text.strip()
except openai.error.RateLimitError as e:
    logging.error(f"Rate limit error: {e}")
    return "Извините, я временно перегружен. Пожалуйста, попробуйте позже."

Обработчик команды /start

@dp.message_handler(commands=['start']) async def send_welcome(message: types.Message): await message.reply("Привет! Я ваш AI ассистент. Задайте мне любой вопрос.")

Обработчик текстовых сообщений

@dp.message_handler(Text) async def handle_message(message: types.Message): user_message = message.text bot_response = await get_openai_response(user_message) await message.answer(bot_response)

Запуск бота

if name == 'main': executor.start_polling(dp, skip_updates=True) Объяснение кода Импорт библиотек: Используются aiogram для Telegram API и openai для OpenAI API. Настройка логирования: Логирование позволяет отслеживать действия бота и выявлять возможные ошибки. Функция get_openai_response: Использует глобальную переменную request_queue для отслеживания времени запросов. Если количество запросов превышает лимит, функция делает паузу, чтобы избежать превышения лимита. Если превышен лимит запросов, возвращается сообщение об ошибке. Обработчик команды /start: Приветствует пользователя. Обработчик текстовых сообщений: Обрабатывает сообщения, отправленные пользователем, и отвечает с использованием OpenAI API. Запуск бота: Бот запускается и начинает обрабатывать сообщения. Этот скрипт помогает учитывать ограничения по частоте запросов, чтобы избежать превышения лимитов использования API.