UNPKG

ai-platform-converter

Version:

Lossless API parameter conversion between multiple AI platforms (OpenAI, Anthropic, Gemini, DeepSeek, Wenwen, Vertex AI, Huawei, BigModel)

222 lines (221 loc) 8.46 kB
"use strict"; /** * Main converter functions */ Object.defineProperty(exports, "__esModule", { value: true }); exports.convertRequest = convertRequest; exports.convertResponse = convertResponse; exports.convertRequestBatch = convertRequestBatch; exports.convertResponseBatch = convertResponseBatch; const common_1 = require("./types/common"); const helpers_1 = require("./utils/helpers"); // Request converters const request_1 = require("./converters/request"); // Response converters const response_1 = require("./converters/response"); /** * Convert request parameters from one platform to another * * @param from Source platform * @param to Target platform * @param params Request parameters * @param options Conversion options * @returns Converted request parameters */ function convertRequest(from, to, params, options) { try { // If same platform, return clone if (from === to) { return (0, helpers_1.deepClone)(params); } // Convert to OpenAI format first (intermediate format) let openaiParams; if (from === common_1.Platform.OpenAI) { openaiParams = params; } else if ((0, helpers_1.isOpenAICompatible)(from)) { // OpenAI-compatible platforms can use params directly openaiParams = (0, helpers_1.deepClone)(params); openaiParams._extensions = { platform: from, originalParams: options?.preserveExtensions ? (0, helpers_1.deepClone)(params) : undefined }; } else if (from === common_1.Platform.Anthropic) { openaiParams = (0, request_1.convertAnthropicRequestToOpenAI)(params, options); } else if (from === common_1.Platform.Gemini) { openaiParams = (0, request_1.convertGeminiRequestToOpenAI)(params, options); } else { throw new Error(`Unsupported source platform: ${from}`); } // Convert from OpenAI format to target platform if (to === common_1.Platform.OpenAI) { return openaiParams; } else if ((0, helpers_1.isOpenAICompatible)(to)) { // OpenAI-compatible platforms can use OpenAI format const result = (0, helpers_1.deepClone)(openaiParams); if (result._extensions) { result._extensions.targetPlatform = to; } return result; } else if (to === common_1.Platform.Anthropic) { return (0, request_1.convertOpenAIRequestToAnthropic)(openaiParams, options); } else if (to === common_1.Platform.Gemini) { return (0, request_1.convertOpenAIRequestToGemini)(openaiParams, options); } else { throw new Error(`Unsupported target platform: ${to}`); } } catch (error) { if (error instanceof common_1.ConversionError) { throw error; } throw (0, helpers_1.createConversionError)(`Failed to convert request from ${from} to ${to}: ${error.message}`, from, to, error); } } /** * Convert response from one platform to another * * @param from Source platform * @param to Target platform * @param response Response data (complete response or streaming event) * @param options Conversion options * @returns Converted response */ function convertResponse(from, to, response, options) { try { // If same platform, return clone if (from === to) { return (0, helpers_1.deepClone)(response); } // Check if this is a streaming response/event const isStreaming = options?.stream || (response && (response.type === 'content_block_delta' || response.type === 'content_block_start' || response.type === 'content_block_stop' || response.type === 'message_delta' || response.type === 'message_start' || response.type === 'message_stop' || response.type === 'ping' || response.type === 'error' || response.object === 'chat.completion.chunk')); // Handle streaming responses if (isStreaming) { return convertStreamResponse(from, to, response, options); } // Handle complete responses return convertCompleteResponse(from, to, response, options); } catch (error) { if (error instanceof common_1.ConversionError) { throw error; } throw (0, helpers_1.createConversionError)(`Failed to convert response from ${from} to ${to}: ${error.message}`, from, to, error); } } /** * Convert complete response from one platform to another */ function convertCompleteResponse(from, to, response, options) { // Convert to OpenAI format first (intermediate format) let openaiResponse; if (from === common_1.Platform.OpenAI) { openaiResponse = response; } else if ((0, helpers_1.isOpenAICompatible)(from)) { // OpenAI-compatible platforms use same response format openaiResponse = (0, helpers_1.deepClone)(response); openaiResponse._extensions = { platform: from, originalParams: options?.preserveExtensions ? (0, helpers_1.deepClone)(response) : undefined }; } else if (from === common_1.Platform.Anthropic) { openaiResponse = (0, response_1.convertAnthropicResponseToOpenAI)(response, options); } else if (from === common_1.Platform.Gemini) { openaiResponse = (0, response_1.convertGeminiResponseToOpenAI)(response, options); } else { throw new Error(`Unsupported source platform: ${from}`); } // Convert from OpenAI format to target platform if (to === common_1.Platform.OpenAI) { return openaiResponse; } else if ((0, helpers_1.isOpenAICompatible)(to)) { // OpenAI-compatible platforms use same response format const result = (0, helpers_1.deepClone)(openaiResponse); if (result._extensions) { result._extensions.targetPlatform = to; } return result; } else if (to === common_1.Platform.Anthropic) { return (0, response_1.convertOpenAIResponseToAnthropic)(openaiResponse, options); } else if (to === common_1.Platform.Gemini) { return (0, response_1.convertOpenAIResponseToGemini)(openaiResponse, options); } else { throw new Error(`Unsupported target platform: ${to}`); } } /** * Convert streaming response/event from one platform to another */ function convertStreamResponse(from, to, event, options) { // Convert to OpenAI streaming format first let openaiChunk; if (from === common_1.Platform.OpenAI) { openaiChunk = event; } else if ((0, helpers_1.isOpenAICompatible)(from)) { // OpenAI-compatible platforms use same streaming format openaiChunk = (0, helpers_1.deepClone)(event); openaiChunk._extensions = { platform: from, originalEvent: options?.preserveExtensions ? (0, helpers_1.deepClone)(event) : undefined }; } else if (from === common_1.Platform.Anthropic) { openaiChunk = (0, response_1.convertAnthropicStreamToOpenAI)(event, options); } else { throw new Error(`Unsupported source platform for streaming: ${from}`); } // Convert from OpenAI streaming format to target platform if (to === common_1.Platform.OpenAI) { return openaiChunk; } else if ((0, helpers_1.isOpenAICompatible)(to)) { // OpenAI-compatible platforms use same streaming format const result = (0, helpers_1.deepClone)(openaiChunk); if (result._extensions) { result._extensions.targetPlatform = to; } return result; } else { // For now, only support converting to OpenAI-compatible platforms for streaming // Additional streaming converters can be added here as needed throw new Error(`Streaming conversion to ${to} is not yet supported`); } } /** * Batch convert multiple requests */ function convertRequestBatch(from, to, paramsList, options) { return paramsList.map(params => convertRequest(from, to, params, options)); } /** * Batch convert multiple responses */ function convertResponseBatch(from, to, responses, options) { return responses.map(response => convertResponse(from, to, response, options)); }