systemprompt_logging/trace/models/
ai.rs1use 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 pub provider: Option<String>,
52 pub model: Option<String>,
53 pub input_tokens: Option<i32>,
54 pub output_tokens: Option<i32>,
55 pub cache_read_tokens: Option<i32>,
56 pub cache_creation_tokens: Option<i32>,
57 pub reasoning_tokens: Option<i32>,
58 pub cost_microdollars: i64,
59 pub latency_ms: Option<i32>,
60 pub status: String,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct AiRequestDetail {
65 pub id: AiRequestId,
66 pub user_id: UserId,
67 pub actor_kind: String,
68 pub actor_id: String,
69 pub provider: Option<String>,
70 pub model: Option<String>,
71 pub input_tokens: Option<i32>,
72 pub output_tokens: Option<i32>,
73 pub cost_microdollars: i64,
74 pub latency_ms: Option<i32>,
75 pub status: String,
76 pub error_message: Option<String>,
77}
78
79#[derive(Debug, Clone, Default, Serialize, Deserialize)]
80pub struct AiRequestStats {
81 pub total_requests: i64,
82 pub total_input_tokens: i64,
83 pub total_output_tokens: i64,
84 pub total_cost_microdollars: i64,
85 pub avg_latency_ms: i64,
86 pub by_provider: Vec<ProviderStatsRow>,
87 pub by_model: Vec<ModelStatsRow>,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct ProviderStatsRow {
92 pub provider: String,
93 pub request_count: i64,
94 pub total_tokens: i64,
95 pub total_cost_microdollars: i64,
96 pub avg_latency_ms: i64,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct ModelStatsRow {
101 pub model: String,
102 pub provider: String,
103 pub request_count: i64,
104 pub total_tokens: i64,
105 pub total_cost_microdollars: i64,
106 pub avg_latency_ms: i64,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct AiRequestInfo {
111 pub id: AiRequestId,
112 pub provider: Option<String>,
113 pub model: Option<String>,
114 pub max_tokens: Option<i32>,
115 pub input_tokens: Option<i32>,
116 pub output_tokens: Option<i32>,
117 pub cost_microdollars: i64,
118 pub latency_ms: Option<i32>,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct ConversationMessage {
123 pub role: String,
124 pub content: String,
125 pub sequence_number: i32,
126}