Skip to main content

systemprompt_models/api/cloud/
usage.rs

1//! Cloud usage and conversation-analytics DTOs surfaced in bridge profile
2//! reports.
3
4use serde::{Deserialize, Serialize};
5use systemprompt_identifiers::ContextId;
6
7#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
8pub struct UsageWindow {
9    pub requests: i64,
10    pub tokens: i64,
11    pub cost_microdollars: i64,
12    #[serde(default, skip_serializing_if = "Option::is_none")]
13    pub previous_cost_microdollars: Option<i64>,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct ModelShare {
18    pub model: String,
19    pub requests: i64,
20    pub tokens: i64,
21    pub cost_microdollars: i64,
22    pub token_share: f64,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct ConversationGroup {
27    pub name: String,
28    pub conversations: i64,
29    pub ai_requests: i64,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct RecentConversationSummary {
34    pub context_id: ContextId,
35    pub last_activity: chrono::DateTime<chrono::Utc>,
36    pub ai_requests: i64,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub model: Option<String>,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub agent_name: Option<String>,
41}
42
43#[derive(Debug, Clone, Default, Serialize, Deserialize)]
44pub struct ConversationSummary {
45    pub total_conversations: i64,
46    pub total_ai_requests: i64,
47    #[serde(default)]
48    pub by_model: Vec<ConversationGroup>,
49    #[serde(default)]
50    pub by_agent: Vec<ConversationGroup>,
51    #[serde(default)]
52    pub recent: Vec<RecentConversationSummary>,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct BridgeProfileUsage {
57    pub d1: UsageWindow,
58    pub d7: UsageWindow,
59    pub d30: UsageWindow,
60    #[serde(default)]
61    pub top_models: Vec<ModelShare>,
62    #[serde(default)]
63    pub conversations: ConversationSummary,
64}