feat: Add WAV MIME type variants and improve audio format detection (#23396)

This commit is contained in:
Aleksander Grygier 2026-05-20 16:55:24 +02:00 committed by GitHub
parent c9872a2575
commit 6ce96713de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 43 additions and 6 deletions

View File

@ -183,6 +183,10 @@ export enum MimeTypeAudio {
MP3 = 'audio/mp3',
MP4 = 'audio/mp4',
WAV = 'audio/wav',
WAVE = 'audio/wave',
X_WAV = 'audio/x-wav',
X_WAVE = 'audio/x-wave',
X_PN_WAV = 'audio/x-pn-wav',
WEBM = 'audio/webm',
WEBM_OPUS = 'audio/webm;codecs=opus'
}

View File

@ -10,7 +10,9 @@ import {
import {
AttachmentType,
ContentPartType,
FileTypeAudio,
MessageRole,
MimeTypeAudio,
ReasoningFormat,
UrlProtocol
} from '$lib/enums';
@ -19,9 +21,29 @@ import type {
ApiChatMessageData,
ApiChatCompletionToolCall
} from '$lib/types/api';
import type { DatabaseMessageExtraMcpPrompt, DatabaseMessageExtraMcpResource } from '$lib/types';
import type {
AudioInputFormat,
DatabaseMessageExtraMcpPrompt,
DatabaseMessageExtraMcpResource
} from '$lib/types';
import { modelsStore } from '$lib/stores/models.svelte';
function getAudioInputFormat(mimeType: string): AudioInputFormat {
const normalizedMimeType = mimeType.trim().toLowerCase();
if (
normalizedMimeType === MimeTypeAudio.WAV ||
normalizedMimeType === MimeTypeAudio.WAVE ||
normalizedMimeType === MimeTypeAudio.X_WAV ||
normalizedMimeType === MimeTypeAudio.X_WAVE ||
normalizedMimeType === MimeTypeAudio.X_PN_WAV
) {
return FileTypeAudio.WAV;
}
return FileTypeAudio.MP3;
}
export class ChatService {
/**
*
@ -879,7 +901,7 @@ export class ChatService {
type: ContentPartType.INPUT_AUDIO,
input_audio: {
data: audio.base64Data,
format: audio.mimeType.includes('wav') ? 'wav' : 'mp3'
format: getAudioInputFormat(audio.mimeType)
}
});
}

View File

@ -1,6 +1,8 @@
import type { ContentPartType, ServerModelStatus, ServerRole } from '$lib/enums';
import type { ContentPartType, FileTypeAudio, ServerModelStatus, ServerRole } from '$lib/enums';
import type { ChatMessagePromptProgress, ChatRole } from './chat';
export type AudioInputFormat = FileTypeAudio.WAV | FileTypeAudio.MP3;
export interface ApiChatCompletionToolFunction {
name: string;
description?: string;
@ -20,7 +22,7 @@ export interface ApiChatMessageContentPart {
};
input_audio?: {
data: string;
format: 'wav' | 'mp3';
format: AudioInputFormat;
};
input_video?: {
data: string;

View File

@ -29,7 +29,8 @@ export type {
ApiRouterModelsStatusResponse,
ApiRouterModelsListResponse,
ApiRouterModelsUnloadRequest,
ApiRouterModelsUnloadResponse
ApiRouterModelsUnloadResponse,
AudioInputFormat
} from './api';
// Chat types

View File

@ -18,8 +18,12 @@ import {
MimeTypeText
} from '$lib/enums';
function normalizeMimeType(mimeType: string): string {
return mimeType.trim().toLowerCase();
}
export function getFileTypeCategory(mimeType: string): FileTypeCategory | null {
switch (mimeType) {
switch (normalizeMimeType(mimeType)) {
// Images
case MimeTypeImage.JPEG:
case MimeTypeImage.PNG:
@ -33,6 +37,10 @@ export function getFileTypeCategory(mimeType: string): FileTypeCategory | null {
case MimeTypeAudio.MP3:
case MimeTypeAudio.MP4:
case MimeTypeAudio.WAV:
case MimeTypeAudio.WAVE:
case MimeTypeAudio.X_WAV:
case MimeTypeAudio.X_WAVE:
case MimeTypeAudio.X_PN_WAV:
case MimeTypeAudio.WEBM:
case MimeTypeAudio.WEBM_OPUS:
return FileTypeCategory.AUDIO;