UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

102 lines (101 loc) 4.08 kB
/** * 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; }