use serde::{Deserialize, Serialize};
use agent_sdk_core::{EntityRef, RunId, SessionId, TurnId};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(tag = "scope", rename_all = "snake_case")]
pub enum EvaluationScope {
Run {
run_id: RunId,
},
Turn {
session_id: Option<SessionId>,
turn_id: TurnId,
},
Session {
session_id: SessionId,
},
Custom {
scope_ref: EntityRef,
},
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EvaluationSubjectRole {
Primary,
CandidateEvidence,
Baseline,
Comparator,
Constraint,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct EvaluationSubject {
pub subject_ref: EntityRef,
pub role: EvaluationSubjectRole,
pub redacted_summary: Option<String>,
}
impl EvaluationSubject {
pub fn primary(subject_ref: EntityRef) -> Self {
Self {
subject_ref,
role: EvaluationSubjectRole::Primary,
redacted_summary: None,
}
}
pub fn with_redacted_summary(mut self, redacted_summary: impl Into<String>) -> Self {
self.redacted_summary = Some(redacted_summary.into());
self
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct EvaluationCriterion {
pub criterion_id: String,
pub redacted_summary: String,
pub weight: Option<String>,
}
impl EvaluationCriterion {
pub fn new(criterion_id: impl Into<String>, redacted_summary: impl Into<String>) -> Self {
Self {
criterion_id: criterion_id.into(),
redacted_summary: redacted_summary.into(),
weight: None,
}
}
pub fn with_weight(mut self, weight: impl Into<String>) -> Self {
self.weight = Some(weight.into());
self
}
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct ExpectedOutcome {
pub outcome_ref: Option<EntityRef>,
pub criteria: Vec<EvaluationCriterion>,
pub redacted_summary: String,
}
impl ExpectedOutcome {
pub fn new(redacted_summary: impl Into<String>) -> Self {
Self {
outcome_ref: None,
criteria: Vec::new(),
redacted_summary: redacted_summary.into(),
}
}
pub fn completed() -> Self {
Self::new("agent completed the requested task").with_criterion(EvaluationCriterion::new(
"criterion.completed",
"run completed",
))
}
pub fn with_outcome_ref(mut self, outcome_ref: EntityRef) -> Self {
self.outcome_ref = Some(outcome_ref);
self
}
pub fn with_criterion(mut self, criterion: EvaluationCriterion) -> Self {
self.criteria.push(criterion);
self
}
}