systemprompt_evaluation/models/
result.rs1use 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}