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 max_output_tokens: Option<usize>,
pub emits_provider_continuation: 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,
max_output_tokens: caps.max_output_tokens,
emits_provider_continuation: false,
}
}
pub fn with_provider_continuation(mut self) -> Self {
self.emits_provider_continuation = 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),
max_output_tokens: Some(8_192),
};
let caps = Capabilities::from_legacy(&legacy);
assert!(caps.supports_tools);
assert!(caps.supports_vision);
assert_eq!(caps.max_context_tokens, Some(32_000));
assert_eq!(caps.max_output_tokens, Some(8_192));
assert!(!caps.emits_provider_continuation);
}
#[test]
fn with_provider_continuation_sets_flag() {
let legacy = ModelCapabilities::ollama_default();
let caps = Capabilities::from_legacy(&legacy).with_provider_continuation();
assert!(caps.emits_provider_continuation);
}
}