Skip to main content

systemprompt_logging/trace/models/
ai.rs

1//! AI request DTOs: filters, list views, detail rows, aggregate stats, and
2//! conversation messages.
3//!
4//! Copyright (c) systemprompt.io — Business Source License 1.1.
5//! See <https://systemprompt.io> for licensing details.
6
7use chrono::{DateTime, Utc};
8use serde::{Deserialize, Serialize};
9use systemprompt_identifiers::{AiRequestId, TraceId, UserId};
10
11#[derive(Debug, Clone)]
12pub struct AiRequestFilter {
13    pub limit: i64,
14    pub since: Option<DateTime<Utc>>,
15    pub model: Option<String>,
16    pub provider: Option<String>,
17    pub user: Option<String>,
18}
19
20impl AiRequestFilter {
21    pub const fn new(limit: i64) -> Self {
22        Self {
23            limit,
24            since: None,
25            model: None,
26            provider: None,
27            user: None,
28        }
29    }
30
31    pub const fn with_since(mut self, since: DateTime<Utc>) -> Self {
32        self.since = Some(since);
33        self
34    }
35
36    systemprompt_models::builder_methods! {
37        with_model(model) -> String,
38        with_provider(provider) -> String,
39        with_user(user) -> String,
40    }
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct AiRequestListItem {
45    pub id: AiRequestId,
46    pub created_at: DateTime<Utc>,
47    pub trace_id: Option<TraceId>,
48    pub user_id: UserId,
49    pub actor_kind: String,
50    pub actor_id: String,
51    /// `None` for a request rejected before routing resolved a provider.
52    pub provider: Option<String>,
53    /// `None` for a request rejected before a model was read.
54    pub model: Option<String>,
55    pub input_tokens: Option<i32>,
56    pub output_tokens: Option<i32>,
57    pub cache_read_tokens: Option<i32>,
58    pub cache_creation_tokens: Option<i32>,
59    pub cost_microdollars: i64,
60    pub latency_ms: Option<i32>,
61    pub status: String,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct AiRequestDetail {
66    pub id: AiRequestId,
67    pub user_id: UserId,
68    pub actor_kind: String,
69    pub actor_id: String,
70    /// `None` for a request rejected before routing resolved a provider.
71    pub provider: Option<String>,
72    /// `None` for a request rejected before a model was read.
73    pub model: Option<String>,
74    pub input_tokens: Option<i32>,
75    pub output_tokens: Option<i32>,
76    pub cost_microdollars: i64,
77    pub latency_ms: Option<i32>,
78    pub status: String,
79    pub error_message: Option<String>,
80}
81
82#[derive(Debug, Clone, Default, Serialize, Deserialize)]
83pub struct AiRequestStats {
84    pub total_requests: i64,
85    pub total_input_tokens: i64,
86    pub total_output_tokens: i64,
87    pub total_cost_microdollars: i64,
88    pub avg_latency_ms: i64,
89    pub by_provider: Vec<ProviderStatsRow>,
90    pub by_model: Vec<ModelStatsRow>,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct ProviderStatsRow {
95    pub provider: String,
96    pub request_count: i64,
97    pub total_tokens: i64,
98    pub total_cost_microdollars: i64,
99    pub avg_latency_ms: i64,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct ModelStatsRow {
104    pub model: String,
105    pub provider: String,
106    pub request_count: i64,
107    pub total_tokens: i64,
108    pub total_cost_microdollars: i64,
109    pub avg_latency_ms: i64,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct AiRequestInfo {
114    pub id: AiRequestId,
115    /// `None` for a request rejected before routing resolved a provider.
116    pub provider: Option<String>,
117    /// `None` for a request rejected before a model was read.
118    pub model: Option<String>,
119    pub max_tokens: Option<i32>,
120    pub input_tokens: Option<i32>,
121    pub output_tokens: Option<i32>,
122    pub cost_microdollars: i64,
123    pub latency_ms: Option<i32>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct ConversationMessage {
128    pub role: String,
129    pub content: String,
130    pub sequence_number: i32,
131}