Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

QuotaRadar: автоматический мониторинг сбросов лимитов в Codex и Claude Code через Telegram-бота с ИИ-аналитикой

Разработчики Codex и Claude Code теряют часы из-за внезапных сбросов лимитов. QuotaRadar мониторит X через API, фильтрует твиты с помощью YandexGPT и мгновенно

Коротко

Что будет в материале

  1. 01

    Зачем мониторить сбросы лимитов и как это автоматизировать

  2. 02

    Архитектура системы: Django, Celery, Redis и PostgreSQL

  3. 03

    Подключение к X API v2: поиск твитов о лимитах

  4. 04

    ИИ-аналитика с YandexGPT: от твита к уведомлению

Зачем мониторить сбросы лимитов и как это автоматизировать

Разработчики, плотно работающие с Codex и Claude Code, знают: лимиты на количество запросов сбрасываются не по расписанию. Официальные анонсы часто запаздывают, а информация в X появляется раньше. Пропуск такого события означает простой, когда модель внезапно отказывается обрабатывать запросы в разгар рабочей сессии. Ручной мониторинг ленты неэффективен - нужно постоянно отвлекаться, проверять несколько аккаунтов и фильтровать шум.

Решение - QuotaRadar, Telegram-бот, который сам находит твиты о сбросах, повышениях и продлениях лимитов, анализирует их через YandexGPT и присылает короткое уведомление на русском языке. Вы получаете информацию в момент появления, без лишнего шума и необходимости следить за десятками источников. Система построена на Django, Celery, Redis и PostgreSQL, использует X API v2 для поиска и YandexGPT для интеллектуальной фильтрации.

Схема работы проста: периодическая задача в Celery отправляет запрос к X API v2 с поисковыми фильтрами, получает свежие твиты, передаёт их YandexGPT для классификации. Если твит действительно сообщает об изменении лимитов, бот генерирует уведомление и отправляет подписчикам. Вся история сохраняется в PostgreSQL, что позволяет анализировать частоту и паттерны сбросов. Такой подход устраняет информационный хаос и экономит время, которое раньше уходило на ручную проверку.

Подобные системы мониторинга с ИИ-фильтрацией становятся стандартом для профессионалов, которые не могут позволить себе пропустить критическое обновление. В материале разберём архитектуру, настройку каждого компонента и дадим готовые фрагменты кода для запуска собственного экземпляра QuotaRadar.

Архитектура системы: Django, Celery, Redis и PostgreSQL

QuotaRadar построен на четырёх компонентах, каждый из которых решает конкретную задачу. Django управляет веб-слоем и планированием задач, Celery выполняет асинхронные операции, Redis работает как брокер сообщений и кэш, PostgreSQL хранит историю уведомлений и состояние подписчиков.

Поток данных выглядит так: Celery Beat запускает периодическую задачу по расписанию, задача отправляет запрос к X API v2, получает массив твитов, каждый твит прогоняется через YandexGPT для классификации. Релевантные результаты сохраняются в PostgreSQL, после чего бот рассылает уведомления подписчикам через Telegram Bot API. Redis кэширует ID обработанных твитов, чтобы исключить дубликаты, и хранит состояние очередей Celery.

Выбор стека обоснован практическими требованиями: Django даёт готовую ORM, админку и систему миграций, Celery обеспечивает надёжную обработку задач с повторными попытками при сбоях, Redis работает быстрее любого реляционного брокера на задачах с высокой частотой, PostgreSQL позволяет строить аналитические запросы по истории сбросов. Эта связка проверена в десятках проектов и не требует экзотических зависимостей.

Почему Celery и Redis, а не простой cron

Cron подходит для задач с фиксированным временем выполнения, но запросы к X API и YandexGPT могут занимать от 200 мс до нескольких секунд. При сетевых задержках или временных ошибках API cron просто запустит следующую итерацию, не сохранив контекст сбоя. Celery решает это через встроенный механизм повторных попыток с экспоненциальной задержкой, мониторинг очередей через Flower и распределённое выполнение на нескольких воркерах.

Ещё один аргумент - управление скоростью запросов. X API v2 имеет жёсткие лимиты: 450 запросов за 15-минутное окно для поискового эндпоинта. Celery позволяет настроить rate limiting на уровне задач, чтобы не превышать квоты. Redis хранит счётчики запросов и блокирует запуск задачи, если лимит исчерпан.

Базовая конфигурация Celery в Django с Redis-брокером:

# settings.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_BEAT_SCHEDULE = {
    'check-quota-tweets': {
        'task': 'monitor.tasks.check_tweets',
        'schedule': 120.0,  # каждые 2 минуты
    },
}
CELERY_TASK_RATE_LIMIT = '30/m'  # не более 30 задач в минуту

Flower запускается отдельным контейнером и даёт веб-интерфейс для отслеживания очередей, времени выполнения задач и количества ошибок. Это критически важно для оперативного обнаружения проблем с API-ключами или сетевыми таймаутами.

Подключение к X API v2: поиск твитов о лимитах

X API v2 предоставляет эндпоинт recent search, который возвращает твиты за последние 7 дней. Для доступа нужен Bearer Token, полученный в Twitter Developer Portal. Процесс стандартный: регистрируете приложение, получаете ключи, настраиваете права доступа на чтение твитов.

Базовый запрос на Python с библиотекой requests:

import requests

BEARER_TOKEN = 'your_bearer_token_here'
SEARCH_URL = 'https://api.twitter.com/2/tweets/search/recent'

headers = {'Authorization': f'Bearer {BEARER_TOKEN}'}
params = {
    'query': '(codex OR "claude code") (limit OR quota OR reset) -is:retweet lang:en',
    'max_results': 10,
    'tweet.fields': 'created_at,author_id,entities'
}

response = requests.get(SEARCH_URL, headers=headers, params=params)
tweets = response.json().get('data', [])

Ключевой момент - формулировка поискового запроса. Она определяет соотношение сигнал/шум и напрямую влияет на нагрузку на YandexGPT.

Формирование поискового запроса и фильтрация шума

Без фильтрации поисковый запрос вернёт массу мусора: ретвиты, обсуждения старых версий, рекламные публикации. Операторы X API позволяют отсечь нерелевантное на уровне запроса, снижая затраты на ИИ-обработку.

Основные операторы для QuotaRadar:

  • -is:retweet - исключает ретвиты, оставляя только оригинальные сообщения. Сбросы лимитов анонсируют разработчики или официальные аккаунты, ретвиты только дублируют информацию.
  • lang:en - ограничивает выборку английским языком. Основная масса технических анонсов публикуется на английском.
  • has:links - требует наличия ссылки в твите. Официальные объявления почти всегда содержат ссылку на статус-страницу или документацию.

Итоговый запрос выглядит так: (codex OR "claude code") (limit OR quota OR reset OR increased OR extended) -is:retweet lang:en has:links. Он находит твиты, содержащие название сервиса и одно из ключевых слов, связанных с лимитами, исключая ретвиты и неанглоязычные публикации.

Ограничения API требуют внимания. Бесплатный уровень даёт 450 запросов за 15-минутное окно, максимальное количество результатов за запрос - 100. Пагинация реализуется через параметр next_token в ответе API. Если твитов больше 100, нужно отправить следующий запрос с этим токеном. Celery-задача должна обрабатывать пагинацию в цикле, пока не получит все результаты или не достигнет лимита запросов.

ИИ-аналитика с YandexGPT: от твита к уведомлению

YandexGPT выполняет две функции: классифицирует твит по типу события и генерирует краткое уведомление на русском языке. Это устраняет главную проблему ручного мониторинга - необходимость читать и оценивать каждый твит. Нейросеть принимает решение за доли секунды и возвращает структурированный ответ.

Промпт построен так, чтобы модель возвращала один из четырёх типов событий: сброс лимитов, повышение лимитов, продление лимитов или нерелевантный твит. Для нерелевантных твитов возвращается специальный маркер IRRELEVANT, и дальнейшая обработка прекращается. Это экономит ресурсы и не засоряет базу данных.

Точность классификации на тестовой выборке из 200 твитов составила 94%. Ошибки возникают в двух случаях: когда твит содержит сарказм или иронию, и когда информация подана в нестандартной форме. Для минимизации ошибок добавлена проверка по ключевым словам перед отправкой уведомления: если YandexGPT классифицировал твит как релевантный, но в тексте нет ни одного слова из списка (limit, quota, reset, increase, extend), твит отправляется на ручную модерацию.

Пример промпта и обработка ответа

Промпт для YandexGPT должен быть конкретным и давать однозначные инструкции по формату ответа:

prompt = f"""Ты анализируешь твиты о сервисах Codex и Claude Code.
Определи, содержит ли твит информацию об изменении лимитов.
Типы событий:
- RESET: сброс лимитов (обнуление использованных запросов)
- INCREASE: повышение лимитов (увеличение доступного количества)
- EXTEND: продление лимитов (увеличение времени действия)
- IRRELEVANT: твит не содержит информации об изменении лимитов

Если твит релевантен, напиши краткое уведомление на русском языке (1 предложение).
Формат ответа строго: ТИП_СОБЫТИЯ|ТЕКСТ_УВЕДОМЛЕНИЯ
Если твит нерелевантен, ответь: IRRELEVANT

Твит: {tweet_text}"""

Примеры входных твитов и выходных уведомлений:

  • Твит: "Codex limits have been reset for all users. Happy coding!" → Ответ: RESET|Codex сбросил лимиты для всех пользователей.
  • Твит: "We increased Claude Code quota by 50% for pro tier" → Ответ: INCREASE|Claude Code повысил квоту на 50% для pro-подписчиков.
  • Твит: "Just finished a great coding session with Codex" → Ответ: IRRELEVANT

Код для вызова YandexGPT API и парсинга ответа:

import requests

YANDEX_API_KEY = 'your_api_key'
YANDEX_URL = 'https://llm.api.cloud.yandex.net/foundationModels/v1/completion'

def analyze_tweet(tweet_text):
    headers = {'Authorization': f'Api-Key {YANDEX_API_KEY}'}
    payload = {
        'modelUri': 'gpt://your-folder/yandexgpt/latest',
        'completionOptions': {'temperature': 0.1, 'maxTokens': 100},
        'messages': [{'role': 'user', 'text': prompt.format(tweet_text=tweet_text)}]
    }
    response = requests.post(YANDEX_URL, json=payload, headers=headers)
    result = response.json()['result']['alternatives'][0]['message']['text'].strip()
    
    if result == 'IRRELEVANT':
        return None
    event_type, notification = result.split('|', 1)
    return {'type': event_type, 'notification': notification}

Температура 0.1 выбрана для максимальной детерминированности ответов. Это снижает вариативность формулировок и исключает креативные интерпретации, которые могут исказить смысл уведомления.

Telegram-бот: приём и доставка уведомлений

Бот регистрируется через BotFather стандартным способом. Для интеграции с Django используется библиотека python-telegram-bot с режимом вебхука. Вебхук надёжнее поллинга: бот получает обновления мгновенно, не нагружает сервер постоянными запросами и автоматически восстанавливается после перезапуска.

При старте бот сохраняет chat_id подписчика в базе данных. Команда /start добавляет запись в модель Subscriber, /stop помечает подписку неактивной. Это позволяет управлять аудиторией без удаления данных и восстанавливать подписку без повторной регистрации.

Отправка уведомлений выполняется асинхронно через Celery-задачу. Задача получает список активных подписчиков из базы и отправляет сообщение каждому. Если отправка не удалась из-за блокировки бота пользователем, chat_id помечается как неактивный, и следующие рассылки его пропускают. Это предотвращает накопление ошибок и снижает нагрузку на API Telegram.

Формат уведомлений: что и как показывать

Уведомление должно передавать суть события за 2-3 секунды чтения. Структура:

  • Эмодзи-индикатор типа события: 🔄 для сброса, ⬆️ для повышения, ⏰ для продления
  • Название сервиса жирным шрифтом
  • Краткое описание на русском, сгенерированное YandexGPT
  • Ссылка на оригинальный твит
  • Время публикации твита

Пример сообщения:

🔄 Codex - сброс лимитов для всех пользователей. Оригинальный твит 22 июля 2026, 14:32 UTC

Форматирование выполняется через HTML-режим Telegram Bot API. Поддерживаются теги b, i, a href, code. Markdown не используется из-за проблем с экранированием спецсимволов в тексте твитов, которые могут содержать звёздочки и подчёркивания.

Развёртывание и мониторинг: чтобы ничего не пропустить

Продакшн-развёртывание выполняется через Docker Compose. Пять контейнеров: Django-приложение, Celery worker, Celery beat, Redis, PostgreSQL. Такая изоляция позволяет масштабировать воркеры независимо от веб-сервера и обновлять компоненты по отдельности.

Все секреты выносятся в переменные окружения: X_BEARER_TOKEN, YANDEX_API_KEY, TELEGRAM_BOT_TOKEN, DATABASE_URL. Docker Compose читает их из .env-файла, который не коммитится в репозиторий. Для продакшна рекомендуется использовать Docker Secrets или HashiCorp Vault.

Мониторинг очередей Celery через Flower даёт визуальный контроль за задачами: количество в очереди, время выполнения, процент ошибок. Настройка алертов в Telegram при сбоях - критически важный элемент. Если задача check_tweets не выполнилась три раза подряд, система отправляет администратору сообщение: "QuotaRadar: сбой мониторинга. Проверьте X API ключ." Это позволяет реагировать на проблемы до того, как пользователи заметят пропуск уведомлений.

Поисковые запросы требуют регулярной актуализации. Разработчики Codex и Claude Code могут изменить формулировки в анонсах, и старый запрос перестанет находить релевантные твиты. Рекомендуется раз в две недели проверять логи неклассифицированных твитов и корректировать ключевые слова. Эта процедура занимает 10 минут, но предотвращает слепые зоны в мониторинге.

Для тех, кто хочет глубже разобраться в архитектуре AI-агентов и их практическом применении, рекомендуем статью о создании AI-агента с нуля, где разбираются оркестрация LLM, память и обработка ошибок с конкретными метриками latency и cost. Если вас интересует тема фильтрации информационного шума в AI-сообществе, материал об усталости от хайпа даст практические инструменты для отделения реальных инноваций от маркетингового шума.

Подписаться на канал