1use anyhow::Result;
2use serde::Serialize;
3
4#[derive(Serialize, Debug, clickhouse::Row)]
5pub struct LlmUsageEventRow {
6 pub time: i64,
7 pub user_id: i32,
8 pub is_staff: bool,
9 pub plan: String,
10 pub model: String,
11 pub provider: String,
12 pub input_token_count: u64,
13 pub output_token_count: u64,
14 pub requests_this_minute: u64,
15 pub tokens_this_minute: u64,
16 pub tokens_this_day: u64,
17 pub input_tokens_this_month: u64,
18 pub output_tokens_this_month: u64,
19 pub spending_this_month: u64,
20}
21
22#[derive(Serialize, Debug, clickhouse::Row)]
23pub struct LlmRateLimitEventRow {
24 pub time: i64,
25 pub user_id: i32,
26 pub is_staff: bool,
27 pub plan: String,
28 pub model: String,
29 pub provider: String,
30 pub usage_measure: String,
31 pub requests_this_minute: u64,
32 pub tokens_this_minute: u64,
33 pub tokens_this_day: u64,
34 pub users_in_recent_minutes: u64,
35 pub users_in_recent_days: u64,
36 pub max_requests_per_minute: u64,
37 pub max_tokens_per_minute: u64,
38 pub max_tokens_per_day: u64,
39}
40
41pub async fn report_llm_usage(client: &clickhouse::Client, row: LlmUsageEventRow) -> Result<()> {
42 let mut insert = client.insert("llm_usage_events")?;
43 insert.write(&row).await?;
44 insert.end().await?;
45 Ok(())
46}
47
48pub async fn report_llm_rate_limit(
49 client: &clickhouse::Client,
50 row: LlmRateLimitEventRow,
51) -> Result<()> {
52 let mut insert = client.insert("llm_rate_limits")?;
53 insert.write(&row).await?;
54 insert.end().await?;
55 Ok(())
56}