use serde::{Deserialize, Serialize};
use crate::EvalScope;
use crate::catalog::SnapshotRef;
use crate::evaluator::CaseEvaluator;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AnalysisState {
Queued,
Running,
Succeeded,
Failed,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct AnalysisTask {
pub id: String,
pub scope: EvalScope,
pub run_id: String,
pub case_run_id: String,
#[serde(rename = "snapshotRef")]
pub snapshot_ref: SnapshotRef,
pub case_id: String,
pub evaluator: CaseEvaluator,
pub revision: u32,
pub state: AnalysisState,
pub attempt: u32,
pub fencing_token: i64,
pub created_at_ms: i64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ClaimAnalysisRequest {
#[serde(default = "default_lease_ms")]
pub lease_ms: i64,
#[serde(default = "default_batch")]
pub max_tasks: usize,
}
fn default_lease_ms() -> i64 {
120_000
}
fn default_batch() -> usize {
1
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ClaimAnalysisResponse {
pub tasks: Vec<AnalysisTask>,
pub lease_until_ms: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct JudgeVote {
pub model_ref: String,
pub score: f64,
#[serde(default)]
pub cost_micros: u64,
#[serde(default)]
pub detail: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct JudgeEvidence {
pub votes: Vec<JudgeVote>,
#[serde(default)]
pub attestation: String,
#[serde(default)]
pub budget_exhausted: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct PluginEvidence {
pub plugin_ref: String,
pub passed: bool,
#[serde(default)]
pub detail: String,
#[serde(default)]
pub cost_micros: u64,
#[serde(default)]
pub attestation: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum AnalysisOutcome {
Judge(JudgeEvidence),
Plugin(PluginEvidence),
Failed {
error: String,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct SubmitAnalysisRequest {
pub task_id: String,
pub fencing_token: i64,
pub outcome: AnalysisOutcome,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct SubmitAnalysisResponse {
pub accepted: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct RerunAnalysisRequest {
pub run_id: String,
#[serde(default)]
pub case_run_ids: Vec<String>,
#[serde(default)]
pub evaluators: Vec<CaseEvaluator>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RerunAnalysisResponse {
pub revision: u32,
pub scheduled_tasks: usize,
}