| import test from "node:test"; |
| import assert from "node:assert/strict"; |
| import { createRequestNormalizationService } from "../src/services/requestNormalizationService.js"; |
|
|
| test("normalizes audio URLs to mp3 base64 and raw image base64 to data URLs", async () => { |
| const service = createRequestNormalizationService({ |
| audioConversionService: { |
| async downloadAndConvertToMp3Base64(url) { |
| assert.equal(url, "https://example.com/sample.wav"); |
| return { |
| data: "ZmFrZS1tcDM=", |
| format: "mp3" |
| }; |
| }, |
| async normalizeBase64Audio(audio) { |
| return audio; |
| } |
| } |
| }); |
|
|
| const { normalizedBody, responseContext } = await service.normalize({ |
| messages: [ |
| { |
| role: "user", |
| content: [ |
| { |
| type: "image_url", |
| image_url: { |
| url: "iVBORw0KGgoAAAANSUhEUgAAAAUA" |
| }, |
| mime_type: "image/png" |
| }, |
| { |
| type: "input_audio", |
| input_audio: { |
| url: "https://example.com/sample.wav" |
| } |
| } |
| ] |
| } |
| ], |
| audio: { |
| format: "wav" |
| } |
| }); |
|
|
| assert.equal(normalizedBody.messages[0].content[0].image_url.url.startsWith("data:image/png;base64,"), true); |
| assert.deepEqual(normalizedBody.messages[0].content[1], { |
| type: "input_audio", |
| input_audio: { |
| data: "ZmFrZS1tcDM=", |
| format: "mp3" |
| } |
| }); |
| assert.equal(responseContext.audioFormat, "wav"); |
| }); |
|
|
| test("downloads remote audio when the URL is provided in input_audio.data", async () => { |
| const service = createRequestNormalizationService({ |
| audioConversionService: { |
| async downloadAndConvertToMp3Base64(url) { |
| assert.equal(url, "https://example.com/sample.mp4"); |
| return { |
| data: "ZG93bmxvYWRlZC1hbmQtY29udmVydGVk", |
| format: "mp3" |
| }; |
| }, |
| async normalizeBase64Audio() { |
| throw new Error("unexpected base64 conversion"); |
| } |
| } |
| }); |
|
|
| const { normalizedBody } = await service.normalize({ |
| messages: [ |
| { |
| role: "user", |
| content: [ |
| { |
| type: "input_audio", |
| input_audio: { |
| data: "https://example.com/sample.mp4", |
| format: "m4a" |
| } |
| } |
| ] |
| } |
| ] |
| }); |
|
|
| assert.deepEqual(normalizedBody.messages[0].content[0], { |
| type: "input_audio", |
| input_audio: { |
| data: "ZG93bmxvYWRlZC1hbmQtY29udmVydGVk", |
| format: "mp3" |
| } |
| }); |
| }); |
|
|
| test("normalizes uploaded wav audio before forwarding upstream", async () => { |
| const service = createRequestNormalizationService({ |
| audioConversionService: { |
| async downloadAndConvertToMp3Base64() { |
| throw new Error("unexpected url conversion"); |
| }, |
| async normalizeBase64Audio(audio) { |
| assert.deepEqual(audio, { |
| data: "UklGRl8AAABXQVZFZm10", |
| format: "wav" |
| }); |
|
|
| return { |
| data: "bm9ybWFsaXplZC13YXY=", |
| format: "wav" |
| }; |
| } |
| } |
| }); |
|
|
| const { normalizedBody } = await service.normalize({ |
| messages: [ |
| { |
| role: "user", |
| content: [ |
| { |
| type: "input_audio", |
| input_audio: { |
| data: "UklGRl8AAABXQVZFZm10", |
| format: "wav" |
| } |
| } |
| ] |
| } |
| ] |
| }); |
|
|
| assert.deepEqual(normalizedBody.messages[0].content[0], { |
| type: "input_audio", |
| input_audio: { |
| data: "bm9ybWFsaXplZC13YXY=", |
| format: "wav" |
| } |
| }); |
| }); |
|
|
| test("preserves uploaded m4a format for conversion and forwards mp3 output", async () => { |
| const service = createRequestNormalizationService({ |
| audioConversionService: { |
| async downloadAndConvertToMp3Base64() { |
| throw new Error("unexpected url conversion"); |
| }, |
| async normalizeBase64Audio(audio) { |
| assert.deepEqual(audio, { |
| data: "AAAAGGZ0eXBNNEEg", |
| format: "m4a" |
| }); |
|
|
| return { |
| data: "Y29udmVydGVkLW1wMw==", |
| format: "mp3" |
| }; |
| } |
| } |
| }); |
|
|
| const { normalizedBody } = await service.normalize({ |
| messages: [ |
| { |
| role: "user", |
| content: [ |
| { |
| type: "input_audio", |
| input_audio: { |
| data: "AAAAGGZ0eXBNNEEg", |
| format: "m4a" |
| } |
| } |
| ] |
| } |
| ] |
| }); |
|
|
| assert.deepEqual(normalizedBody.messages[0].content[0], { |
| type: "input_audio", |
| input_audio: { |
| data: "Y29udmVydGVkLW1wMw==", |
| format: "mp3" |
| } |
| }); |
| }); |
|
|
| test("parses m4a data urls with codec metadata before conversion", async () => { |
| const service = createRequestNormalizationService({ |
| audioConversionService: { |
| async downloadAndConvertToMp3Base64() { |
| throw new Error("unexpected url conversion"); |
| }, |
| async normalizeBase64Audio(audio) { |
| assert.deepEqual(audio, { |
| data: "AAAAGGZ0eXBNNEEg", |
| format: "m4a" |
| }); |
|
|
| return { |
| data: "Y29udmVydGVkLW1wMw==", |
| format: "mp3" |
| }; |
| } |
| } |
| }); |
|
|
| const { normalizedBody } = await service.normalize({ |
| messages: [ |
| { |
| role: "user", |
| content: [ |
| { |
| type: "input_audio", |
| input_audio: { |
| data: "data:audio/mp4;codecs=mp4a.40.2;base64,AAAAGGZ0eXBNNEEg", |
| format: "m4a" |
| } |
| } |
| ] |
| } |
| ] |
| }); |
|
|
| assert.deepEqual(normalizedBody.messages[0].content[0], { |
| type: "input_audio", |
| input_audio: { |
| data: "Y29udmVydGVkLW1wMw==", |
| format: "mp3" |
| } |
| }); |
| }); |
|
|