Skip to main content

systemprompt_models/api/cloud/
usage.rs

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