use crate::models::{ModelCapabilities, ReasoningCapability};
#[derive(Debug, Clone)]
pub struct Capabilities {
pub supports_tools: bool,
pub supports_vision: bool,
pub supports_reasoning: ReasoningCapability,
pub max_context_tokens: Option<usize>,
pub emits_thinking_signature: bool,
}
impl Capabilities {
pub fn from_legacy(caps: &ModelCapabilities) -> Self {
Self {
supports_tools: caps.supports_tools,
supports_vision: caps.supports_vision,
supports_reasoning: caps.supports_reasoning.clone(),
max_context_tokens: caps.max_context_tokens,
emits_thinking_signature: false,
}
}
pub fn with_thinking_signature(mut self) -> Self {
self.emits_thinking_signature = true;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_legacy_preserves_flags() {
let legacy = ModelCapabilities {
supports_tools: true,
supports_vision: true,
supports_reasoning: ReasoningCapability::Binary,
max_context_tokens: Some(32_000),
};
let caps = Capabilities::from_legacy(&legacy);
assert!(caps.supports_tools);
assert!(caps.supports_vision);
assert_eq!(caps.max_context_tokens, Some(32_000));
assert!(!caps.emits_thinking_signature);
}
#[test]
fn with_thinking_signature_sets_flag() {
let legacy = ModelCapabilities::ollama_default();
let caps = Capabilities::from_legacy(&legacy).with_thinking_signature();
assert!(caps.emits_thinking_signature);
}
}