//! Provider 注册表 —— 多 Provider 实例的注册与发现。 use std::collections::HashMap; use crate::llm::LlmProvider; use crate::llm::error::LlmError; use crate::llm::provider::{ProviderConfig, ProviderType, create_provider}; /// Provider 注册表 —— 管理多个 LLM Provider 实例。 /// /// 支持注册命名 Provider、按名称查找、设置默认 Provider。 pub struct ProviderRegistry { providers: HashMap>, default_name: Option, } impl Default for ProviderRegistry { fn default() -> Self { Self::new() } } impl ProviderRegistry { /// 创建一个空的注册表。 pub fn new() -> Self { Self { providers: HashMap::new(), default_name: None, } } /// 注册一个已初始化的 Provider 实例。 pub fn register(&mut self, name: impl Into, provider: Box) { self.providers.insert(name.into(), provider); } /// 通过 ProviderType + ProviderConfig 创建并注册。 pub fn register_with_config( &mut self, name: impl Into, provider_type: ProviderType, config: ProviderConfig, ) -> Result<(), LlmError> { let provider = create_provider(provider_type, config)?; self.register(name, provider); Ok(()) } /// 设置默认 Provider。 pub fn set_default(&mut self, name: &str) -> Result<(), LlmError> { if !self.providers.contains_key(name) { return Err(LlmError::Other(format!("Provider '{}' 不存在", name))); } self.default_name = Some(name.to_string()); Ok(()) } /// 按名称查找 Provider。 pub fn get(&self, name: &str) -> Option<&dyn LlmProvider> { self.providers.get(name).map(|p| p.as_ref()) } /// 获取默认 Provider。 pub fn get_default(&self) -> Option<&dyn LlmProvider> { self.default_name.as_ref().and_then(|name| self.get(name)) } }