feat(llm): 实现 Phase 0 剩余四个模块

实现 ProviderRegistry、HookExecutor、StreamEvents 和 Auto-compaction 模块,并集成到 LlmCycle 中
This commit is contained in:
徐涛
2026-06-02 08:51:42 +08:00
parent 69b6dd942b
commit 32f3edaf19
13 changed files with 1299 additions and 9 deletions
+68
View File
@@ -0,0 +1,68 @@
//! Provider 注册表 —— 多 Provider 实例的注册与发现。
use std::collections::HashMap;
use crate::llm::error::LlmError;
use crate::llm::provider::{create_provider, LlmProvider, ProviderConfig, ProviderType};
/// Provider 注册表 —— 管理多个 LLM Provider 实例。
///
/// 支持注册命名 Provider、按名称查找、设置默认 Provider。
pub struct ProviderRegistry {
providers: HashMap<String, Box<dyn LlmProvider>>,
default_name: Option<String>,
}
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<String>, provider: Box<dyn LlmProvider>) {
self.providers.insert(name.into(), provider);
}
/// 通过 ProviderType + ProviderConfig 创建并注册。
pub fn register_with_config(
&mut self,
name: impl Into<String>,
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))
}
}