Skip to main content

systemprompt_evaluation/models/
result.rs

1//! Per-case evaluation result model.
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::{Deserialize, Serialize};
8use serde_json::Value;
9use systemprompt_identifiers::{AiRequestId, EvalCaseId, EvalResultId, EvalRunId};
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(rename_all = "lowercase")]
13pub enum Verdict {
14    Pass,
15    Partial,
16    Fail,
17    Skipped,
18}
19
20impl Verdict {
21    #[must_use]
22    pub const fn as_str(self) -> &'static str {
23        match self {
24            Self::Pass => "pass",
25            Self::Partial => "partial",
26            Self::Fail => "fail",
27            Self::Skipped => "skipped",
28        }
29    }
30}
31
32impl std::str::FromStr for Verdict {
33    type Err = String;
34
35    fn from_str(s: &str) -> Result<Self, Self::Err> {
36        match s {
37            "pass" => Ok(Self::Pass),
38            "partial" => Ok(Self::Partial),
39            "fail" => Ok(Self::Fail),
40            "skipped" => Ok(Self::Skipped),
41            other => Err(format!("unknown verdict: {other}")),
42        }
43    }
44}
45
46#[derive(Debug, Clone)]
47pub struct EvalResult {
48    pub id: EvalResultId,
49    pub run_id: EvalRunId,
50    pub ai_request_id: Option<AiRequestId>,
51    pub case_id: Option<EvalCaseId>,
52    pub provider: String,
53    pub model: String,
54    pub overall_score: Option<i32>,
55    pub dimension_scores: Value,
56    pub verdict: Verdict,
57    pub rationale: Option<String>,
58    pub repair_hint: Option<String>,
59    pub prompt_excerpt: Option<String>,
60    pub response_excerpt: Option<String>,
61    pub latency_ms: Option<i32>,
62    pub cost_microdollars: i64,
63    pub judge_cost_microdollars: i64,
64    pub created_at: DateTime<Utc>,
65    pub repaired: bool,
66    pub replay_of_result_id: Option<EvalResultId>,
67    pub judge_ai_request_id: Option<AiRequestId>,
68}
69
70#[derive(Debug, Clone)]
71pub struct NewResultParams {
72    pub run_id: EvalRunId,
73    pub ai_request_id: Option<AiRequestId>,
74    pub case_id: Option<EvalCaseId>,
75    pub provider: String,
76    pub model: String,
77    pub overall_score: Option<i32>,
78    pub dimension_scores: Value,
79    pub verdict: Verdict,
80    pub rationale: Option<String>,
81    pub repair_hint: Option<String>,
82    pub prompt_excerpt: Option<String>,
83    pub response_excerpt: Option<String>,
84    pub judge_cost_microdollars: i64,
85    pub repaired: bool,
86    pub replay_of_result_id: Option<EvalResultId>,
87    pub judge_ai_request_id: Option<AiRequestId>,
88}