#![allow(unused)]
use std::sync::OnceLock;
fn has_model(model_prefixes: &[&str], model_name: &str) -> bool {
model_prefixes.iter().any(|prefix| model_name.contains(prefix))
}
fn supports_anthropic_effort(model_name: &str) -> bool {
const SUPPORT_EFFORT_MODELS: &[&str] =
&["claude-opus-4-6", "claude-sonnet-4-6", "claude-opus-4-5", "claude-sonnet-5"];
has_model(SUPPORT_EFFORT_MODELS, model_name) || is_fable_or_mythos(model_name) || is_opus_4_7_or_higher(model_name)
}
fn supports_anthropic_reasoning_max(model_name: &str) -> bool {
const SUPPORT_REASONING_MAX_MODELS: &[&str] = &["claude-opus-4-6", "claude-sonnet-5"];
has_model(SUPPORT_REASONING_MAX_MODELS, model_name)
|| is_fable_or_mythos(model_name)
|| is_opus_4_7_or_higher(model_name)
}
fn supports_anthropic_reasoning_xhigh(model_name: &str) -> bool {
is_opus_4_7_or_higher(model_name) || is_fable_or_mythos(model_name) || model_name.contains("claude-sonnet-5")
}
fn anthropic_thinking_on_by_default(model_name: &str) -> bool {
model_name.contains("claude-sonnet-5") || model_name.contains("claude-opus-5")
}
fn supports_anthropic_adaptive_thinking(model_name: &str) -> bool {
const SUPPORT_ADAPTIVE_THINK_MODELS: &[&str] = &["claude-opus-4-6", "claude-sonnet-4-6", "claude-sonnet-5"];
has_model(SUPPORT_ADAPTIVE_THINK_MODELS, model_name)
|| is_fable_or_mythos(model_name)
|| is_opus_4_7_or_higher(model_name)
}
fn is_opus_4_7_or_higher(model_name: &str) -> bool {
const MAX_MINOR_DIGITS: usize = 2;
static RE: OnceLock<Option<regex::Regex>> = OnceLock::new();
let re = RE.get_or_init(|| regex::Regex::new(r"claude-opus-(\d+)(?:-(\d+))?").ok());
let Some(re) = re.as_ref() else {
return false;
};
let Some(caps) = re.captures(model_name) else {
return false;
};
let major = caps.get(1).and_then(|m| m.as_str().parse::<u32>().ok());
let minor = match caps.get(2) {
Some(m) if m.as_str().len() > MAX_MINOR_DIGITS => Some(0),
Some(m) => m.as_str().parse::<u32>().ok(),
None => Some(0),
};
match (major, minor) {
(Some(major), Some(minor)) => (major, minor) >= (4, 7),
_ => false,
}
}
fn is_fable_or_mythos(model_name: &str) -> bool {
model_name.contains("fable") || model_name.contains("mythos")
}