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
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6use systemprompt_identifiers::{AiRequestId, TraceId};
7
8#[derive(Debug, Clone)]
9pub struct AiRequestFilter {
10    pub limit: i64,
11    pub since: Option<DateTime<Utc>>,
12    pub model: Option<String>,
13    pub provider: Option<String>,
14}
15
16impl AiRequestFilter {
17    pub const fn new(limit: i64) -> Self {
18        Self {
19            limit,
20            since: None,
21            model: None,
22            provider: None,
23        }
24    }
25
26    pub const fn with_since(mut self, since: DateTime<Utc>) -> Self {
27        self.since = Some(since);
28        self
29    }
30
31    systemprompt_models::builder_methods! {
32        with_model(model) -> String,
33        with_provider(provider) -> String,
34    }
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct AiRequestListItem {
39    pub id: AiRequestId,
40    pub created_at: DateTime<Utc>,
41    pub trace_id: Option<TraceId>,
42    pub provider: String,
43    pub model: String,
44    pub input_tokens: Option<i32>,
45    pub output_tokens: Option<i32>,
46    pub cost_microdollars: i64,
47    pub latency_ms: Option<i32>,
48    pub status: String,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct AiRequestDetail {
53    pub id: AiRequestId,
54    pub provider: String,
55    pub model: String,
56    pub input_tokens: Option<i32>,
57    pub output_tokens: Option<i32>,
58    pub cost_microdollars: i64,
59    pub latency_ms: Option<i32>,
60    pub status: String,
61    pub error_message: Option<String>,
62}
63
64#[derive(Debug, Clone, Default, Serialize, Deserialize)]
65pub struct AiRequestStats {
66    pub total_requests: i64,
67    pub total_input_tokens: i64,
68    pub total_output_tokens: i64,
69    pub total_cost_microdollars: i64,
70    pub avg_latency_ms: i64,
71    pub by_provider: Vec<ProviderStatsRow>,
72    pub by_model: Vec<ModelStatsRow>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct ProviderStatsRow {
77    pub provider: String,
78    pub request_count: i64,
79    pub total_tokens: i64,
80    pub total_cost_microdollars: i64,
81    pub avg_latency_ms: i64,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct ModelStatsRow {
86    pub model: String,
87    pub provider: String,
88    pub request_count: i64,
89    pub total_tokens: i64,
90    pub total_cost_microdollars: i64,
91    pub avg_latency_ms: i64,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct AiRequestInfo {
96    pub id: AiRequestId,
97    pub provider: String,
98    pub model: String,
99    pub max_tokens: Option<i32>,
100    pub input_tokens: Option<i32>,
101    pub output_tokens: Option<i32>,
102    pub cost_microdollars: i64,
103    pub latency_ms: Option<i32>,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct ConversationMessage {
108    pub role: String,
109    pub content: String,
110    pub sequence_number: i32,
111}