124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
"""Скрипт для анализа использования токенов GigaChat."""
|
||
import argparse
|
||
import json
|
||
from collections import defaultdict
|
||
from datetime import datetime
|
||
from pathlib import Path
|
||
|
||
|
||
def calculate_cost(tokens: int, model: str = "Lite") -> float:
|
||
"""Рассчитать стоимость токенов."""
|
||
rates = {
|
||
"Lite": 0.2 / 1000,
|
||
"Pro": 1.5 / 1000,
|
||
"Max": 1.95 / 1000,
|
||
}
|
||
rate = rates.get(model, rates["Lite"])
|
||
return tokens * rate
|
||
|
||
|
||
def analyze_usage(data_file: str, month: str = None):
|
||
"""Проанализировать использование токенов."""
|
||
if not Path(data_file).exists():
|
||
print(f"Файл {data_file} не найден. Создайте файл с данными использования.")
|
||
print("\nФормат данных (JSON):")
|
||
print(json.dumps(
|
||
{
|
||
"usage": [
|
||
{
|
||
"user_id": "user_123",
|
||
"date": "2025-12-15",
|
||
"tokens": 1500,
|
||
"model": "Lite",
|
||
}
|
||
]
|
||
},
|
||
indent=2,
|
||
))
|
||
return
|
||
|
||
with open(data_file, "r", encoding="utf-8") as f:
|
||
data = json.load(f)
|
||
|
||
usage_records = data.get("usage", [])
|
||
|
||
if month:
|
||
# Фильтруем по месяцу
|
||
usage_records = [
|
||
record
|
||
for record in usage_records
|
||
if record.get("date", "").startswith(month)
|
||
]
|
||
|
||
if not usage_records:
|
||
print("Нет данных для анализа")
|
||
return
|
||
|
||
# Статистика по моделям
|
||
model_stats = defaultdict(lambda: {"tokens": 0, "requests": 0})
|
||
user_stats = defaultdict(lambda: {"tokens": 0, "requests": 0})
|
||
|
||
total_tokens = 0
|
||
|
||
for record in usage_records:
|
||
tokens = record.get("tokens", 0)
|
||
model = record.get("model", "Lite")
|
||
user_id = record.get("user_id", "unknown")
|
||
|
||
model_stats[model]["tokens"] += tokens
|
||
model_stats[model]["requests"] += 1
|
||
user_stats[user_id]["tokens"] += tokens
|
||
user_stats[user_id]["requests"] += 1
|
||
total_tokens += tokens
|
||
|
||
# Выводим отчет
|
||
print("=" * 50)
|
||
print(f"GigaChat Usage Report")
|
||
if month:
|
||
print(f"Period: {month}")
|
||
print("=" * 50)
|
||
print(f"\nTotal tokens used: {total_tokens:,}")
|
||
|
||
print("\nBy Model:")
|
||
total_cost = 0
|
||
for model, stats in sorted(model_stats.items()):
|
||
cost = calculate_cost(stats["tokens"], model)
|
||
total_cost += cost
|
||
print(f" {model}:")
|
||
print(f" Tokens: {stats['tokens']:,}")
|
||
print(f" Requests: {stats['requests']}")
|
||
print(f" Cost: ₽{cost:,.2f}")
|
||
|
||
print(f"\nTotal cost: ₽{total_cost:,.2f}")
|
||
|
||
print("\nTop Users:")
|
||
top_users = sorted(user_stats.items(), key=lambda x: x[1]["tokens"], reverse=True)[:10]
|
||
for user_id, stats in top_users:
|
||
print(f" {user_id}: {stats['tokens']:,} tokens ({stats['requests']} requests)")
|
||
|
||
|
||
def main():
|
||
"""Главная функция."""
|
||
parser = argparse.ArgumentParser(description="Анализ использования токенов GigaChat")
|
||
parser.add_argument(
|
||
"--file",
|
||
type=str,
|
||
default="usage_data.json",
|
||
help="Файл с данными использования",
|
||
)
|
||
parser.add_argument(
|
||
"--month",
|
||
type=str,
|
||
default=None,
|
||
help="Месяц для анализа (формат: YYYY-MM)",
|
||
)
|
||
|
||
args = parser.parse_args()
|
||
|
||
analyze_usage(args.file, args.month)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
|