use crate::llm::api::ThinkingConfig;
pub(super) fn is_openrouter_reasoning_disable(reasoning: &serde_json::Value) -> bool {
reasoning
.get("enabled")
.and_then(serde_json::Value::as_bool)
== Some(false)
}
pub(super) fn model_declares_reasoning(caps: &crate::llm::capabilities::Capabilities) -> bool {
!caps.thinking_modes.is_empty()
|| caps.reasoning_effort_supported
|| caps.reasoning_none_supported
}
pub(super) fn openrouter_reasoning_config(thinking: &ThinkingConfig) -> Option<serde_json::Value> {
match thinking {
ThinkingConfig::Disabled => Some(serde_json::json!({
"enabled": false
})),
ThinkingConfig::Enabled {
budget_tokens: None,
} => Some(serde_json::json!({
"enabled": true
})),
ThinkingConfig::Enabled {
budget_tokens: Some(max_tokens),
} => Some(serde_json::json!({
"max_tokens": max_tokens
})),
ThinkingConfig::Adaptive => Some(serde_json::json!({
"enabled": true
})),
ThinkingConfig::Effort {
level: crate::llm::api::ReasoningEffort::None,
} => Some(serde_json::json!({
"enabled": false
})),
ThinkingConfig::Effort { level } => Some(serde_json::json!({
"effort": level.as_str()
})),
}
}
pub(super) fn enabled_reasoning_config(
thinking: &ThinkingConfig,
caps: &crate::llm::capabilities::Capabilities,
) -> Option<serde_json::Value> {
let supports_enabled = caps.thinking_modes.iter().any(|mode| mode == "enabled");
if !supports_enabled {
return None;
}
match thinking {
ThinkingConfig::Disabled
| ThinkingConfig::Effort {
level: crate::llm::api::ReasoningEffort::None,
} => Some(serde_json::json!({ "enabled": false })),
ThinkingConfig::Enabled { .. } | ThinkingConfig::Adaptive => {
Some(serde_json::json!({ "enabled": true }))
}
ThinkingConfig::Effort { .. } => Some(serde_json::json!({ "enabled": true })),
}
}
pub(super) fn minimax_thinking_config(thinking: &ThinkingConfig) -> Option<serde_json::Value> {
match thinking {
ThinkingConfig::Disabled
| ThinkingConfig::Effort {
level: crate::llm::api::ReasoningEffort::None,
} => Some(serde_json::json!({ "type": "disabled" })),
ThinkingConfig::Enabled { .. }
| ThinkingConfig::Adaptive
| ThinkingConfig::Effort { .. } => Some(serde_json::json!({ "type": "adaptive" })),
}
}
pub(super) fn zai_thinking_config(thinking: &ThinkingConfig) -> Option<serde_json::Value> {
match thinking {
ThinkingConfig::Disabled
| ThinkingConfig::Effort {
level: crate::llm::api::ReasoningEffort::None,
} => Some(serde_json::json!({ "type": "disabled" })),
ThinkingConfig::Enabled { .. }
| ThinkingConfig::Adaptive
| ThinkingConfig::Effort { .. } => Some(serde_json::json!({ "type": "enabled" })),
}
}