From f158f07ee0239c2e60f3f393e8d1447f6156810d Mon Sep 17 00:00:00 2001 From: Mieszko Makuch Date: Wed, 25 Mar 2026 11:38:57 +0100 Subject: [PATCH] feat(stt): add server-side language fallback and extraParams for OpenAI STT provider Add two optional fields to the OpenAI STT provider config schema: - `language`: server-side default language (ISO 639-1) sent to Whisper when the client doesn't provide one. Useful for non-English deployments where admins want to predefine the transcription language without requiring each user to configure it in the browser. - `extraParams`: arbitrary key-value pairs forwarded to the STT endpoint. Enables self-hosted Whisper servers (e.g. Speaches, faster-whisper-server) to receive provider-specific parameters like `vad_filter` (Voice Activity Detection) which filters silence and prevents hallucinations on empty audio clips. These params are ignored by the official OpenAI API. Example librechat.yaml configuration: ```yaml speech: stt: openai: url: 'http://whisper-server/v1/audio/transcriptions' apiKey: 'none' model: 'whisper-large-v3-turbo' language: 'pl' extraParams: vad_filter: true ``` --- api/server/services/Files/Audio/STTService.js | 6 +++++- packages/data-provider/src/config.ts | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/api/server/services/Files/Audio/STTService.js b/api/server/services/Files/Audio/STTService.js index 4ba62a7eeb..3a7a51bd8d 100644 --- a/api/server/services/Files/Audio/STTService.js +++ b/api/server/services/Files/Audio/STTService.js @@ -206,6 +206,10 @@ class STTService { data.language = validLanguage; } + if (sttSchema?.extraParams) { + Object.assign(data, sttSchema.extraParams); + } + const headers = { 'Content-Type': 'multipart/form-data', ...(apiKey && { Authorization: `Bearer ${apiKey}` }), @@ -338,7 +342,7 @@ class STTService { try { const [provider, sttSchema] = await this.getProviderSchema(req); - const language = req.body?.language || ''; + const language = req.body?.language || sttSchema?.language || ''; const text = await this.sttRequest(provider, sttSchema, { audioBuffer, audioFile, language }); res.json({ text }); } catch (error) { diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index 9bc3822c4b..fb89c7c486 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -478,6 +478,8 @@ const sttOpenaiSchema = z.object({ url: z.string().optional(), apiKey: z.string(), model: z.string(), + language: z.string().optional(), + extraParams: z.record(z.unknown()).optional(), }); const sttAzureOpenAISchema = z.object({