79 lines
2.4 KiB
TypeScript
79 lines
2.4 KiB
TypeScript
import {
|
|
anthropicTextToAnthropicChat,
|
|
openAIToAnthropicText,
|
|
} from "../../../../shared/api-schemas/anthropic";
|
|
import { openAIToOpenAIText } from "../../../../shared/api-schemas/openai-text";
|
|
import { openAIToOpenAIImage } from "../../../../shared/api-schemas/openai-image";
|
|
import { openAIToGoogleAI } from "../../../../shared/api-schemas/google-ai";
|
|
import { fixMistralPrompt } from "../../../../shared/api-schemas/mistral-ai";
|
|
import { API_SCHEMA_VALIDATORS } from "../../../../shared/api-schemas";
|
|
import {
|
|
isImageGenerationRequest,
|
|
isTextGenerationRequest,
|
|
} from "../../common";
|
|
import { RequestPreprocessor } from "../index";
|
|
|
|
/** Transforms an incoming request body to one that matches the target API. */
|
|
export const transformOutboundPayload: RequestPreprocessor = async (req) => {
|
|
const sameService = req.inboundApi === req.outboundApi;
|
|
const alreadyTransformed = req.retryCount > 0;
|
|
const notTransformable =
|
|
!isTextGenerationRequest(req) && !isImageGenerationRequest(req);
|
|
|
|
if (alreadyTransformed || notTransformable) return;
|
|
|
|
if (req.inboundApi === "mistral-ai") {
|
|
const messages = req.body.messages;
|
|
req.body.messages = fixMistralPrompt(messages);
|
|
req.log.info(
|
|
{ old: messages.length, new: req.body.messages.length },
|
|
"Fixed Mistral prompt"
|
|
);
|
|
}
|
|
|
|
if (sameService) {
|
|
const result = API_SCHEMA_VALIDATORS[req.inboundApi].safeParse(req.body);
|
|
if (!result.success) {
|
|
req.log.error(
|
|
{ issues: result.error.issues, body: req.body },
|
|
"Request validation failed"
|
|
);
|
|
throw result.error;
|
|
}
|
|
req.body = result.data;
|
|
return;
|
|
}
|
|
|
|
if (
|
|
req.inboundApi === "anthropic-text" &&
|
|
req.outboundApi === "anthropic-chat"
|
|
) {
|
|
req.body = anthropicTextToAnthropicChat(req);
|
|
return;
|
|
}
|
|
|
|
if (req.inboundApi === "openai" && req.outboundApi === "anthropic-text") {
|
|
req.body = openAIToAnthropicText(req);
|
|
return;
|
|
}
|
|
|
|
if (req.inboundApi === "openai" && req.outboundApi === "google-ai") {
|
|
req.body = openAIToGoogleAI(req);
|
|
return;
|
|
}
|
|
|
|
if (req.inboundApi === "openai" && req.outboundApi === "openai-text") {
|
|
req.body = openAIToOpenAIText(req);
|
|
return;
|
|
}
|
|
|
|
if (req.inboundApi === "openai" && req.outboundApi === "openai-image") {
|
|
req.body = openAIToOpenAIImage(req);
|
|
return;
|
|
}
|
|
|
|
throw new Error(
|
|
`'${req.inboundApi}' -> '${req.outboundApi}' request proxying is not supported. Make sure your client is configured to use the correct API.`
|
|
);
|
|
};
|