use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::{ManagementClient, Result};
#[derive(Debug, Clone, Default, Serialize)]
pub struct UsageQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageResponse {
pub from: DateTime<Utc>,
pub to: DateTime<Utc>,
pub spend_micro_usd: i64,
pub prompt_tokens: i64,
pub completion_tokens: i64,
pub request_count: i64,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct RequestsQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestsResponse {
pub data: Vec<RequestEnvelope>,
pub limit: u64,
pub offset: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestEnvelope {
pub id: String,
pub request_id: String,
pub status: String,
#[serde(default)]
pub model_id: Option<String>,
#[serde(default)]
pub provider_id: Option<String>,
pub prompt_tokens: i64,
pub completion_tokens: i64,
#[serde(default)]
pub final_charge_micro_usd: Option<i64>,
#[serde(default)]
pub funding_source: Option<String>,
#[serde(default)]
pub streamed: Option<bool>,
pub created_at: DateTime<Utc>,
#[serde(default)]
pub completed_at: Option<DateTime<Utc>>,
}
impl ManagementClient {
pub async fn usage_aggregate(&self, query: &UsageQuery) -> Result<UsageResponse> {
let path = self.namespaced("/usage")?;
self.get_with_query(&path, query).await
}
pub async fn list_requests(&self, query: &RequestsQuery) -> Result<RequestsResponse> {
let path = self.namespaced("/requests")?;
self.get_with_query(&path, query).await
}
}