57 lines
1.6 KiB
Bash
Executable File
57 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# Daily LiteLLM cost snapshot — cron at midnight
|
|
# Writes to /var/log/litellm/costs.csv on CT 116
|
|
|
|
MASTER="sk-litellm-7f96080dd99b15c36bd4b333b58a6796"
|
|
BASE="http://127.0.0.1:4001"
|
|
CSV="/var/log/litellm/costs.csv"
|
|
DATE=$(date -I)
|
|
YESTERDAY=$(date -I -d yesterday)
|
|
|
|
# Fetch yesterday's spend by key
|
|
RESP=$(curl -s "${BASE}/global/spend/logs?start_date=${YESTERDAY}T00:00:00&end_date=${YESTERDAY}T23:59:59&page_size=1000" \
|
|
-H "Authorization: Bearer $MASTER" 2>/dev/null)
|
|
|
|
# Parse total spend
|
|
TOTAL=$(echo "$RESP" | python3 -c "
|
|
import sys, json
|
|
data = json.load(sys.stdin)
|
|
total = sum(r.get('spend', 0) or 0 for r in data.get('data', []))
|
|
print(f'{total:.6f}')
|
|
" 2>/dev/null)
|
|
|
|
# Parse per-model spend
|
|
PER_MODEL=$(echo "$RESP" | python3 -c "
|
|
import sys, json
|
|
from collections import defaultdict
|
|
data = json.load(sys.stdin)
|
|
spend = defaultdict(float)
|
|
for r in data.get('data', []):
|
|
model = r.get('model', 'unknown')
|
|
spend[model] += r.get('spend', 0) or 0
|
|
for model, cost in sorted(spend.items()):
|
|
print(f'{model}:{cost:.6f}')
|
|
" 2>/dev/null)
|
|
|
|
# Per-key spend
|
|
PER_KEY=$(echo "$RESP" | python3 -c "
|
|
import sys, json
|
|
from collections import defaultdict
|
|
data = json.load(sys.stdin)
|
|
spend = defaultdict(float)
|
|
for r in data.get('data', []):
|
|
key = r.get('api_key', 'unknown')[:20]
|
|
spend[key] += r.get('spend', 0) or 0
|
|
for key, cost in sorted(spend.items()):
|
|
print(f'{key}:{cost:.6f}')
|
|
" 2>/dev/null)
|
|
|
|
# Write CSV
|
|
mkdir -p $(dirname "$CSV")
|
|
if [ ! -f "$CSV" ]; then
|
|
echo "date,total_cost,per_model,per_key" > "$CSV"
|
|
fi
|
|
echo "${DATE},${TOTAL},\"${PER_MODEL}\",\"${PER_KEY}\"" >> "$CSV"
|
|
|
|
echo "Snapshot: ${DATE} | Total: \$${TOTAL}"
|