ai-switcher
Version:
A package which helps you switch between AI APIs using configurations, so that code changes are not required.
73 lines (72 loc) • 3.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.OpenAIClient = void 0;
// src/clients/openai.ts
const openai_1 = __importDefault(require("openai"));
const types_1 = require("../types");
const base_1 = require("./base");
class OpenAIClient extends base_1.BaseAIClient {
constructor(apiKey) {
super();
this.apiKey = apiKey;
this.client = new openai_1.default({ apiKey });
}
async createCompletion(messages, options = {}) {
try {
const response = await this.client.chat.completions.create({
model: options.model || 'gpt-3.5-turbo',
messages: messages.map(msg => ({
role: msg.role,
content: msg.content,
})),
temperature: options.temperature ?? 0.7,
max_tokens: options.maxTokens ?? 4096,
top_p: options.topP,
frequency_penalty: options.frequencyPenalty,
presence_penalty: options.presencePenalty,
response_format: options.responseFormat === 'json' ? { type: 'json_object' } : undefined,
stop: options.stop,
seed: options.seed,
});
return response.choices[0]?.message?.content || '';
}
catch (error) {
// Handle OpenAI API errors
if (error?.status === 401) {
throw new types_1.AIError('Invalid API key', 'openai', 401, error);
}
if (error?.status === 429) {
throw new types_1.AIError('Rate limit exceeded', 'openai', 429, error);
}
if (error?.status === 400) {
// Handle specific OpenAI error types
if (error.code === 'context_length_exceeded') {
throw new types_1.AIError('Maximum context length exceeded', 'openai', 400, error);
}
if (error.code === 'invalid_api_key') {
throw new types_1.AIError('Invalid API key', 'openai', 401, error);
}
throw new types_1.AIError(error.message || 'Bad request', 'openai', 400, error);
}
if (error?.status >= 500) {
throw new types_1.AIError('Server error', 'openai', error.status, error);
}
// Handle timeout errors
if (error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED') {
throw new types_1.AIError('Request timeout', 'openai', 408, error);
}
throw new types_1.AIError(error.message || 'Unknown error', 'openai', undefined, error);
}
}
async createEmbedding(text) {
const response = await this.client.embeddings.create({
model: 'text-embedding-ada-002',
input: text,
});
return response.data[0].embedding;
}
}
exports.OpenAIClient = OpenAIClient;