#![allow(dead_code)]
use crate::tui::app::ReasoningEffort;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct RequestTuning {
pub reasoning_effort: Option<ReasoningEffort>,
pub max_output_tokens: Option<u32>,
}
impl RequestTuning {
#[must_use]
pub const fn untuned() -> Self {
Self {
reasoning_effort: None,
max_output_tokens: None,
}
}
#[must_use]
pub const fn is_tuned(&self) -> bool {
self.reasoning_effort.is_some() || self.max_output_tokens.is_some()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct TuningSupport {
pub honors_reasoning_effort: bool,
pub honors_max_output_tokens: bool,
}
impl TuningSupport {
pub const UNKNOWN: Self = Self {
honors_reasoning_effort: false,
honors_max_output_tokens: false,
};
}
#[must_use]
pub fn provider_tuning_support(provider_name: &str) -> TuningSupport {
match provider_name.trim().to_ascii_lowercase().as_str() {
"deepseek" | "deepseek-cn" | "deepseekcn" => TuningSupport {
honors_reasoning_effort: true,
honors_max_output_tokens: true,
},
"openai" => TuningSupport {
honors_reasoning_effort: false,
honors_max_output_tokens: false,
},
"moonshot" => TuningSupport {
honors_reasoning_effort: false,
honors_max_output_tokens: false,
},
"ollama" => TuningSupport {
honors_reasoning_effort: false,
honors_max_output_tokens: false,
},
"atlascloud" => TuningSupport {
honors_reasoning_effort: false,
honors_max_output_tokens: false,
},
_ => TuningSupport::UNKNOWN,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn request_tuning_default_is_untuned() {
let tuning = RequestTuning::default();
assert_eq!(tuning, RequestTuning::untuned());
assert_eq!(tuning.reasoning_effort, None);
assert_eq!(tuning.max_output_tokens, None);
assert!(!tuning.is_tuned());
}
#[test]
fn request_tuning_reuses_reasoning_effort_enum() {
let tuning = RequestTuning {
reasoning_effort: Some(ReasoningEffort::High),
max_output_tokens: Some(4096),
};
assert_eq!(tuning.reasoning_effort, Some(ReasoningEffort::High));
assert_eq!(tuning.max_output_tokens, Some(4096));
assert!(tuning.is_tuned());
}
#[test]
fn deepseek_honors_both_tuning_params() {
let support = provider_tuning_support("deepseek");
assert!(support.honors_reasoning_effort);
assert!(support.honors_max_output_tokens);
}
#[test]
fn deepseek_cn_alias_matches_deepseek() {
assert_eq!(
provider_tuning_support("deepseek-cn"),
provider_tuning_support("deepseek")
);
assert_eq!(
provider_tuning_support("deepseekcn"),
provider_tuning_support("deepseek")
);
}
#[test]
fn openai_honors_neither_tuning_param() {
let support = provider_tuning_support("openai");
assert!(!support.honors_reasoning_effort);
assert!(!support.honors_max_output_tokens);
}
#[test]
fn moonshot_does_not_honor_reasoning_effort_tier() {
let support = provider_tuning_support("moonshot");
assert!(!support.honors_reasoning_effort);
assert!(!support.honors_max_output_tokens);
}
#[test]
fn ollama_does_not_honor_reasoning_effort_tier() {
let support = provider_tuning_support("ollama");
assert!(!support.honors_reasoning_effort);
assert!(!support.honors_max_output_tokens);
}
#[test]
fn atlascloud_does_not_honor_tuning_params() {
let support = provider_tuning_support("atlascloud");
assert!(!support.honors_reasoning_effort);
assert!(!support.honors_max_output_tokens);
}
#[test]
fn unknown_provider_falls_back_to_conservative_default() {
let support = provider_tuning_support("totally-unknown-provider");
assert_eq!(support, TuningSupport::UNKNOWN);
assert!(!support.honors_reasoning_effort);
assert!(!support.honors_max_output_tokens);
}
#[test]
fn provider_name_match_is_case_and_whitespace_insensitive() {
assert_eq!(
provider_tuning_support(" DeepSeek "),
provider_tuning_support("deepseek")
);
assert_eq!(
provider_tuning_support("OpenAI"),
provider_tuning_support("openai")
);
}
}