systemprompt_evaluation/models/
sampling.rs1use chrono::{DateTime, Utc};
7use serde_json::Value;
8use systemprompt_identifiers::AiRequestId;
9
10use super::case::{CanonicalMessage, CanonicalPrompt};
11
12#[derive(Debug, Clone, Default)]
13pub struct SampleFilter {
14 pub since: Option<DateTime<Utc>>,
15 pub until: Option<DateTime<Utc>>,
16 pub provider: Option<String>,
17 pub model: Option<String>,
18 pub ids: Option<Vec<String>>,
19 pub limit: i64,
20}
21
22impl SampleFilter {
23 #[must_use]
24 pub fn with_limit(limit: i64) -> Self {
25 Self {
26 limit,
27 ..Self::default()
28 }
29 }
30
31 #[must_use]
32 pub const fn since(mut self, since: DateTime<Utc>) -> Self {
33 self.since = Some(since);
34 self
35 }
36
37 #[must_use]
38 pub fn provider(mut self, provider: impl Into<String>) -> Self {
39 self.provider = Some(provider.into());
40 self
41 }
42
43 #[must_use]
44 pub fn model(mut self, model: impl Into<String>) -> Self {
45 self.model = Some(model.into());
46 self
47 }
48
49 #[must_use]
50 pub fn ids(mut self, ids: Vec<String>) -> Self {
51 self.ids = Some(ids);
52 self
53 }
54}
55
56#[derive(Debug, Clone)]
58pub struct SampledRequest {
59 pub ai_request_id: AiRequestId,
60 pub provider: String,
61 pub model: String,
62 pub system_prompt_override: Option<String>,
63 pub messages: Vec<CanonicalMessage>,
64 pub response_text: Option<String>,
65 pub offered_tools: Option<Value>,
66 pub prepared_body_sha256: Option<String>,
67 pub latency_ms: Option<i32>,
68 pub cost_microdollars: i64,
69 pub created_at: DateTime<Utc>,
70}
71
72impl SampledRequest {
73 #[must_use]
74 pub fn canonical_prompt(&self) -> CanonicalPrompt {
75 CanonicalPrompt {
76 messages: self.messages.clone(),
77 system_prompt: self.system_prompt_override.clone(),
78 offered_tools: self.offered_tools.clone(),
79 provider: self.provider.clone(),
80 model: self.model.clone(),
81 }
82 }
83}