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
JavaScript
;
/**
* 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));
}