Skip to content

About

Telegram bot: уведомления о лимитах Claude (обнуление недельного окна, пороги утилизации, overflow, блокировка)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

limits-bot

Telegram-бот, который следит за лимитами Claude (Max plan) и Codex (ChatGPT-подписка через CLIProxyAPI) и шлёт push-уведомления:

  • 🔄 недельный лимит обнулился — ловится по факту (7d% резко упал или сменилось окно), не по расписанию;
  • ⏳ скоро обнулится — предупреждение за WEEKLY_WARN_HOURS до сброса недельного окна;
  • ⚠️ пороги утилизации — при пересечении 80% / 95% по 5h и 7d окнам (настраивается);
  • 💸 платный overflow (extra_usage) — при достижении порога месячного лимита (значения приходят в центах: monthly_limit=16000 = $160.00, бот делит на 100);
  • ⛔ полная блокировка (quota.exceeded) и восстановление.

Мониторит Claude и Codex одновременно (🟣 Claude / 🟠 Codex), каждый со своим источником. Постоянная клавиатура внизу + inline-меню /menu. Команды: /status (лимиты по всем аккаунтам), /next (все окна обнуления), /models (модели прокси).

Команда /check проверяет настоящий короткий ответ модели Claude через AI Proxy, официальный Claude Status и, если настроен Codex, короткий ответ его модели. Она показывает время ответа и число успешных автоматических проверок из последних шести. Список /models не считается проверкой работоспособности авторизации.

Фоновая проверка идёт раз в HEALTH_POLL_INTERVAL_MIN минут: при проблеме и после восстановления бот отправляет уведомление. Проблемы авторизации и открытые инциденты Claude Status сообщаются сразу, прочие сбои — после двух опросов, восстановление — после двух удачных опросов. История и флаги уведомлений лежат в том же state.json и переживают перезапуск.

Проверяются три источника: rotate-proxy rodionov (Claude), zsp по внутреннему адресу CODEX_API_URL и zsp по публичному ZSP_PUBLIC_URL. Публичная проверка ловит поломку nginx/TLS/DNS, которую внутренний адрес не видит. /check дополнительно шлёт короткий запрос к каждой чат-модели обоих прокси (модели *image* пропускаются) и показывает статус и задержку по каждой.

Срок OAuth-токена Claude API прокси не отдаёт, поэтому дату последнего обновления логина вводит владелец: кнопкой «🔑 Токен» (меню и клавиатура внизу) или командой /token. Кнопки: «Обновил сегодня», «Вчера», «2 дн. назад», «3 дн.», «Неделю назад», «📅 Выбрать дату» (сетка последних 28 дней) и «✏️ Ввести вручную» (бот просит дату ответным сообщением). Кнопки записи работают только для ALLOWED_USER_IDS.

Команда:

  • /token — показать дату и срок с кнопками выбора;
  • /token 25.09.2026 (также 2026-09-25, 25.09, сегодня, вчера) — записать дату обновления, можно задним числом; дата в будущем отклоняется.

Срок = дата + CLAUDE_LOGIN_PERIOD_DAYS (30). За CLAUDE_LOGIN_WARN_DAYS (2) дня бот присылает напоминание в канал и админам, а при просрочке — ещё одно. Каждое напоминание приходит один раз на срок; новая дата сбрасывает флаги. Дата хранится в state.json (ключ login). Протухший логин виден и по первому отказу авторизации (auth_unavailable, 401/403): бот сообщает о нём сразу. Токены бот не читает.

Как это работает

Раз в POLL_INTERVAL_MIN минут (по умолчанию 30) бот опрашивает limits API (тот же rotate-proxy, что использует CCR), сравнивает ответ с прошлым снапшотом на диске (/data/state.json) и шлёт события из разницы. Пороги и предупреждения — edge-triggered: одно окно = одно уведомление, без спама.

На первом запуске снапшот сохраняется молча (baseline), события не шлются.

Конфигурация

Все настройки — через окружение / .env (см. .env.example). Секреты в репозиторий не коммитятся (.env в .gitignore).

Переменная Назначение Дефолт
BOT_TOKEN токен бота из BotFather —
CHAT_ID куда слать push —
ALLOWED_USER_IDS кому разрешены команды (опц.) —
LIMITS_API_URL эндпоинт лимитов rotate-proxy
LIMITS_TOKEN Bearer для API —
ACCOUNTS_FILTER мониторить только эти email (опц.) все
POLL_INTERVAL_MIN интервал опроса, мин 30
WEEKLY_WARN_HOURS за сколько ч предупреждать 2
THRESHOLDS пороги утилизации, % 80,95
EXTRA_USAGE_WARN_PCT порог overflow, % 80
STATE_PATH путь к снапшоту /data/state.json
CLAUDE_PROBE_MODEL модель для короткой проверки Claude claude-sonnet-5-5
CODEX_PROBE_MODEL модель для короткой проверки Codex gpt-6-luna
HEALTH_POLL_INTERVAL_MIN период проверок, мин 10
ZSP_PUBLIC_URL публичный адрес zsp-прокси для внешней проверки rotate-proxy.zspzvs.ru
CLAUDE_LOGIN_PERIOD_DAYS период жизни логина Claude, дни 30
CLAUDE_LOGIN_WARN_DAYS за сколько дней напомнить 2

Запуск

Docker (прод, образ из GHCR)

cp .env.example .env      # заполнить BOT_TOKEN, CHAT_ID, LIMITS_TOKEN
docker compose up -d

Локальная сборка

docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

Без Docker

python -m venv .venv && source .venv/bin/activate
pip install -e .
cp .env.example .env      # заполнить
python -m app.main

Стек

Python 3.12, aiogram 3, APScheduler, httpx, pydantic-settings. Образ multi-arch (amd64/arm64) собирается в GHCR через GitHub Actions на push в main.

About

Telegram bot: уведомления о лимитах Claude (обнуление недельного окна, пороги утилизации, overflow, блокировка)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages