{"record":{"id":"75f1674af9ae8d68","repo":"calesthio/OpenMontage","slug":"doubao-task-completed-but-did-not-return-data-audi","errorCode":null,"errorMessage":"Doubao task completed but did not return data.audio_url","messagePattern":"Doubao task completed but did not return data\\.audio_url","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"tools/audio/doubao_tts.py","lineNumber":256,"sourceCode":"        self._raise_for_doubao_error(submit_response.status_code, submit_data)\n\n        task_id = submit_data.get(\"data\", {}).get(\"task_id\")\n        if not task_id:\n            raise RuntimeError(\"Doubao submit succeeded but did not return data.task_id\")\n\n        query_data = self._poll_query(\n            requests_module=requests,\n            api_key=api_key,\n            resource_id=resource_id,\n            task_id=task_id,\n            return_usage=bool(inputs.get(\"return_usage\", True)),\n            poll_interval=float(inputs.get(\"poll_interval_seconds\", 2.0)),\n            timeout_seconds=int(inputs.get(\"timeout_seconds\", 300)),\n        )\n        data = query_data.get(\"data\", {})\n        audio_url = data.get(\"audio_url\")\n        if not audio_url:\n            raise RuntimeError(\"Doubao task completed but did not return data.audio_url\")\n\n        audio_response = requests.get(audio_url, timeout=(10, 120))\n        audio_response.raise_for_status()\n        output_path.write_bytes(audio_response.content)\n        metadata_path.write_text(json.dumps(query_data, ensure_ascii=False, indent=2) + \"\\n\", encoding=\"utf-8\")\n\n        audio_duration = self._audio_duration(output_path)\n        usage = data.get(\"usage\")\n        cost = self._cost_from_usage(usage) or self.estimate_cost(inputs)\n\n        return ToolResult(\n            success=True,\n            data={\n                \"provider\": self.provider,\n                \"model\": resource_id,\n                \"resource_id\": resource_id,\n                \"voice_id\": voice_id,\n                \"format\": fmt,","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/calesthio/OpenMontage/blob/95e1c3d0ab93482159818560f6a8c8e866b9139f/tools/audio/doubao_tts.py#L238-L274","documentation":"Raised when the Doubao async TTS polling loop reports task_status == 2 (success) but the returned data object contains no audio_url. The wrapper refuses to continue because the next step downloads the audio from that URL. The literal-brace message never interpolates, so the actual payload is invisible unless you instrument it.","triggerScenarios":"QUERY_URL returns status 2 with data.audio_url missing/null/empty — expired or purged audio, partial server-side success, or an envelope change in the query response.","commonSituations":"Long polls where the audio expired between completion and query; region/console migration altering the response schema; account state (quota exhausted mid-task) producing a 'succeeded' status with no artifact.","solutions":["Persist query_data to a debug log and inspect which keys data actually carries (sometimes the URL moved to data.audio.url or similar)","Retry the whole submit — a fresh task usually produces a fresh audio_url","Shorten the gap between completion and download by lowering poll_interval_seconds","Confirm the resource_id/endpoint pairing matches the current Volcengine console"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"for attempt in range(2):\n    try:\n        result = doubao_tool.execute(inputs)\n        break\n    except RuntimeError as e:\n        if \"audio_url\" in str(e) and attempt == 0:\n            continue  # re-submit: completed task lost its artifact\n        raise","preventionTips":["Keep poll_interval_seconds small so download happens soon after completion","Persist metadata_path output so any successful query payload is auditable","Treat missing-audio_url-on-success as retryable, not as a config bug"],"tags":["doubao","tts","api-contract","polling"],"backgroundTag":null,"analyzedSha":"95e1c3d0ab93482159818560f6a8c8e866b9139f","analyzedAt":"2026-08-15T06:31:20.014Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}