diff --git a/crates/zclaw-saas/src/account/handlers.rs b/crates/zclaw-saas/src/account/handlers.rs index d36e25b..441eb47 100644 --- a/crates/zclaw-saas/src/account/handlers.rs +++ b/crates/zclaw-saas/src/account/handlers.rs @@ -194,8 +194,8 @@ pub async fn dashboard_stats( let today_row: DashboardTodayRow = sqlx::query_as( "SELECT (SELECT COUNT(*) FROM relay_tasks WHERE created_at >= $1 AND created_at < $2) as tasks_today, - COALESCE((SELECT SUM(input_tokens) FROM usage_records WHERE created_at >= $1 AND created_at < $2), 0) as tokens_input, - COALESCE((SELECT SUM(output_tokens) FROM usage_records WHERE created_at >= $1 AND created_at < $2), 0) as tokens_output" + COALESCE((SELECT SUM(input_tokens) FROM usage_records WHERE created_at >= $1 AND created_at < $2), 0)::bigint as tokens_input, + COALESCE((SELECT SUM(output_tokens) FROM usage_records WHERE created_at >= $1 AND created_at < $2), 0)::bigint as tokens_output" ).bind(&today_start).bind(&tomorrow_start).fetch_one(&state.db).await?; Ok(Json(serde_json::json!({ diff --git a/crates/zclaw-saas/src/relay/key_pool.rs b/crates/zclaw-saas/src/relay/key_pool.rs index 7942f69..4f6267a 100644 --- a/crates/zclaw-saas/src/relay/key_pool.rs +++ b/crates/zclaw-saas/src/relay/key_pool.rs @@ -83,7 +83,7 @@ pub async fn select_best_key(db: &PgPool, provider_id: &str, enc_key: &[u8; 32]) sqlx::query_as( "SELECT pk.id, pk.key_value, pk.priority, pk.max_rpm, pk.max_tpm, COALESCE(SUM(uw.request_count), 0)::bigint, - COALESCE(SUM(uw.token_count), 0) + COALESCE(SUM(uw.token_count), 0)::bigint FROM provider_keys pk LEFT JOIN key_usage_window uw ON pk.id = uw.key_id AND uw.window_minute >= to_char(NOW() - INTERVAL '1 minute', 'YYYY-MM-DDTHH24:MI') diff --git a/crates/zclaw-saas/src/relay/service.rs b/crates/zclaw-saas/src/relay/service.rs index bf0f92f..f59151a 100644 --- a/crates/zclaw-saas/src/relay/service.rs +++ b/crates/zclaw-saas/src/relay/service.rs @@ -648,7 +648,7 @@ pub async fn sort_candidates_by_quota( let quota_rows: Vec<(String, i64)> = match sqlx::query_as( r#" SELECT pk.provider_id, - SUM(COALESCE(pk.max_rpm, 999999) - COALESCE(uw.request_count, 0)) AS remaining_rpm + SUM(COALESCE(pk.max_rpm, 999999) - COALESCE(uw.request_count, 0))::bigint AS remaining_rpm FROM provider_keys pk LEFT JOIN key_usage_window uw ON pk.id = uw.key_id AND uw.window_minute >= to_char(NOW() - INTERVAL '1 minute', 'YYYY-MM-DDTHH24:MI') diff --git a/crates/zclaw-saas/src/workers/aggregate_usage.rs b/crates/zclaw-saas/src/workers/aggregate_usage.rs index 616e34e..c8ba1d1 100644 --- a/crates/zclaw-saas/src/workers/aggregate_usage.rs +++ b/crates/zclaw-saas/src/workers/aggregate_usage.rs @@ -56,8 +56,8 @@ async fn aggregate_single_account(db: &PgPool, account_id: &str) -> SaasResult<( .with_nanosecond(0).unwrap_or(now); let aggregated: Option<(i64, i64, i64)> = sqlx::query_as( - "SELECT COALESCE(SUM(input_tokens), 0), \ - COALESCE(SUM(output_tokens), 0), \ + "SELECT COALESCE(SUM(input_tokens), 0)::bigint, \ + COALESCE(SUM(output_tokens), 0)::bigint, \ COUNT(*) \ FROM usage_records \ WHERE account_id = $1 AND created_at >= $2 AND status = 'success'"