UNPKG

ai.libx.js

Version:

Unified API bridge for various AI models (LLMs, image/video generation, TTS, STT) - stateless, edge-compatible

143 lines 6.46 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AIClient = void 0; const validation_1 = require("./utils/validation"); const errors_1 = require("./utils/errors"); const models_1 = require("./models"); const request_logger_1 = require("./utils/request-logger"); const openai_1 = require("./adapters/openai"); const anthropic_1 = require("./adapters/anthropic"); const google_1 = require("./adapters/google"); const groq_1 = require("./adapters/groq"); const mistral_1 = require("./adapters/mistral"); const cohere_1 = require("./adapters/cohere"); const xai_1 = require("./adapters/xai"); const deepseek_1 = require("./adapters/deepseek"); const ai21_1 = require("./adapters/ai21"); const openrouter_1 = require("./adapters/openrouter"); const cloudflare_1 = require("./adapters/cloudflare"); class AIClient { constructor(config = {}) { this.adapters = new Map(); this.config = config; this.logger = (0, request_logger_1.getRequestLogger)(config.enableLogging || false); } chat(options) { return __awaiter(this, void 0, void 0, function* () { var _a, _b; (0, validation_1.validateChatOptions)(options); const resolvedModel = (0, models_1.resolveModel)(options.model); options.model = resolvedModel; const provider = (0, models_1.getProviderFromModel)(resolvedModel); if (!provider) { throw new errors_1.InvalidRequestError(`Invalid model format: "${resolvedModel}". Expected format: "provider/model-name"`); } if (!(0, models_1.isModelSupported)(resolvedModel)) { throw new errors_1.ModelNotFoundError(resolvedModel); } const modelInfo = (0, models_1.getModelInfo)(resolvedModel); if (modelInfo) { if (modelInfo.enabled === false) { throw new errors_1.InvalidRequestError(`Model "${resolvedModel}" is disabled and not available for use`); } if (modelInfo.noChat) { throw new errors_1.InvalidRequestError(`Model "${resolvedModel}" does not support chat completions (e.g., realtime/audio models)`); } if (modelInfo.knownIssues) { console.warn(`⚠️ Warning: Model "${resolvedModel}" has known issues: ${modelInfo.knownIssues}`); } } const adapter = this.getAdapter(provider); const chatOptions = Object.assign(Object.assign({}, options), { apiKey: options.apiKey || ((_a = this.config.apiKeys) === null || _a === void 0 ? void 0 : _a[provider]) }); const tracker = this.logger.startRequest(provider, resolvedModel); try { const result = yield adapter.chat(chatOptions); if ('content' in result) { const tokens = (_b = result.usage) === null || _b === void 0 ? void 0 : _b.totalTokens; this.logger.logRequest(tracker, true, tokens); } else { this.logger.logRequest(tracker, true); } return result; } catch (error) { this.logger.logRequest(tracker, false, undefined, error instanceof Error ? error.message : 'Unknown error'); throw error; } }); } getAdapter(provider) { var _a, _b; if (this.adapters.has(provider)) { return this.adapters.get(provider); } const adapterConfig = { apiKey: (_a = this.config.apiKeys) === null || _a === void 0 ? void 0 : _a[provider], baseUrl: (_b = this.config.baseUrls) === null || _b === void 0 ? void 0 : _b[provider], }; if (provider === 'cloudflare') { adapterConfig.cloudflareAccountId = this.config.cloudflareAccountId; } let adapter; switch (provider) { case 'openai': adapter = new openai_1.OpenAIAdapter(adapterConfig); break; case 'anthropic': adapter = new anthropic_1.AnthropicAdapter(adapterConfig); break; case 'google': adapter = new google_1.GoogleAdapter(adapterConfig); break; case 'groq': adapter = new groq_1.GroqAdapter(adapterConfig); break; case 'mistral': adapter = new mistral_1.MistralAdapter(adapterConfig); break; case 'cohere': adapter = new cohere_1.CohereAdapter(adapterConfig); break; case 'xai': adapter = new xai_1.XAIAdapter(adapterConfig); break; case 'deepseek': adapter = new deepseek_1.DeepSeekAdapter(adapterConfig); break; case 'ai21': adapter = new ai21_1.AI21Adapter(adapterConfig); break; case 'openrouter': adapter = new openrouter_1.OpenRouterAdapter(adapterConfig); break; case 'cloudflare': adapter = new cloudflare_1.CloudflareAdapter(adapterConfig); break; default: throw new errors_1.InvalidRequestError(`Unsupported provider: ${provider}`); } this.adapters.set(provider, adapter); return adapter; } clearAdapters() { this.adapters.clear(); } getLogger() { return this.logger; } getStats() { return this.logger.getStats(); } } exports.AIClient = AIClient; //# sourceMappingURL=AIClient.js.map