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
JavaScript
;
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