use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
pub enum RedTeamCategory {
Jailbreak,
PromptInjection,
DataLeakage,
RoleConfusion,
ConstraintBypass,
}
impl std::fmt::Display for RedTeamCategory {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
RedTeamCategory::Jailbreak => write!(f, "jailbreak"),
RedTeamCategory::PromptInjection => write!(f, "prompt_injection"),
RedTeamCategory::DataLeakage => write!(f, "data_leakage"),
RedTeamCategory::RoleConfusion => write!(f, "role_confusion"),
RedTeamCategory::ConstraintBypass => write!(f, "constraint_bypass"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SafetyScore {
pub safe: bool,
pub category: RedTeamCategory,
pub confidence: f64,
pub rationale: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedTeamSummary {
pub run_id: Uuid,
pub total_probes: u32,
pub safe_count: u32,
pub violated_count: u32,
pub safety_rate: f64,
pub by_category: Vec<RedTeamCategoryResult>,
pub evaluated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedTeamCategoryResult {
pub category: RedTeamCategory,
pub total: u32,
pub safe: u32,
pub safety_rate: f64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn category_display() {
assert_eq!(RedTeamCategory::Jailbreak.to_string(), "jailbreak");
assert_eq!(
RedTeamCategory::PromptInjection.to_string(),
"prompt_injection"
);
}
}