use aither_core::llm::model::ReasoningEffort;
const DOCUMENTED_DEFAULTS: &[(&str, ReasoningEffort)] = &[
("claude-fable-5-1", ReasoningEffort::High),
("claude-mythos-5-1", ReasoningEffort::High),
("claude-opus-5-5", ReasoningEffort::Medium),
("claude-opus-5", ReasoningEffort::High),
("claude-sonnet-5-5", ReasoningEffort::High),
("claude-haiku-5-5", ReasoningEffort::Medium),
("gpt-6-sol", ReasoningEffort::Medium),
("gpt-6-luna", ReasoningEffort::Medium),
("gpt-6.1-sol", ReasoningEffort::Medium),
];
#[must_use]
pub fn default_reasoning_effort(model_id: &str) -> Option<ReasoningEffort> {
let id = crate::lookup(model_id).map_or(model_id, crate::ModelEntry::id);
let id = id.split_once('@').map_or(id, |(model, _)| model);
DOCUMENTED_DEFAULTS
.iter()
.find_map(|(model, effort)| (*model == id).then_some(*effort))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn documented_defaults_resolve_and_undocumented_ones_are_absent() {
for (id, expected) in [
("claude-opus-5-5", Some(ReasoningEffort::Medium)),
("claude-sonnet-5-5", Some(ReasoningEffort::High)),
("claude-opus-5-5@default", Some(ReasoningEffort::Medium)),
("gpt-6-sol", Some(ReasoningEffort::Medium)),
("gpt-6-astra", None),
("gpt-5", None),
] {
assert_eq!(default_reasoning_effort(id), expected, "{id}");
}
}
}