UNPKG

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
"use strict"; 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;