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