autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
102 lines (101 loc) • 4.08 kB
TypeScript
/**
* AiProviderManager — 统一 AI 提供商管理器(切面层)
*
* 设计目标:
* 1. 唯一权威: 当前 AI Provider 的唯一管理入口,所有读取/切换集中在此
* 2. AOP 切面: Token 追踪回调随 Provider 切换自动重新挂载,无需外部干预
* 3. 热切换: switchProvider() 一次调用 → Token AOP + Embedding fallback + DI 级联清理 + 事件通知
* 4. 模式查询: isMock / isReady 集中管理,消除散落的 name === 'mock' 判断
* 5. 事件驱动: 注册监听器,切换时自动回调(Realtime 广播、SearchEngine 重建等)
*
* 集成方式:
* - 由 AiModule.initialize() 创建并注入 DI 容器
* - ServiceContainer.reloadAiProvider() 委托 manager.switchProvider()
* - 消费者通过 container.get('aiProviderManager') 获取
* - DI 数据管道: switchProvider() 通过回调同步 singletons 中的 provider 引用
*/
/** AI Provider 最小接口(避免引入 AiProvider 具体类的循环依赖) */
export interface ManagedAiProvider {
name: string;
model: string;
apiKey?: string;
_onTokenUsage?: ((usage: TokenUsagePayload) => void) | null;
supportsEmbedding?: () => boolean;
_fallbackFrom?: string;
}
export interface TokenUsagePayload {
inputTokens: number;
outputTokens: number;
totalTokens: number;
source?: string;
}
/** Token 记录器最小接口(对应 TokenUsageStore.record) */
export interface TokenRecorder {
record(r: {
source: string;
provider?: string;
model?: string;
inputTokens: number;
outputTokens: number;
}): void;
}
/** Provider 信息快照 */
export interface ProviderInfo {
name: string;
model: string;
isMock: boolean;
supportsEmbedding: boolean;
}
/** 切换结果 */
export interface SwitchResult {
previous: ProviderInfo;
current: ProviderInfo;
clearedSingletons: string[];
}
/** 切换监听器 */
export type SwitchListener = (result: SwitchResult) => void;
/** Embedding Fallback 初始化器(注入,避免循环依赖) */
export type EmbedFallbackInitializer = (currentProvider: ManagedAiProvider) => ManagedAiProvider | null;
export declare class AiProviderManager {
#private;
constructor(initialProvider: ManagedAiProvider);
/** 当前 AI Provider (只读) */
get provider(): ManagedAiProvider;
/** 当前 Embedding Provider (优先 fallback,回退到主 provider) */
get embedProvider(): ManagedAiProvider;
/** 原始 Embedding fallback (可能为 null) */
get rawEmbedProvider(): ManagedAiProvider | null;
/** 是否处于 Mock 模式 */
get isMock(): boolean;
/** provider 是否可用于 AI 操作(非 mock) */
get isReady(): boolean;
/** 当前 provider 名称 */
get name(): string;
/** 当前模型 */
get model(): string;
/** 结构化信息快照 */
get info(): ProviderInfo;
/**
* 切换 AI Provider — 原子操作
*
* 自动处理:
* 1. Token 追踪 AOP 重新挂载
* 2. Embedding fallback 重建
* 3. DI 数据管道同步(singletons.aiProvider)
* 4. DI 容器中的 AI 依赖 singleton 级联清除
* 5. 监听器回调通知
*/
switchProvider(newProvider: ManagedAiProvider): SwitchResult;
/** 手动设置 Embedding fallback provider */
setEmbedProvider(ep: ManagedAiProvider | null): void;
/** 注入 TokenRecorder (延迟绑定,避免循环依赖) */
setTokenRecorder(recorder: TokenRecorder): void;
/** 注册切换监听器,返回取消注册函数 */
onSwitch(fn: SwitchListener): () => void;
/** 注入 DI 容器的级联清理回调 */
_bindDependentClearer(fn: () => string[]): void;
/** 注入 Embedding Fallback 初始化器 */
_bindEmbedFallbackInit(fn: EmbedFallbackInitializer): void;
/** 注入 DI 数据管道同步回调(切换时更新 singletons 中的 provider 引用) */
_bindDiSync(fn: (provider: ManagedAiProvider, embed: ManagedAiProvider | null) => void): void;
}