pub const DEFAULT_REVIEWER_MODEL: &str = "us.anthropic.claude-sonnet-4-6";
pub const DEFAULT_VERIFIER_MODEL: &str = "us.anthropic.claude-haiku-4-5-20251001-v1:0";
pub const DEFAULT_SUMMARIZER_MODEL: &str = "us.anthropic.claude-haiku-4-5-20251001-v1:0";
pub const COMPARE_CANDIDATE_MODELS: &[&str] = &[
"bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0",
"bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0",
"bedrock/us.anthropic.claude-sonnet-4-6",
];
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bedrock_defaults_have_inference_profile_prefix() {
let prefixes = ["us.", "eu.", "ap.", "jp.", "global."];
for id in [
DEFAULT_REVIEWER_MODEL,
DEFAULT_VERIFIER_MODEL,
DEFAULT_SUMMARIZER_MODEL,
] {
let has_prefix = prefixes.iter().any(|p| id.starts_with(p));
assert!(
has_prefix,
"default model {id:?} must start with a cross-region inference-profile prefix"
);
}
}
#[test]
fn default_reviewer_is_sonnet() {
assert!(
DEFAULT_REVIEWER_MODEL.contains("sonnet"),
"reviewer default should be Sonnet-tier: {DEFAULT_REVIEWER_MODEL}"
);
}
#[test]
fn default_verifier_and_summarizer_are_haiku() {
for (name, id) in [
("verifier", DEFAULT_VERIFIER_MODEL),
("summarizer", DEFAULT_SUMMARIZER_MODEL),
] {
assert!(
id.contains("haiku"),
"{name} default should be Haiku-tier: {id}"
);
}
}
#[test]
fn compare_set_models_are_bedrock_only() {
let all_bedrock = COMPARE_CANDIDATE_MODELS
.iter()
.all(|m| m.starts_with("bedrock/"));
assert!(
all_bedrock,
"default compare set must be Bedrock-only (all entries bedrock/-prefixed)"
);
assert_eq!(
COMPARE_CANDIDATE_MODELS.len(),
3,
"expect haiku-4.5, sonnet-4.5, sonnet-4.6"
);
}
#[test]
fn compare_set_contains_sonnet_4_5() {
const EXPECTED_SONNET_4_5: &str = "bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0";
assert!(
COMPARE_CANDIDATE_MODELS.contains(&EXPECTED_SONNET_4_5),
"compare set must include the confirmed Sonnet 4.5 id {EXPECTED_SONNET_4_5}"
);
}
#[test]
fn compare_set_excludes_opus() {
let has_opus = COMPARE_CANDIDATE_MODELS.iter().any(|m| m.contains("opus"));
assert!(
!has_opus,
"default compare set must not contain Opus (not access-granted in target account)"
);
}
#[test]
fn haiku_default_has_correct_date_versioned_id() {
const EXPECTED_HAIKU: &str = "us.anthropic.claude-haiku-4-5-20251001-v1:0";
assert_eq!(
DEFAULT_VERIFIER_MODEL, EXPECTED_HAIKU,
"DEFAULT_VERIFIER_MODEL must use the date-versioned Haiku 4.5 id"
);
assert_eq!(
DEFAULT_SUMMARIZER_MODEL, EXPECTED_HAIKU,
"DEFAULT_SUMMARIZER_MODEL must use the date-versioned Haiku 4.5 id"
);
let compare_has_haiku = COMPARE_CANDIDATE_MODELS
.iter()
.any(|m| m.contains(EXPECTED_HAIKU));
assert!(
compare_has_haiku,
"compare set must include the verified Haiku id {EXPECTED_HAIKU}"
);
}
#[test]
fn compare_set_is_ordered_cheap_to_premium() {
let pos = |needle: &str| -> usize {
COMPARE_CANDIDATE_MODELS
.iter()
.position(|m| m.contains(needle))
.unwrap_or(usize::MAX)
};
assert!(
pos("haiku") < pos("sonnet"),
"haiku must come before sonnet in compare set"
);
let pos_s45 = COMPARE_CANDIDATE_MODELS
.iter()
.position(|m| m.contains("sonnet-4-5"))
.unwrap_or(usize::MAX);
let pos_s46 = COMPARE_CANDIDATE_MODELS
.iter()
.position(|m| m.contains("sonnet-4-6"))
.unwrap_or(usize::MAX);
assert!(
pos_s45 < pos_s46,
"sonnet-4-5 must come before sonnet-4-6 in compare set"
);
}
#[test]
fn compare_set_reviewer_default_is_present() {
let expected = format!("bedrock/{DEFAULT_REVIEWER_MODEL}");
assert!(
COMPARE_CANDIDATE_MODELS.contains(&expected.as_str()),
"compare set must include {expected:?} (bedrock/-prefixed reviewer default)"
);
}
}