-
Notifications
You must be signed in to change notification settings - Fork 5
Usage
Отслеживание использования LLM, TTS и STT сервисов с настраиваемыми лимитами и автоматической очисткой логов.

Система Usage отслеживает потребление AI-сервисов в реальном времени:
- Логирование всех запросов: LLM (генерация текста), TTS (синтез речи), STT (распознавание речи)
- Лимиты потребления: дневные и месячные ограничения по сервисам
- Hard/Soft лимиты: блокировка при превышении или только предупреждение
- Автоматическая очистка: удаление старых логов по расписанию
- Аналитика: агрегированная статистика по периодам и источникам
Управление через UsageView.vue с тремя основными вкладками:
Агрегированные данные о потреблении сервисов.
| Фильтр | Описание |
|---|---|
| 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: секунды распознавания
Детальная таблица всех запросов к 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
}
}Настройка ограничений потребления с возможностью создания, редактирования и удаления правил.
| Поле | Описание |
|---|---|
| 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)
{
"service_type": "tts",
"limit_type": "monthly",
"limit_value": 36000,
"hard_limit": false,
"warning_threshold": 90
}Поведение:
- При достижении 90% (32 400 секунд) предупреждение
- При превышении 100% запросы НЕ блокируются, только логируется превышение
Общая сводка по всем сервисам за выбранный период:
| Метрика | Описание |
|---|---|
| Total LLM Tokens | Всего использовано токенов LLM |
| Total TTS Seconds | Всего секунд синтеза TTS |
| Total STT Seconds | Всего секунд распознавания STT |
| Total Cost | Приблизительная стоимость (если настроены тарифы) |
Функция автоматической очистки устаревших логов для экономии места в БД.
| Параметр | Описание |
|---|---|
| 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}'| Метод | 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
}
}
}- Admin — полный доступ ко всей статистике и лимитам
- User — чтение статистики + управление своими лимитами
- Guest — только чтение статистики (без редактирования лимитов)