{"record":{"id":"5d18077d248523fd","repo":"jitsi/jitsi-meet","slug":"audio-translation-request-failed-error-for","errorCode":null,"errorMessage":"Audio translation request failed: ${error} for [${endpointIds.join(', ')}]","messagePattern":"Audio translation request failed: (.+?) for \\[(.+?)\\]","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"react/features/audio-translation/middleware.any.ts","lineNumber":100,"sourceCode":"    }\n\n    return result;\n});\n\n/**\n * Surfaces audio-translation request failures reported by the bridge-side component: shows a notification and\n * resets translation state (redux + lib-jitsi-meet) so the UI reflects the failure and re-enabling works.\n */\nStateListenerRegistry.register(\n    state => state['features/base/conference'].conference,\n    (conference, { dispatch }, previousConference) => {\n        if (!conference || previousConference) {\n            return;\n        }\n\n        conference.on(JitsiConferenceEvents.AUDIO_TRANSLATION_FAILED,\n            ({ endpointIds, error }: { endpointIds: string[]; error: string; }) => {\n                logger.warn(`Audio translation request failed: ${error} for [${endpointIds.join(', ')}]`);\n\n                dispatch(showErrorNotification({\n                    titleKey: ERROR_NOTIFICATION_KEYS[error] ?? DEFAULT_ERROR_KEY\n                }, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));\n\n                // The optimistic selection didn't take. Reset everything: clears redux (UI reflects off)\n                // and, via conference.clearTranslation(), resets lib-jitsi-meet's language state so\n                // re-enabling isn't deduped to a no-op.\n                dispatch(clearAudioTranslation());\n            });\n    });\n\n/**\n * Ingests the two per-participant translation signals from the conference: which translated sources the bridge\n * is forwarding to us (receiving), and which remote participants are translating us (enabled). Both are cleared\n * when the conference goes away.\n */\nStateListenerRegistry.register(","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/jitsi/jitsi-meet/blob/98de6219cc7ddbe07ace9fde045aff90a242ba01/react/features/audio-translation/middleware.any.ts#L82-L118","documentation":"This is a logger.warn emitted in the audio-translation middleware when the JitsiConference fires AUDIO_TRANSLATION_FAILED for a batch of endpoint IDs — the server rejected or failed the request to translate audio for those endpoints. It is not a thrown exception; it accompanies a user-facing error notification and a redux reset of the optimistic translation selection.","triggerScenarios":"Subscribing to AUDIO_TRANSLATION_FAILED on the conference and the backend (translator bridge/Jigasi-style service) returning an error for the requested endpointIds: unsupported target language, translator capacity/availability failure, invalid endpoint IDs, or conference-level translation not enabled on the server.","commonSituations":"Deployments without the audio translation service configured; requesting a language the backend doesn't support; endpoints leaving the conference while a translation is requested; version mismatch between lib-jitsi-meet events and the backend bridge; scale/capacity errors on the translation service.","solutions":["Verify the server-side audio translation component is deployed/enabled and supports the requested languages","Check that endpointIds still exist in the conference (request fresh translation after participant churn)","Inspect the raw error string in the log to distinguish unsupported-language vs capacity vs connectivity failures","Upgrade/align lib-jitsi-meet and backend versions so AUDIO_TRANSLATION_FAILED payloads match the ERROR_NOTIFICATION_KEYS mapping"],"exampleFix":"// before\nlogger.warn(`Audio translation request failed: ${error} for [${endpointIds.join(', ')}]`);\n\n// after (classify and make the failure actionable)\nlogger.warn(`Audio translation request failed: ${error} for [${endpointIds.join(', ')}]`, {\n    endpoints: endpointIds,\n    reason: ERROR_NOTIFICATION_KEYS[error] ?? DEFAULT_ERROR_KEY\n});\ndispatch(showErrorNotification({\n    titleKey: ERROR_NOTIFICATION_KEYS[error] ?? DEFAULT_ERROR_KEY\n}, NOTIFICATION_TIMEOUT_TYPE.MEDIUM));","handlingStrategy":"fallback","validationCode":"const conference = getCurrentConference(state);\nconst supported = conference?.isAudioTranslationSupported?.(); // capability probe\nif (!supported) {\n    // hide/disable translation UI instead of dispatching a doomed request\n}","typeGuard":"const isTranslatableEndpoint = (id: string, conference: any): boolean =>\n    conference.getParticipants().some(p => p.getId() === id);","tryCatchPattern":"// No thrown exception: handle the event payload\ncurrent.on(JitsiConferenceEvents.AUDIO_TRANSLATION_FAILED, ({ endpointIds, error }) => {\n    logger.warn(`Audio translation request failed: ${error}`, { endpointIds });\n    dispatch(showErrorNotification({ titleKey: ERROR_NOTIFICATION_KEYS[error] ?? DEFAULT_ERROR_KEY }));\n    resetTranslationSelection(); // middleware already resets optimistic state\n});","preventionTips":["Verify backend translation service availability before enabling the UI","Re-validate endpoint IDs right before requesting translation","Map known server error strings to friendly notification keys and keep that map in sync"],"tags":["audio-translation","jitsi-conference","logging","backend-service"],"backgroundTag":"audio-translation-request-failed","analyzedSha":"98de6219cc7ddbe07ace9fde045aff90a242ba01","analyzedAt":"2026-08-28T15:15:59.482Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}