fix(gemini): normalize audio input mime

This commit is contained in:
KooshaPari
2026-06-26 05:00:03 -07:00
parent fabc6af7ef
commit e4fef27aac
2 changed files with 9 additions and 10 deletions

View File

@@ -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,/, ""),
},
});

View File

@@ -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==" } }]);
});