Quick-win refactors from the Refactoring Guru catalog: - Replace Magic Number with Symbolic Constant: extract DEFAULT_TIMEOUT_MS, DEFAULT_MAX_RETRIES, DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE, default models per provider, and validation prompt into src/constants.ts. - Parameterize Method: collapse validateTemperature / validateTopP / validateMaxTokens (and the inline timeout/maxRetries checks) into a single validateNumberInRange helper with bounds metadata. - Inline Class / Remove Middle Man: drop the unused ProviderRegistry class from utils/factory.ts. createProvider now dispatches through the PROVIDER_REGISTRY const directly instead of a parallel switch. Also fixes stale VERSION constant in src/index.ts (was 1.3.1).
62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
/**
|
|
* Factory utilities for creating AI providers.
|
|
*/
|
|
|
|
import { ClaudeProvider, type ClaudeConfig } from '../providers/claude.js';
|
|
import { OpenAIProvider, type OpenAIConfig } from '../providers/openai.js';
|
|
import { GeminiProvider, type GeminiConfig } from '../providers/gemini.js';
|
|
import { OpenWebUIProvider, type OpenWebUIConfig } from '../providers/openwebui.js';
|
|
import { BaseAIProvider } from '../providers/base.js';
|
|
|
|
export const PROVIDER_REGISTRY = {
|
|
claude: ClaudeProvider,
|
|
openai: OpenAIProvider,
|
|
gemini: GeminiProvider,
|
|
openwebui: OpenWebUIProvider
|
|
} as const;
|
|
|
|
export type ProviderType = keyof typeof PROVIDER_REGISTRY;
|
|
|
|
export interface ProviderConfigMap {
|
|
claude: ClaudeConfig;
|
|
openai: OpenAIConfig;
|
|
gemini: GeminiConfig;
|
|
openwebui: OpenWebUIConfig;
|
|
}
|
|
|
|
export function createProvider<T extends ProviderType>(
|
|
type: T,
|
|
config: ProviderConfigMap[T]
|
|
): BaseAIProvider {
|
|
const ProviderClass = PROVIDER_REGISTRY[type];
|
|
if (!ProviderClass) {
|
|
throw new Error(`Unsupported provider type: ${type}`);
|
|
}
|
|
return new ProviderClass(config as any);
|
|
}
|
|
|
|
export function createClaudeProvider(
|
|
apiKey: string,
|
|
options: Partial<Omit<ClaudeConfig, 'apiKey'>> = {}
|
|
): ClaudeProvider {
|
|
return new ClaudeProvider({ apiKey, ...options });
|
|
}
|
|
|
|
export function createOpenAIProvider(
|
|
apiKey: string,
|
|
options: Partial<Omit<OpenAIConfig, 'apiKey'>> = {}
|
|
): OpenAIProvider {
|
|
return new OpenAIProvider({ apiKey, ...options });
|
|
}
|
|
|
|
export function createGeminiProvider(
|
|
apiKey: string,
|
|
options: Partial<Omit<GeminiConfig, 'apiKey'>> = {}
|
|
): GeminiProvider {
|
|
return new GeminiProvider({ apiKey, ...options });
|
|
}
|
|
|
|
export function createOpenWebUIProvider(config: OpenWebUIConfig): OpenWebUIProvider {
|
|
return new OpenWebUIProvider(config);
|
|
}
|