{"record":{"id":"dd2cf41a4d691913","repo":"Comfy-Org/ComfyUI","slug":"unsupported-audio-format-format-r","errorCode":null,"errorMessage":"Unsupported audio format: {format!r}","messagePattern":"Unsupported audio format: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api/latest/_ui.py","lineNumber":275,"sourceCode":"        return SavedImages([result], is_animated=len(images) > 1)\n\n\nclass AudioSaveHelper:\n    \"\"\"A helper class with static methods to handle audio saving and metadata.\"\"\"\n    _OPUS_RATES = [8000, 12000, 16000, 24000, 48000]\n    _FORMATS = {\"flac\", \"mp3\", \"opus\"}\n\n    @staticmethod\n    def save_audio(\n        audio: dict,\n        filename_prefix: str,\n        folder_type: FolderType,\n        cls: type[ComfyNode] | None,\n        format: str = \"flac\",\n        quality: str = \"128k\",\n    ) -> list[SavedResult]:\n        if format not in AudioSaveHelper._FORMATS:\n            raise ValueError(f\"Unsupported audio format: {format!r}\")\n\n        full_output_folder, filename, counter, subfolder, _ = folder_paths.get_save_image_path(\n            filename_prefix, _get_directory_by_folder_type(folder_type)\n        )\n\n        metadata = {}\n        if not args.disable_metadata and cls is not None:\n            if cls.hidden.prompt is not None:\n                metadata[\"prompt\"] = json.dumps(cls.hidden.prompt)\n            if cls.hidden.extra_pnginfo is not None:\n                for x in cls.hidden.extra_pnginfo:\n                    metadata[x] = json.dumps(cls.hidden.extra_pnginfo[x])\n\n        results = []\n        for batch_number, waveform in enumerate(audio[\"waveform\"].cpu()):\n            filename_with_batch_num = filename.replace(\"%batch_num%\", str(batch_number))\n            file = f\"{filename_with_batch_num}_{counter:05}.{format}\"\n            output_path = os.path.join(full_output_folder, file)","sourceCodeStart":257,"sourceCodeEnd":293,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api/latest/_ui.py#L257-L293","documentation":"AudioSaveHelper.save_audio (comfy_api/latest/_ui.py) writes audio with soundfile/ffmpeg-backed encoders and only accepts formats in {'flac','mp3','opus'} as defined by the class-level _FORMATS set. Any other format string ('wav', 'aac', 'ogg'…) fails an explicit allowlist check before any file IO.","triggerScenarios":"Calling save_audio with a format argument outside {'flac','mp3','opus'} — typically passed straight through from a SaveAudio-style node's format widget or an API request field.","commonSituations":"Custom nodes extending the format combo with wav/aac without extending _FORMATS; API clients sending arbitrary strings; frontend/backend option lists out of sync after an upgrade.","solutions":["Use one of the supported formats: 'flac' (lossless default), 'mp3', or 'opus'","If you maintain the node, keep the format widget list limited to AudioSaveHelper._FORMATS","Need wav? Save as flac (also lossless) or convert externally after export"],"exampleFix":"// before\nsave_audio(audio, prefix, folder_type, cls, format='wav')\n\n// after\nsave_audio(audio, prefix, folder_type, cls, format='flac')","handlingStrategy":"validation","validationCode":"SUPPORTED = {'flac', 'mp3', 'opus'}\nif format not in SUPPORTED:\n    raise ValueError(f'format must be one of {sorted(SUPPORTED)}, got {format!r}')","typeGuard":"def is_supported_audio_format(f) -> bool:\n    return isinstance(f, str) and f in {'flac', 'mp3', 'opus'}","tryCatchPattern":null,"preventionTips":["Derive UI format options from AudioSaveHelper._FORMATS so frontend and backend never diverge","Default to flac for lossless output"],"tags":["audio","format","allowlist","save"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}