usage_tests.rs

  1use crate::{
  2    llm::db::{queries::providers::ModelRateLimits, queries::usages::Usage, LlmDatabase},
  3    test_llm_db,
  4};
  5use chrono::{Duration, Utc};
  6use pretty_assertions::assert_eq;
  7use rpc::LanguageModelProvider;
  8
  9test_llm_db!(test_tracking_usage, test_tracking_usage_postgres);
 10
 11async fn test_tracking_usage(db: &mut LlmDatabase) {
 12    let provider = LanguageModelProvider::Anthropic;
 13    let model = "claude-3-5-sonnet";
 14
 15    db.initialize().await.unwrap();
 16    db.insert_models(&[(
 17        provider,
 18        model.to_string(),
 19        ModelRateLimits {
 20            max_requests_per_minute: 5,
 21            max_tokens_per_minute: 10_000,
 22            max_tokens_per_day: 50_000,
 23        },
 24    )])
 25    .await
 26    .unwrap();
 27
 28    let t0 = Utc::now();
 29    let user_id = 123;
 30
 31    let now = t0;
 32    db.record_usage(user_id, provider, model, 1000, now)
 33        .await
 34        .unwrap();
 35
 36    let now = t0 + Duration::seconds(10);
 37    db.record_usage(user_id, provider, model, 2000, now)
 38        .await
 39        .unwrap();
 40
 41    let usage = db.get_usage(user_id, provider, model, now).await.unwrap();
 42    assert_eq!(
 43        usage,
 44        Usage {
 45            requests_this_minute: 2,
 46            tokens_this_minute: 3000,
 47            tokens_this_day: 3000,
 48            tokens_this_month: 3000,
 49        }
 50    );
 51
 52    let now = t0 + Duration::seconds(60);
 53    let usage = db.get_usage(user_id, provider, model, now).await.unwrap();
 54    assert_eq!(
 55        usage,
 56        Usage {
 57            requests_this_minute: 1,
 58            tokens_this_minute: 2000,
 59            tokens_this_day: 3000,
 60            tokens_this_month: 3000,
 61        }
 62    );
 63
 64    let now = t0 + Duration::seconds(60);
 65    db.record_usage(user_id, provider, model, 3000, now)
 66        .await
 67        .unwrap();
 68
 69    let usage = db.get_usage(user_id, provider, model, now).await.unwrap();
 70    assert_eq!(
 71        usage,
 72        Usage {
 73            requests_this_minute: 2,
 74            tokens_this_minute: 5000,
 75            tokens_this_day: 6000,
 76            tokens_this_month: 6000,
 77        }
 78    );
 79
 80    let t1 = t0 + Duration::hours(24);
 81    let now = t1;
 82    let usage = db.get_usage(user_id, provider, model, now).await.unwrap();
 83    assert_eq!(
 84        usage,
 85        Usage {
 86            requests_this_minute: 0,
 87            tokens_this_minute: 0,
 88            tokens_this_day: 5000,
 89            tokens_this_month: 6000,
 90        }
 91    );
 92
 93    db.record_usage(user_id, provider, model, 4000, now)
 94        .await
 95        .unwrap();
 96
 97    let usage = db.get_usage(user_id, provider, model, now).await.unwrap();
 98    assert_eq!(
 99        usage,
100        Usage {
101            requests_this_minute: 1,
102            tokens_this_minute: 4000,
103            tokens_this_day: 9000,
104            tokens_this_month: 10000,
105        }
106    );
107
108    let t2 = t0 + Duration::days(30);
109    let now = t2;
110    let usage = db.get_usage(user_id, provider, model, now).await.unwrap();
111    assert_eq!(
112        usage,
113        Usage {
114            requests_this_minute: 0,
115            tokens_this_minute: 0,
116            tokens_this_day: 0,
117            tokens_this_month: 9000,
118        }
119    );
120}