1use serde::{Deserialize, Serialize};
9
10#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(rename_all = "lowercase")]
13pub enum ResetInterval {
14 Daily,
16 Weekly,
18 Monthly,
20}
21
22#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
25pub struct Guardrail {
26 #[serde(default)]
28 pub id: String,
29 #[serde(default)]
31 pub name: String,
32 #[serde(default)]
34 pub description: Option<String>,
35 #[serde(default)]
37 pub limit_usd: Option<f64>,
38 #[serde(default)]
40 pub reset_interval: Option<ResetInterval>,
41 #[serde(default)]
43 pub allowed_providers: Vec<String>,
44 #[serde(default)]
46 pub allowed_models: Vec<String>,
47 #[serde(default)]
49 pub enforce_zdr: Option<bool>,
50 #[serde(default)]
52 pub created_at: String,
53 #[serde(default)]
55 pub updated_at: Option<String>,
56}
57
58#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
61pub struct ListGuardrailsOptions {
62 pub offset: Option<u32>,
64 pub limit: Option<u32>,
66}
67
68impl ListGuardrailsOptions {
69 pub fn new() -> Self {
71 Self::default()
72 }
73
74 pub fn offset(mut self, offset: u32) -> Self {
76 self.offset = Some(offset);
77 self
78 }
79
80 pub fn limit(mut self, limit: u32) -> Self {
82 self.limit = Some(limit);
83 self
84 }
85
86 pub(crate) fn to_query(self) -> Vec<(&'static str, String)> {
87 let mut q = Vec::new();
88 if let Some(o) = self.offset {
89 q.push(("offset", o.to_string()));
90 }
91 if let Some(l) = self.limit {
92 q.push(("limit", l.to_string()));
93 }
94 q
95 }
96}
97
98#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
100pub struct ListGuardrailsResponse {
101 #[serde(default)]
103 pub data: Vec<Guardrail>,
104 #[serde(default)]
106 pub total_count: u64,
107}
108
109#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
111pub struct CreateGuardrailRequest {
112 pub name: String,
114 #[serde(skip_serializing_if = "Option::is_none", default)]
116 pub description: Option<String>,
117 #[serde(skip_serializing_if = "Option::is_none", default)]
119 pub limit_usd: Option<f64>,
120 #[serde(skip_serializing_if = "Option::is_none", default)]
122 pub reset_interval: Option<ResetInterval>,
123 #[serde(skip_serializing_if = "Vec::is_empty", default)]
125 pub allowed_providers: Vec<String>,
126 #[serde(skip_serializing_if = "Vec::is_empty", default)]
128 pub allowed_models: Vec<String>,
129 #[serde(skip_serializing_if = "Option::is_none", default)]
131 pub enforce_zdr: Option<bool>,
132}
133
134#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
137pub struct UpdateGuardrailRequest {
138 #[serde(skip_serializing_if = "Option::is_none", default)]
140 pub name: Option<String>,
141 #[serde(skip_serializing_if = "Option::is_none", default)]
143 pub description: Option<String>,
144 #[serde(skip_serializing_if = "Option::is_none", default)]
146 pub limit_usd: Option<f64>,
147 #[serde(skip_serializing_if = "Option::is_none", default)]
149 pub reset_interval: Option<ResetInterval>,
150 #[serde(skip_serializing_if = "Vec::is_empty", default)]
152 pub allowed_providers: Vec<String>,
153 #[serde(skip_serializing_if = "Vec::is_empty", default)]
155 pub allowed_models: Vec<String>,
156 #[serde(skip_serializing_if = "Option::is_none", default)]
158 pub enforce_zdr: Option<bool>,
159}
160
161#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
163pub struct DeleteGuardrailResponse {
164 #[serde(default)]
166 pub deleted: bool,
167}
168
169#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
171pub struct GuardrailKeyAssignment {
172 #[serde(default)]
174 pub id: String,
175 #[serde(default)]
177 pub key_hash: String,
178 #[serde(default)]
180 pub organization_id: String,
181 #[serde(default)]
183 pub guardrail_id: String,
184 #[serde(default)]
186 pub assigned_by: Option<String>,
187 #[serde(default)]
189 pub created_at: String,
190}
191
192#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
194pub struct ListGuardrailKeyAssignmentsResponse {
195 #[serde(default)]
197 pub data: Vec<GuardrailKeyAssignment>,
198 #[serde(default)]
200 pub total_count: u64,
201}
202
203#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
206pub struct AssignKeysRequest {
207 pub key_hashes: Vec<String>,
209}
210
211#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
213pub struct AssignKeysResponse {
214 #[serde(default)]
216 pub assigned_count: u64,
217}
218
219#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
221pub struct GuardrailMemberAssignment {
222 #[serde(default)]
224 pub id: String,
225 #[serde(default)]
227 pub user_id: String,
228 #[serde(default)]
230 pub organization_id: String,
231 #[serde(default)]
233 pub guardrail_id: String,
234 #[serde(default)]
236 pub assigned_by: Option<String>,
237 #[serde(default)]
239 pub created_at: String,
240}
241
242#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
244pub struct ListGuardrailMemberAssignmentsResponse {
245 #[serde(default)]
247 pub data: Vec<GuardrailMemberAssignment>,
248 #[serde(default)]
250 pub total_count: u64,
251}
252
253#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
256pub struct AssignMembersRequest {
257 pub member_user_ids: Vec<String>,
259}
260
261#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
263pub struct AssignMembersResponse {
264 #[serde(default)]
266 pub assigned_count: u64,
267}
268
269#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize)]
273pub struct PercentileStats {
274 #[serde(default)]
276 pub p50: f64,
277 #[serde(default)]
279 pub p75: f64,
280 #[serde(default)]
282 pub p90: f64,
283 #[serde(default)]
285 pub p99: f64,
286}
287
288#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
290pub struct PublicEndpointPricing {
291 #[serde(default)]
293 pub prompt: String,
294 #[serde(default)]
296 pub completion: String,
297 #[serde(default, skip_serializing_if = "String::is_empty")]
299 pub request: String,
300 #[serde(default, skip_serializing_if = "String::is_empty")]
302 pub image: String,
303 #[serde(default, skip_serializing_if = "String::is_empty")]
305 pub image_token: String,
306 #[serde(default, skip_serializing_if = "String::is_empty")]
308 pub image_output: String,
309 #[serde(default, skip_serializing_if = "String::is_empty")]
311 pub audio: String,
312 #[serde(default, skip_serializing_if = "String::is_empty")]
314 pub audio_output: String,
315 #[serde(default, skip_serializing_if = "String::is_empty")]
317 pub input_audio_cache: String,
318 #[serde(default, skip_serializing_if = "String::is_empty")]
320 pub web_search: String,
321 #[serde(default, skip_serializing_if = "String::is_empty")]
323 pub internal_reasoning: String,
324 #[serde(default, skip_serializing_if = "String::is_empty")]
326 pub input_cache_read: String,
327 #[serde(default, skip_serializing_if = "String::is_empty")]
329 pub input_cache_write: String,
330 #[serde(default)]
332 pub discount: f64,
333}
334
335#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
337pub struct PublicEndpoint {
338 #[serde(default)]
340 pub name: String,
341 #[serde(default)]
343 pub model_id: String,
344 #[serde(default)]
346 pub model_name: String,
347 #[serde(default)]
349 pub context_length: f64,
350 #[serde(default)]
352 pub pricing: PublicEndpointPricing,
353 #[serde(default)]
355 pub provider_name: String,
356 #[serde(default)]
358 pub tag: Option<String>,
359 #[serde(default)]
361 pub quantization: Option<String>,
362 #[serde(default)]
364 pub max_completion_tokens: Option<f64>,
365 #[serde(default)]
367 pub max_prompt_tokens: Option<f64>,
368 #[serde(default)]
370 pub supported_parameters: Vec<String>,
371 #[serde(default)]
373 pub status: f64,
374 #[serde(default)]
376 pub uptime_last_30m: Option<f64>,
377 #[serde(default)]
379 pub supports_implicit_caching: Option<bool>,
380 #[serde(default)]
382 pub latency_last_30m: Option<PercentileStats>,
383 #[serde(default)]
385 pub throughput_last_30m: Option<PercentileStats>,
386}
387
388#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
390pub struct ZdrEndpointsResponse {
391 #[serde(default)]
393 pub data: Vec<PublicEndpoint>,
394}