UNPKG

manifest

Version:

Self-hosted Manifest LLM router with embedded server, SQLite database, and dashboard

130 lines 6.29 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var ProviderClient_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProviderClient = void 0; const common_1 = require("@nestjs/common"); const provider_endpoints_1 = require("./provider-endpoints"); const cache_injection_1 = require("./cache-injection"); const provider_client_converters_1 = require("./provider-client-converters"); const PROVIDER_TIMEOUT_MS = 180_000; function stripModelPrefix(model, endpointKey) { if (endpointKey === 'openrouter') return model; const slashIdx = model.indexOf('/'); return slashIdx > 0 ? model.substring(slashIdx + 1) : model; } let ProviderClient = ProviderClient_1 = class ProviderClient { logger = new common_1.Logger(ProviderClient_1.name); async forward(opts) { const { provider, apiKey, model, body, stream, signal, extraHeaders, customEndpoint, authType, signatureLookup, } = opts; let endpoint; let endpointKey; if (customEndpoint) { endpoint = customEndpoint; endpointKey = 'custom'; } else { let resolved = (0, provider_endpoints_1.resolveEndpointKey)(provider); if (!resolved) { throw new Error(`No endpoint configured for provider: ${provider}`); } if (resolved === 'openai' && authType === 'subscription') { resolved = 'openai-subscription'; } else if (resolved === 'minimax' && authType === 'subscription') { resolved = 'minimax-subscription'; } endpointKey = resolved; endpoint = provider_endpoints_1.PROVIDER_ENDPOINTS[endpointKey]; } const isGoogle = endpoint.format === 'google'; const isAnthropic = endpoint.format === 'anthropic'; const isChatGpt = endpoint.format === 'chatgpt'; const bareModel = stripModelPrefix(model, endpointKey); let url; let headers; let requestBody; if (isGoogle) { url = `${endpoint.baseUrl}${endpoint.buildPath(bareModel)}?key=${apiKey}`; if (stream) url += '&alt=sse'; headers = endpoint.buildHeaders(apiKey, authType); requestBody = (0, provider_client_converters_1.toGoogleRequest)(body, bareModel, signatureLookup); } else if (isAnthropic) { url = `${endpoint.baseUrl}${endpoint.buildPath(bareModel)}`; headers = endpoint.buildHeaders(apiKey, authType); const isSubscription = authType === 'subscription'; requestBody = (0, provider_client_converters_1.toAnthropicRequest)(body, bareModel, { injectCacheControl: !isSubscription, injectSubscriptionIdentity: isSubscription, }); requestBody.model = bareModel; if (stream) requestBody.stream = true; } else if (isChatGpt) { url = `${endpoint.baseUrl}${endpoint.buildPath(bareModel)}`; headers = endpoint.buildHeaders(apiKey, authType); requestBody = (0, provider_client_converters_1.toResponsesRequest)(body, bareModel); } else { url = `${endpoint.baseUrl}${endpoint.buildPath(bareModel)}`; headers = endpoint.buildHeaders(apiKey, authType); const sanitized = (0, provider_client_converters_1.sanitizeOpenAiBody)(body, endpointKey, model); requestBody = { ...sanitized, model: bareModel, stream }; if (endpointKey === 'openrouter' && model.startsWith('anthropic/')) { (0, cache_injection_1.injectOpenRouterCacheControl)(requestBody); } } if (extraHeaders) { headers = { ...headers, ...extraHeaders }; } const safeUrl = url.replace(/key=[^&]+/, 'key=***'); this.logger.debug(`Forwarding to ${endpointKey}: ${safeUrl}`); const timeoutSignal = AbortSignal.timeout(PROVIDER_TIMEOUT_MS); const fetchSignal = signal ? AbortSignal.any([timeoutSignal, signal]) : timeoutSignal; const response = await fetch(url, { method: 'POST', headers, body: JSON.stringify(requestBody), signal: fetchSignal, }); return { response, isGoogle, isAnthropic, isChatGpt }; } convertChatGptResponse(body, model) { return (0, provider_client_converters_1.convertChatGptResponse)(body, model); } convertChatGptStreamChunk(chunk, model) { return (0, provider_client_converters_1.convertChatGptStreamChunk)(chunk, model); } convertGoogleResponse(googleBody, model) { return (0, provider_client_converters_1.convertGoogleResponse)(googleBody, model); } convertGoogleStreamChunk(chunk, model) { return (0, provider_client_converters_1.convertGoogleStreamChunk)(chunk, model); } convertAnthropicResponse(anthropicBody, model) { return (0, provider_client_converters_1.convertAnthropicResponse)(anthropicBody, model); } convertAnthropicStreamChunk(chunk, model) { return (0, provider_client_converters_1.convertAnthropicStreamChunk)(chunk, model); } createAnthropicStreamTransformer(model) { return (0, provider_client_converters_1.createAnthropicTransformer)(model); } collectChatGptSseResponse(sseText, model) { return (0, provider_client_converters_1.collectChatGptSseResponse)(sseText, model); } }; exports.ProviderClient = ProviderClient; exports.ProviderClient = ProviderClient = ProviderClient_1 = __decorate([ (0, common_1.Injectable)() ], ProviderClient); //# sourceMappingURL=provider-client.js.map