mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-06 23:32:12 +03:00
fix(gemini): normalize audio input mime
This commit is contained in:
@@ -95,6 +95,14 @@ export const DEFAULT_SAFETY_SETTINGS = [
|
||||
{ category: "HARM_CATEGORY_CIVIC_INTEGRITY", threshold: "OFF" },
|
||||
];
|
||||
|
||||
function normalizeAudioMimeType(format: unknown): string {
|
||||
const normalized = String(format || "wav").toLowerCase();
|
||||
if (normalized === "mp3") {
|
||||
return "audio/mpeg";
|
||||
}
|
||||
return `audio/${normalized}`;
|
||||
}
|
||||
|
||||
// Convert OpenAI content to Gemini parts
|
||||
export function convertOpenAIContentToParts(content: unknown): JsonRecord[] {
|
||||
const parts: JsonRecord[] = [];
|
||||
@@ -107,19 +115,11 @@ export function convertOpenAIContentToParts(content: unknown): JsonRecord[] {
|
||||
if (rec.type === "text") {
|
||||
parts.push({ text: rec.text });
|
||||
} else if (rec.type === "input_audio" || rec.type === "audio") {
|
||||
// OpenAI Chat Completions audio input shape (ports decolua/9router#912 + #913):
|
||||
// { type:"input_audio", input_audio:{data,format} } — some clients use the
|
||||
// { type:"audio", audio:{data,format} } shape — -> Gemini
|
||||
// `inlineData: { mimeType: "audio/<format>", data }`. mp3 normalizes to the
|
||||
// canonical `audio/mpeg`; a leading `data:<mime>;base64,` prefix is stripped so
|
||||
// Gemini receives raw base64.
|
||||
const audio = toRecord(rec.input_audio || rec.audio);
|
||||
if (typeof audio.data === "string" && audio.data) {
|
||||
const format = typeof audio.format === "string" && audio.format ? audio.format : "wav";
|
||||
const mimeType = format === "mp3" ? "audio/mpeg" : `audio/${format}`;
|
||||
parts.push({
|
||||
inlineData: {
|
||||
mimeType,
|
||||
mimeType: normalizeAudioMimeType(audio.format),
|
||||
data: audio.data.replace(/^data:[a-zA-Z0-9/+-]+;base64,/, ""),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -23,7 +23,6 @@ test("convertOpenAIContentToParts maps input_audio (mp3) and strips a data: pref
|
||||
const parts = gemini.convertOpenAIContentToParts([
|
||||
{ type: "input_audio", input_audio: { data: "data:audio/mp3;base64,QUJDRA==", format: "mp3" } },
|
||||
]);
|
||||
// mp3 normalizes to the canonical audio/mpeg (matches the #913 translator test).
|
||||
assert.deepEqual(parts, [{ inlineData: { mimeType: "audio/mpeg", data: "QUJDRA==" } }]);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user