ai-switcher
Version:
A package which helps you switch between AI APIs using configurations, so that code changes are not required.
52 lines (44 loc) • 1.8 kB
text/typescript
// src/index.ts
import { Message, Provider, ModelConfig, AIClientConfig, CompletionOptions } from './types';
import { BaseAIClient } from './clients/base';
import { AnthropicClient } from './clients/anthropic';
import { OpenAIClient } from './clients/openai';
export class AIClient {
private clients: Map<Provider, BaseAIClient>;
private defaultProvider: Provider;
private defaultModel: string;
constructor(config: AIClientConfig) {
if (!config.anthropicApiKey && !config.openaiApiKey) {
throw new Error("At least one provider API key must be provided");
}
this.clients = new Map();
this.defaultProvider = config.defaultProvider || 'openai';
this.defaultModel = config.defaultModel || '';
if (config.anthropicApiKey) {
this.clients.set('anthropic', new AnthropicClient(config.anthropicApiKey));
}
if (config.openaiApiKey) {
this.clients.set('openai', new OpenAIClient(config.openaiApiKey));
}
}
private getClient(provider?: Provider): BaseAIClient {
const selectedProvider = provider || this.defaultProvider;
const client = this.clients.get(selectedProvider);
if (!client) {
throw new Error(`No client configured for provider: ${selectedProvider}`);
}
return client;
}
async createCompletion(messages: Message[], options: CompletionOptions = {}): Promise<string> {
const client = this.getClient(options.provider);
return client.createCompletion(messages, {
...options,
model: options.model || this.defaultModel,
});
}
async createEmbedding(text: string, provider?: Provider): Promise<number[]> {
const client = this.getClient(provider);
return client.createEmbedding(text);
}
}
export { Message, Provider, ModelConfig, AIClientConfig, CompletionOptions };