atomcode_core/ctx/
resolver.rs1use std::sync::Arc;
18
19use super::{CtxBuilder, DefaultCtx};
20use crate::config::provider::ProviderConfig;
21
22pub fn for_provider(provider: &ProviderConfig) -> Arc<dyn CtxBuilder> {
32 if provider.provider_type == "ollama" {
36 return Arc::new(super::ollama::OllamaCtx::new(provider));
37 }
38
39 Arc::new(DefaultCtx::new(provider))
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 fn provider(ptype: &str, model: &str, ctx: usize) -> ProviderConfig {
55 ProviderConfig {
56 provider_type: ptype.into(),
57 api_key: None,
58 model: model.into(),
59 base_url: None,
60 system_prompt: None,
61 user_agent: None,
62 context_window: ctx,
63 max_tokens: None,
64 thinking_type: None,
65 thinking_keep: None,
66 reasoning_history: None,
67 thinking_enabled: None,
68 thinking_budget: None,
69 skip_tls_verify: false,
70 ephemeral: false,
71
72}
73 }
74
75 #[test]
76 fn resolves_ollama_by_provider_type() {
77 let p = provider("ollama", "llama3", 8_000);
78 assert_eq!(for_provider(&p).name(), "ollama");
79 }
80
81 #[test]
82 fn resolves_default_for_unknown_provider() {
83 let p = provider("openai", "gpt-4o", 128_000);
84 assert_eq!(for_provider(&p).name(), "default");
85
86 let p = provider("anthropic", "claude-3-5-sonnet", 200_000);
87 assert_eq!(for_provider(&p).name(), "default");
88
89 let p = provider("", "", 0);
90 assert_eq!(for_provider(&p).name(), "default");
91 }
92
93 #[test]
94 fn ollama_rule_matches_any_model_under_ollama_provider() {
95 for model in ["llama3-8b", "qwen2.5-coder", "deepseek-coder-v2", ""] {
97 let p = provider("ollama", model, 8_000);
98 assert_eq!(for_provider(&p).name(), "ollama", "model={}", model);
99 }
100 }
101}