{"record":{"id":"a52f9afd89f77c8c","repo":"vercel/ai","slug":"transcription-failed-transcript-error-unkno","errorCode":null,"errorMessage":"Transcription failed: ${transcript.error ?? 'Unknown error'}","messagePattern":"Transcription failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/assemblyai/src/assemblyai-transcription-model.ts","lineNumber":328,"sourceCode":"          }),\n          requestBodyValues: {},\n        });\n      }\n\n      const rawTranscript = await response.json();\n      const transcript =\n        assemblyaiTranscriptionResponseSchema.parse(rawTranscript);\n\n      if (transcript.status === 'completed') {\n        return {\n          transcript,\n          rawTranscript,\n          responseHeaders: extractResponseHeaders(response),\n        };\n      }\n\n      if (transcript.status === 'error') {\n        throw new Error(\n          `Transcription failed: ${transcript.error ?? 'Unknown error'}`,\n        );\n      }\n\n      await new Promise(resolve => setTimeout(resolve, pollingInterval));\n    }\n  }\n\n  async doGenerate(\n    options: Parameters<TranscriptionModelV4['doGenerate']>[0],\n  ): Promise<Awaited<ReturnType<TranscriptionModelV4['doGenerate']>>> {\n    const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n    const { value: uploadResponse } = await postToApi({\n      url: this.config.url({\n        path: '/v2/upload',\n        modelId: '',\n      }),","sourceCodeStart":310,"sourceCodeEnd":346,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/assemblyai/src/assemblyai-transcription-model.ts#L310-L346","documentation":"After polling, if AssemblyAI reports transcript.status === 'error', the model throws an Error embedding the provider's transcript.error message (or 'Unknown error'). This means the transcription job itself failed on AssemblyAI's side (e.g. audio unreadable), not a transport problem.","triggerScenarios":"waitForCompletion polls GET /v2/transcript/{id} and the response body has status:'error' — e.g. corrupt/empty audio upload, unsupported format, or failed language detection.","commonSituations":"Uploading an empty or truncated audio file; unsupported codec; audio too short; provider-side processing failure.","solutions":["Read the full message for transcript.error and check AssemblyAI's error docs for that code.","Re-upload valid, non-empty audio in a supported format (mp3, wav, flac, m4a, etc.).","Verify the uploaded file's URL is publicly reachable if using upload_url.","Retry only if the error is transient (e.g. internal provider failure)."],"exampleFix":"// before\nconst { transcript } = await model.transcript({ transcriptId }); // throws on status 'error'\n// after\nconst { transcript } = await model.transcript({ transcriptId }).catch(e => {\n  console.error('AssemblyAI job failed:', e.message);\n  throw e;\n});","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const { transcript } = await model.transcript({ transcriptId });\n} catch (e) {\n  if (e instanceof Error && e.message.startsWith('Transcription failed:')) {\n    const providerReason = e.message.replace('Transcription failed: ', '');\n    logger.error({ transcriptId, providerReason }, 'AssemblyAI job failed');\n    return { ok: false, reason: providerReason };\n  }\n  throw e;\n}","preventionTips":["Validate audio files (non-empty, supported format) before upload.","Ensure upload URLs are publicly reachable and unexpired.","Log the embedded transcript.error for diagnosis."],"tags":["transcription","provider-error","polling"],"backgroundTag":"provider-job-failed","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}