{"record":{"id":"742056c591cfa825","repo":"langgenius/dify","slug":"no-audio-uploaded","errorCode":"no_audio_uploaded","errorMessage":"Please upload your audio.","messagePattern":"Please upload your audio\\.","errorType":"error_code","errorClass":"NoAudioUploadedError","httpStatus":400,"severity":"error","filePath":"api/controllers/console/app/audio.py","lineNumber":155,"sourceCode":"                app_model=app_model,\n                file=file,\n                session=session,\n                end_user=None,\n            )\n        else:\n            response = AudioService.transcript_agent_asr(\n                app_model=app_model,\n                agent_soul=agent_soul,\n                file=file,\n                session=session,\n                end_user=None,\n            )\n        return dump_response(AudioTranscriptResponse, response)\n    except services.errors.app_model_config.AppModelConfigBrokenError:\n        logger.exception(\"App model config broken.\")\n        raise AppUnavailableError()\n    except NoAudioUploadedServiceError:\n        raise NoAudioUploadedError()\n    except AudioTooLargeServiceError as e:\n        raise AudioTooLargeError(str(e))\n    except UnsupportedAudioTypeServiceError:\n        raise UnsupportedAudioTypeError()\n    except ProviderNotSupportSpeechToTextServiceError:\n        raise ProviderNotSupportSpeechToTextError()\n    except SpeechToTextDisabledServiceError:\n        raise SpeechToTextDisabledError()\n    except ProviderTokenNotInitError as ex:\n        raise ProviderNotInitializeError(ex.description)\n    except QuotaExceededError:\n        raise ProviderQuotaExceededError()\n    except ModelCurrentlyNotSupportError:\n        raise ProviderModelCurrentlyNotSupportError()\n    except InvokeError as e:\n        raise CompletionRequestError(e.description)\n    except HTTPException:\n        raise","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/api/controllers/console/app/audio.py#L137-L173","documentation":"Raised by _transcribe_audio_to_text when AudioService raises NoAudioUploadedServiceError — the multipart request had no usable audio file under 'file' (missing or empty). Translated to NoAudioUploadedError (400, error_code 'no_audio_uploaded'). The console audio endpoint reads request.files.get('file') which can be None.","triggerScenarios":"POST /console/apps/{app_id}/audio-to-text (or /agent/{agent_id}/audio-to-text) without a 'file' part, or with an empty file. The file argument passed to the service is None or empty.","commonSituations":"Frontend sends the audio Blob under the wrong field name; recorder library produced no data; form submitted before the recording finished; cURL request omitted the -F file part.","solutions":["Attach the audio under the 'file' field as multipart/form-data.","Confirm the recording actually produced bytes before submitting (check Blob.size > 0).","Verify the request Content-Type is multipart/form-data, not application/json.","Make the UI disable submit until a non-empty recording exists."],"exampleFix":"// before\nform.append('audio', blob);\n\n// after\nform.append('file', blob, 'message.mp3');","handlingStrategy":"validation","validationCode":"function buildAudioForm(blob) {\n  if (!blob || blob.size === 0) throw new Error('A non-empty audio file is required');\n  const form = new FormData();\n  form.append('file', blob, 'message.mp3');\n  return form;\n}","typeGuard":"const isNonEmptyAudioBlob = (b) => !!b && typeof b.size === 'number' && b.size > 0;","tryCatchPattern":"try { await axios.post(`/apps/${id}/audio-to-text`, form); }\ncatch (e) { if (e.code === 'no_audio_uploaded') alert('Record or attach audio first.'); }","preventionTips":["Use the exact 'file' field name.","Disable submit until the recording has non-zero size.","Let FormData set the Content-Type automatically."],"tags":["audio","asr","file-upload","multipart","console-api","validation"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}