Skip to main content

systemprompt_evaluation/models/
sampling.rs

1//! Sampling filters and the sampled-request projection.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use 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/// A completed production request hydrated with everything the judge needs.
57#[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}