Skip to content
shaerware edited this page Feb 11, 2026 · 1 revision

Usage (Статистика)

Отслеживание использования LLM, TTS и STT сервисов с настраиваемыми лимитами и автоматической очисткой логов.

Скриншот

Usage

Концепция

Система Usage отслеживает потребление AI-сервисов в реальном времени:

  • Логирование всех запросов: LLM (генерация текста), TTS (синтез речи), STT (распознавание речи)
  • Лимиты потребления: дневные и месячные ограничения по сервисам
  • Hard/Soft лимиты: блокировка при превышении или только предупреждение
  • Автоматическая очистка: удаление старых логов по расписанию
  • Аналитика: агрегированная статистика по периодам и источникам

Страница Usage

Управление через UsageView.vue с тремя основными вкладками:

Вкладка Stats (Статистика)

Агрегированные данные о потреблении сервисов.

Фильтры

Фильтр Описание
Service Type Тип сервиса: tts, llm, stt (или "Все")
Period Период статистики: 7 дней, 30 дней, 90 дней, год (по умолчанию 30 дней)
From Date Дата начала (опционально)
To Date Дата окончания (опционально)

Метрики

Метрика Описание
Total Requests Общее количество запросов за период
Unique Users Количество уникальных пользователей
Total Tokens Суммарное количество токенов (для LLM)
Total Duration Суммарная длительность (для TTS/STT, секунды)
Avg Response Time Среднее время ответа (мс)

График потребления

Визуализация использования сервисов по дням/часам:

  • LLM: количество токенов
  • TTS: секунды синтеза
  • STT: секунды распознавания

Вкладка Logs (Логи запросов)

Детальная таблица всех запросов к AI-сервисам.

Колонки таблицы

Колонка Описание
Timestamp Дата и время запроса
Service Type Тип сервиса (tts, llm, stt)
Action Действие (например, generate, synthesize, transcribe)
Source Источник запроса (telegram_bot:{id}, widget:{id}, api, admin)
User ID Идентификатор пользователя (если применимо)
Tokens/Duration Количество токенов (LLM) или длительность (TTS/STT)
Status Статус запроса (success, error, rate_limited)
Details Дополнительная информация (модель, параметры, ошибки)

Фильтры логов

Фильтр Описание
Service Type Фильтр по типу сервиса
Action Фильтр по действию
Source Фильтр по источнику
From Date Дата начала
To Date Дата окончания
Limit Количество записей (по умолчанию 100)
Offset Смещение для пагинации

Пример лога

{
  "id": 12345,
  "timestamp": "2026-02-11T14:30:00Z",
  "service_type": "llm",
  "action": "generate",
  "source": "telegram_bot:sales-bot",
  "user_id": "123456789",
  "tokens": 450,
  "status": "success",
  "details": {
    "model": "qwen2.5-7b",
    "temperature": 0.7,
    "max_tokens": 500
  }
}

Вкладка Limits (Лимиты)

Настройка ограничений потребления с возможностью создания, редактирования и удаления правил.

Поля лимита

Поле Описание
Service Type Тип сервиса: tts, llm, stt
Limit Type Тип лимита: daily (дневной), monthly (месячный)
Limit Value Значение лимита (токены для LLM, секунды для TTS/STT)
Hard Limit Жёсткий лимит (блокировать при превышении) или мягкий (только предупреждение)
Warning Threshold Порог предупреждения (процент от лимита, например 80%)

Пример конфигурации

{
  "service_type": "llm",
  "limit_type": "daily",
  "limit_value": 100000,
  "hard_limit": true,
  "warning_threshold": 80
}

Поведение:

  • При достижении 80% (80 000 токенов) система отправит предупреждение (если настроены уведомления)
  • При превышении 100% (100 000 токенов) запросы будут блокироваться (hard_limit = true)

Мягкий лимит (Soft Limit)

{
  "service_type": "tts",
  "limit_type": "monthly",
  "limit_value": 36000,
  "hard_limit": false,
  "warning_threshold": 90
}

Поведение:

  • При достижении 90% (32 400 секунд) предупреждение
  • При превышении 100% запросы НЕ блокируются, только логируется превышение

Summary (Сводка)

Общая сводка по всем сервисам за выбранный период:

Метрика Описание
Total LLM Tokens Всего использовано токенов LLM
Total TTS Seconds Всего секунд синтеза TTS
Total STT Seconds Всего секунд распознавания STT
Total Cost Приблизительная стоимость (если настроены тарифы)

Cleanup (Очистка старых логов)

Функция автоматической очистки устаревших логов для экономии места в БД.

Параметры

Параметр Описание
Days to Keep Количество дней для хранения логов (по умолчанию 30)

Кнопка "Очистить логи"

При нажатии удаляются все логи старше указанного количества дней.

Пример:

  • Days to Keep = 30 → удалятся все логи старше 30 дней от текущей даты

Автоматическая очистка

Можно настроить cron-задачу для периодической очистки:

# Каждый день в 3:00 удалять логи старше 90 дней
0 3 * * * curl -X POST http://localhost:8002/admin/usage/cleanup \
  -H "Authorization: Bearer <admin_token>" \
  -d '{"days": 90}'

API эндпоинты

Метод Endpoint Описание
GET /admin/usage/logs Список логов с фильтрами
GET /admin/usage/stats Агрегированная статистика
GET /admin/usage/summary Сводка по всем сервисам
GET /admin/usage/limits Список лимитов
POST /admin/usage/limits Создать или обновить лимит
DELETE /admin/usage/limits Удалить лимит
POST /admin/usage/cleanup Очистить старые логи

Пример: Получить статистику

GET /admin/usage/stats?service_type=llm&period=30
Authorization: Bearer <jwt_token>

Пример ответа: Статистика

{
  "total_requests": 1523,
  "unique_users": 47,
  "total_tokens": 856340,
  "avg_response_time": 1250,
  "by_day": [
    {
      "date": "2026-02-01",
      "requests": 52,
      "tokens": 28400
    },
    {
      "date": "2026-02-02",
      "requests": 61,
      "tokens": 31200
    }
  ]
}

Пример: Установить лимит

POST /admin/usage/limits
Authorization: Bearer <jwt_token>
Content-Type: application/json

{
  "service_type": "llm",
  "limit_type": "daily",
  "limit_value": 100000,
  "hard_limit": true,
  "warning_threshold": 80
}

Пример: Очистка логов

POST /admin/usage/cleanup
Authorization: Bearer <jwt_token>
Content-Type: application/json

{
  "days": 90
}

Ответ:

{
  "status": "success",
  "deleted_count": 3542,
  "message": "Удалено 3542 записей старше 90 дней"
}

Мониторинг лимитов

Система автоматически проверяет лимиты при каждом запросе к AI-сервисам:

Поток проверки

1. Запрос к LLM/TTS/STT
   ↓
2. UsageService.check_limit(service_type, limit_type)
   ↓
3. Получить текущее потребление за период (день/месяц)
   ↓
4. Сравнить с лимитом
   ↓
5а. Если < warning_threshold → разрешить запрос
5б. Если ≥ warning_threshold < limit → разрешить + предупреждение
5в. Если ≥ limit и hard_limit=true → заблокировать
5г. Если ≥ limit и hard_limit=false → разрешить + лог превышения

Ответ при блокировке

{
  "error": "Rate limit exceeded",
  "service_type": "llm",
  "limit_type": "daily",
  "current_usage": 105000,
  "limit_value": 100000,
  "reset_at": "2026-02-12T00:00:00Z"
}

Интеграция с источниками

Каждый источник запросов логируется с уникальным идентификатором:

Источник Формат source Пример
Telegram Bot telegram_bot:{instance_id} telegram_bot:sales-bot
Widget widget:{instance_id} widget:support-widget
API api api
Admin Panel admin:{user_id} admin:1
GSM gsm:{modem_id} gsm:sim7600

Аналитика по источникам

Статистика разбита по источникам:

{
  "by_source": {
    "telegram_bot:sales-bot": {
      "requests": 450,
      "tokens": 256000
    },
    "widget:support-widget": {
      "requests": 120,
      "tokens": 68000
    },
    "api": {
      "requests": 30,
      "tokens": 15000
    }
  }
}

RBAC

  • Admin — полный доступ ко всей статистике и лимитам
  • User — чтение статистики + управление своими лимитами
  • Guest — только чтение статистики (без редактирования лимитов)

CRM | Settings

Clone this wiki locally