use crate::wire::{BenchAgenticSourceInput, ClientStatus, EvalDefinitionInput, ProtocolVersion};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MeasurementDataAssetPreparationRequest {
pub protocol_version: ProtocolVersion,
pub phase: MeasurementDataAssetPreparationPhase,
pub source: MeasurementDataAssetSourceInput,
pub artifact_dir: PathBuf,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum MeasurementDataAssetPreparationPhase {
Resolve,
SnapshotLocal,
Acquire {
resolved_revision: String,
cache_state_before: MeasurementDataAssetCacheOutcome,
},
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MeasurementDataAssetPreparationNextPhase {
SnapshotLocal,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum MeasurementDataAssetSourceInput {
Eval {
workspace_root: PathBuf,
#[serde(default)]
workspace_source_exclusions: Vec<PathBuf>,
definition: Box<EvalDefinitionInput>,
},
Agentic {
source: Box<BenchAgenticSourceInput>,
},
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(transparent)]
pub struct MeasurementDataFiles(pub BTreeMap<String, Vec<String>>);
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum MeasurementDataAssetEffectiveSelection {
Eval {
task_identity: String,
#[serde(default)]
dataset_path: Option<String>,
#[serde(default)]
dataset_name: Option<String>,
#[serde(default)]
evaluation_split: Option<String>,
#[serde(default)]
fewshot_split: Option<String>,
#[serde(default)]
data_files: Option<MeasurementDataFiles>,
},
Agentic {
repository: String,
requested_revision: String,
#[serde(default)]
observed_revision: Option<String>,
filename: String,
},
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MeasurementDataAssetContentEntry {
pub relative_path: String,
pub sha256: String,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MeasurementDataAssetVerification {
pub subject: String,
pub expected: String,
#[serde(default)]
pub observed: Option<String>,
pub matched: bool,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum MeasurementDataAssetAcquiredSource {
ReleaseQualified {
identity: String,
closure: Vec<MeasurementDataAssetContentEntry>,
},
LocalFileClosure {
source_root: PathBuf,
files: Vec<MeasurementDataAssetContentEntry>,
},
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct EvalPreparedSourceBinding {
pub workspace_root: PathBuf,
pub task_path: PathBuf,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum MeasurementDataAssetReadiness {
Closed {
acquired_source: Box<MeasurementDataAssetAcquiredSource>,
#[serde(default)]
verification: Vec<MeasurementDataAssetVerification>,
#[serde(default, skip_serializing_if = "Option::is_none")]
eval_binding: Option<Box<EvalPreparedSourceBinding>>,
},
Opaque {
reason: String,
#[serde(default)]
unresolved_path: Option<PathBuf>,
deferred_source_access: bool,
},
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MeasurementDataAssetCacheOutcome {
FullHit,
Miss,
PartialReuse,
Unavailable,
}
#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MeasurementDataAssetCacheStore {
pub authority: String,
pub purpose: String,
#[serde(default)]
pub path: Option<PathBuf>,
pub outcome: MeasurementDataAssetCacheOutcome,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MeasurementDataAssetRemoteMetadataOutcome {
NotAccessed,
Accessed,
Unavailable,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MeasurementDataAssetSourceBytesOutcome {
NotAccessed,
Reused,
Downloaded,
Unavailable,
}
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MeasurementDataAssetPreparationResult {
pub schema_version: u32,
pub status: ClientStatus,
#[serde(default)]
pub effective_selection: Option<MeasurementDataAssetEffectiveSelection>,
#[serde(default)]
pub readiness: Option<MeasurementDataAssetReadiness>,
#[serde(default)]
pub next_phase: Option<MeasurementDataAssetPreparationNextPhase>,
#[serde(default)]
pub cache_stores: Vec<MeasurementDataAssetCacheStore>,
pub remote_metadata: MeasurementDataAssetRemoteMetadataOutcome,
pub source_bytes: MeasurementDataAssetSourceBytesOutcome,
#[serde(default)]
pub error: Option<String>,
}