workspace: initial commit - MEMORY, tasks, skills, memory
This commit is contained in:
116
tasks/scripts/token_summary.py
Normal file
116
tasks/scripts/token_summary.py
Normal file
@@ -0,0 +1,116 @@
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime, timezone
|
||||
import glob
|
||||
|
||||
def parse_iso(timestamp):
|
||||
# Parse ISO timestamp with timezone
|
||||
try:
|
||||
dt = datetime.fromisoformat(timestamp.replace('Z', '+00:00'))
|
||||
return dt
|
||||
except Exception as e:
|
||||
print(f'Error parsing {timestamp}: {e}')
|
||||
return None
|
||||
|
||||
def process_session_file(path):
|
||||
today = datetime(2026, 3, 22, tzinfo=timezone.utc)
|
||||
total_input = 0
|
||||
total_output = 0
|
||||
total_cost = 0.0
|
||||
model_counts = {}
|
||||
|
||||
with open(path, 'r') as f:
|
||||
for line_num, line in enumerate(f, 1):
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
try:
|
||||
data = json.loads(line)
|
||||
except json.JSONDecodeError as e:
|
||||
continue
|
||||
|
||||
# Check timestamp for today
|
||||
timestamp = data.get('timestamp')
|
||||
if not timestamp:
|
||||
continue
|
||||
dt = parse_iso(timestamp)
|
||||
if not dt:
|
||||
continue
|
||||
if dt.date() != today.date():
|
||||
continue
|
||||
|
||||
# We need messages with usage (assistant responses)
|
||||
if data.get('type') == 'message':
|
||||
msg = data.get('message', {})
|
||||
if msg.get('role') == 'assistant' and 'usage' in msg:
|
||||
usage = msg['usage']
|
||||
input_tokens = usage.get('input', 0)
|
||||
output_tokens = usage.get('output', 0)
|
||||
cache_read = usage.get('cacheRead', 0)
|
||||
cache_write = usage.get('cacheWrite', 0)
|
||||
# cost may be inside usage['cost']
|
||||
cost = usage.get('cost', {})
|
||||
cost_total = cost.get('total', 0.0)
|
||||
model = msg.get('model', 'unknown')
|
||||
|
||||
total_input += input_tokens
|
||||
total_output += output_tokens
|
||||
total_cost += cost_total
|
||||
|
||||
# Track per model
|
||||
if model not in model_counts:
|
||||
model_counts[model] = {'input': 0, 'output': 0, 'cost': 0.0}
|
||||
model_counts[model]['input'] += input_tokens
|
||||
model_counts[model]['output'] += output_tokens
|
||||
model_counts[model]['cost'] += cost_total
|
||||
|
||||
return total_input, total_output, total_cost, model_counts
|
||||
|
||||
sessions_dir = '/home/node/.openclaw/agents/main/sessions'
|
||||
jsonl_files = glob.glob(os.path.join(sessions_dir, '*.jsonl'))
|
||||
|
||||
print('📊 Сводка использования токенов за сегодня (2026-03-22)')
|
||||
print('=' * 60)
|
||||
|
||||
overall_input = 0
|
||||
overall_output = 0
|
||||
overall_cost = 0.0
|
||||
all_model_counts = {}
|
||||
|
||||
for file_path in jsonl_files:
|
||||
file_name = os.path.basename(file_path)
|
||||
print(f'\n📁 Файл сессии: {file_name}')
|
||||
inp, out, cost, models = process_session_file(file_path)
|
||||
print(f' Входные токены: {inp:,}')
|
||||
print(f' Выходные токены: {out:,}')
|
||||
print(f' Примерная стоимость: ${cost:.6f}')
|
||||
if models:
|
||||
for model, counts in models.items():
|
||||
print(f' Модель: {model}')
|
||||
print(f' вход: {counts[\"input\"]:,}, выход: {counts[\"output\"]:,}, стоимость: ${counts[\"cost\"]:.6f}')
|
||||
# Aggregate across files
|
||||
if model not in all_model_counts:
|
||||
all_model_counts[model] = counts.copy()
|
||||
else:
|
||||
all_model_counts[model]['input'] += counts['input']
|
||||
all_model_counts[model]['output'] += counts['output']
|
||||
all_model_counts[model]['cost'] += counts['cost']
|
||||
|
||||
overall_input += inp
|
||||
overall_output += out
|
||||
overall_cost += cost
|
||||
|
||||
print('\n' + '=' * 60)
|
||||
print('📈 ОБЩИЙ ИТОГ за сегодня:')
|
||||
print(f' Всего входных токенов: {overall_input:,}')
|
||||
print(f' Всего выходных токенов: {overall_output:,}')
|
||||
print(f' Общая стоимость: ${overall_cost:.6f}')
|
||||
print()
|
||||
print('📋 По моделям:')
|
||||
for model, counts in all_model_counts.items():
|
||||
print(f' • {model}')
|
||||
print(f' вход: {counts[\"input\"]:,} токенов, выход: {counts[\"output\"]:,} токенов')
|
||||
print(f' стоимость: ${counts[\"cost\"]:.6f}')
|
||||
print()
|
||||
print('💡 Примечание: стоимость может не включать кэшированные токены.')
|
||||
print(' Данные основаны на записях сессий.')
|
||||
Reference in New Issue
Block a user