use std::sync::Arc;
use super::{CtxBuilder, DefaultCtx};
use crate::config::provider::ProviderConfig;
pub fn for_provider(provider: &ProviderConfig) -> Arc<dyn CtxBuilder> {
if provider.provider_type == "ollama" {
return Arc::new(super::ollama::OllamaCtx::new(provider));
}
Arc::new(DefaultCtx::new(provider))
}
#[cfg(test)]
mod tests {
use super::*;
fn provider(ptype: &str, model: &str, ctx: usize) -> ProviderConfig {
ProviderConfig {
provider_type: ptype.into(),
api_key: None,
model: model.into(),
base_url: None,
system_prompt: None,
user_agent: None,
context_window: ctx,
max_tokens: None,
thinking_type: None,
thinking_keep: None,
reasoning_history: None,
thinking_enabled: None,
thinking_budget: None,
skip_tls_verify: false,
ephemeral: false,
}
}
#[test]
fn resolves_ollama_by_provider_type() {
let p = provider("ollama", "llama3", 8_000);
assert_eq!(for_provider(&p).name(), "ollama");
}
#[test]
fn resolves_default_for_unknown_provider() {
let p = provider("openai", "gpt-4o", 128_000);
assert_eq!(for_provider(&p).name(), "default");
let p = provider("anthropic", "claude-3-5-sonnet", 200_000);
assert_eq!(for_provider(&p).name(), "default");
let p = provider("", "", 0);
assert_eq!(for_provider(&p).name(), "default");
}
#[test]
fn ollama_rule_matches_any_model_under_ollama_provider() {
for model in ["llama3-8b", "qwen2.5-coder", "deepseek-coder-v2", ""] {
let p = provider("ollama", model, 8_000);
assert_eq!(for_provider(&p).name(), "ollama", "model={}", model);
}
}
}