Skip to content

Commit b110a59

Browse files
committed
Script to query llm usage stats
1 parent 2efb621 commit b110a59

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

scripts/query-usage-stats.ts

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { db } from '@codebuff/internal/db'
2+
import { sql } from 'drizzle-orm'
3+
4+
async function queryUsageStats() {
5+
console.log(
6+
'Querying usage stats for the last 7 days (minimax-m2.5, claude-4.6-opus)...\n',
7+
)
8+
9+
const result = await db.execute(sql`
10+
WITH recent AS (
11+
SELECT
12+
input_tokens,
13+
cache_read_input_tokens,
14+
COALESCE(cache_creation_input_tokens, 0) AS cache_creation_input_tokens,
15+
output_tokens,
16+
finished_at,
17+
client_id
18+
FROM message
19+
WHERE finished_at >= NOW() - INTERVAL '4 days'
20+
AND model IN ('minimax/minimax-m2.5')
21+
),
22+
23+
token_stats AS (
24+
SELECT
25+
ROUND(AVG(input_tokens + cache_read_input_tokens + cache_creation_input_tokens))
26+
AS avg_total_input_tokens,
27+
ROUND(
28+
AVG(
29+
CASE
30+
WHEN (input_tokens + cache_read_input_tokens + cache_creation_input_tokens) > 0
31+
THEN cache_read_input_tokens::numeric
32+
/ (input_tokens + cache_read_input_tokens + cache_creation_input_tokens)
33+
ELSE 0
34+
END
35+
) * 100, 1
36+
) AS avg_cache_rate_pct,
37+
ROUND(AVG(output_tokens))
38+
AS avg_output_tokens,
39+
COUNT(*) AS total_requests
40+
FROM recent
41+
),
42+
43+
client_stats AS (
44+
SELECT
45+
ROUND(AVG(cnt)) AS avg_requests_per_client
46+
FROM (
47+
SELECT client_id, COUNT(*) AS cnt
48+
FROM recent
49+
WHERE client_id IS NOT NULL
50+
GROUP BY client_id
51+
) per_client
52+
),
53+
54+
rps AS (
55+
SELECT
56+
COUNT(*) AS req_count
57+
FROM recent
58+
GROUP BY date_trunc('second', finished_at)
59+
),
60+
61+
rps_stats AS (
62+
SELECT
63+
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY req_count) AS median_rps,
64+
MAX(req_count) AS peak_rps
65+
FROM rps
66+
)
67+
68+
SELECT
69+
t.avg_total_input_tokens,
70+
t.avg_cache_rate_pct,
71+
t.avg_output_tokens,
72+
c.avg_requests_per_client,
73+
r.median_rps,
74+
r.peak_rps,
75+
t.total_requests
76+
FROM token_stats t, rps_stats r, client_stats c
77+
`)
78+
79+
const row = result[0]
80+
if (!row) {
81+
console.log('No data found for the given filters.')
82+
return
83+
}
84+
85+
console.log('Results:')
86+
console.log('─────────────────────────────────────────')
87+
console.log(`Avg total input tokens: ${row.avg_total_input_tokens}`)
88+
console.log(`Avg cache rate: ${row.avg_cache_rate_pct}%`)
89+
console.log(`Avg output tokens: ${row.avg_output_tokens}`)
90+
console.log(`Median RPS: ${row.median_rps}`)
91+
console.log(`Peak RPS: ${row.peak_rps}`)
92+
console.log(`Avg requests/client: ${row.avg_requests_per_client}`)
93+
console.log(`Total requests (7d): ${row.total_requests}`)
94+
}
95+
96+
queryUsageStats().then(() => process.exit(0)).catch((err) => {
97+
console.error(err)
98+
process.exit(1)
99+
})

0 commit comments

Comments
 (0)