1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum ExportStatus {
9 Draft,
10 InProgress,
11 Success,
12 Failed,
13 Stopped,
14}
15
16#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
18#[serde(rename_all = "snake_case")]
19pub enum LogExportField {
20 Id,
21 TraceId,
22 CreatedAt,
23 Request,
24 Response,
25 IsSuccess,
26 AiOrg,
27 AiModel,
28 ReqUnits,
29 ResUnits,
30 TotalUnits,
31 RequestUrl,
32 Cost,
33 CostCurrency,
34 ResponseTime,
35 ResponseStatusCode,
36 Mode,
37 Config,
38 PromptSlug,
39 Metadata,
40}
41
42#[derive(Debug, Clone, Default, Serialize, Deserialize)]
44pub struct GenerationsFilter {
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub time_of_generation_min: Option<String>,
47
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub time_of_generation_max: Option<String>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub total_units_min: Option<i32>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub total_units_max: Option<i32>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub cost_min: Option<f64>,
59
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub cost_max: Option<f64>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub ai_model: Option<String>,
65
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub prompt_token_min: Option<i32>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub prompt_token_max: Option<i32>,
71
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub completion_token_min: Option<i32>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
76 pub completion_token_max: Option<i32>,
77
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub status_code: Option<String>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub metadata: Option<HashMap<String, serde_json::Value>>,
83
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub ai_org_model: Option<String>,
86
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub weighted_feedback_min: Option<f64>,
89
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub weighted_feedback_max: Option<f64>,
92
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub virtual_keys: Option<String>,
95
96 #[serde(skip_serializing_if = "Option::is_none")]
97 pub trace_id: Option<String>,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
100 pub configs: Option<String>,
101
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub workspace_slug: Option<String>,
104
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub prompt_slug: Option<String>,
107
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub page_size: Option<i32>,
111
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub current_page: Option<i32>,
115}
116
117#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct CreateLogExportRequest {
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub workspace_id: Option<String>,
123
124 pub filters: GenerationsFilter,
126
127 pub requested_data: Vec<LogExportField>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub description: Option<String>,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct CreateLogExportResponse {
138 pub id: String,
140
141 pub total: i32,
143
144 pub object: String,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize)]
150pub struct LogExport {
151 pub id: String,
153
154 pub organisation_id: String,
156
157 pub filters: GenerationsFilter,
159
160 pub requested_data: Vec<LogExportField>,
162
163 pub status: ExportStatus,
165
166 pub description: String,
168
169 pub created_at: String,
171
172 pub last_updated_at: String,
174
175 pub created_by: String,
177
178 pub workspace_id: String,
180
181 pub object: String,
183}
184
185#[derive(Debug, Clone, Serialize, Deserialize)]
187pub struct ExportTaskResponse {
188 pub message: String,
190
191 pub object: String,
193}
194
195#[derive(Debug, Clone, Serialize, Deserialize)]
197pub struct DownloadLogExportResponse {
198 pub signed_url: String,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
204pub struct LogRequest {
205 pub url: String,
207
208 #[serde(skip_serializing_if = "Option::is_none")]
210 pub method: Option<String>,
211
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub headers: Option<HashMap<String, String>>,
215
216 pub body: serde_json::Value,
218}
219
220#[derive(Debug, Clone, Serialize, Deserialize)]
222pub struct LogResponse {
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub status: Option<i32>,
226
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub headers: Option<HashMap<String, String>>,
230
231 pub body: serde_json::Value,
233
234 #[serde(skip_serializing_if = "Option::is_none")]
236 pub response_time: Option<i32>,
237}
238
239#[derive(Debug, Clone, Default, Serialize, Deserialize)]
241pub struct LogMetadata {
242 #[serde(skip_serializing_if = "Option::is_none")]
244 pub trace_id: Option<String>,
245
246 #[serde(skip_serializing_if = "Option::is_none")]
248 pub span_id: Option<String>,
249
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub span_name: Option<String>,
253
254 #[serde(flatten)]
256 pub additional: HashMap<String, serde_json::Value>,
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize)]
261pub struct CustomLog {
262 pub request: LogRequest,
264
265 pub response: LogResponse,
267
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub metadata: Option<LogMetadata>,
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize)]
275#[serde(untagged)]
276pub enum InsertLogRequest {
277 Single(Box<CustomLog>),
279 Multiple(Vec<CustomLog>),
281}
282
283#[derive(Debug, Clone, Serialize, Deserialize)]
285pub struct InsertLogResponse {
286 pub status: String,
288
289 #[serde(skip_serializing_if = "Option::is_none")]
291 pub log_ids: Option<Vec<String>>,
292}
293
294#[derive(Debug, Clone, Serialize, Deserialize)]
296pub struct UpdateLogExportRequest {
297 #[serde(skip_serializing_if = "Option::is_none")]
299 pub workspace_id: Option<String>,
300
301 pub filters: GenerationsFilter,
303
304 #[serde(skip_serializing_if = "Option::is_none")]
306 pub requested_data: Option<Vec<LogExportField>>,
307}
308
309#[derive(Debug, Clone, Serialize, Deserialize)]
311pub struct UpdateLogExportResponse {
312 pub id: String,
314
315 pub total: i32,
317
318 pub object: String,
320}
321
322#[derive(Debug, Clone, Default, Serialize, Deserialize)]
328pub struct ListLogExportsParams {
329 #[serde(skip_serializing_if = "Option::is_none")]
331 pub workspace_id: Option<String>,
332}
333
334#[derive(Debug, Clone, Serialize, Deserialize)]
336pub struct LogExportListItem {
337 pub id: String,
339
340 pub organisation_id: String,
342
343 pub filters: GenerationsFilter,
345
346 pub requested_data: Vec<LogExportField>,
348
349 pub status: ExportStatus,
351
352 pub description: String,
354
355 pub created_at: String,
357
358 pub last_updated_at: String,
360
361 pub created_by: String,
363
364 pub workspace_id: String,
366
367 pub object: String,
369}
370
371#[derive(Debug, Clone, Serialize, Deserialize)]
373pub struct ListLogExportsResponse {
374 pub object: String,
376
377 pub total: i32,
379
380 pub data: Vec<LogExportListItem>,
382}