vercel/ai · error · Error

Prodia multipart response missing job part

Error message

Prodia multipart response missing job part

What it means

The multipart body was parsed successfully, but no part carried content-disposition name="job" containing the JSON job result. The Prodia video model requires this part to attach job metadata (used in providerMetadata) to its result, so it throws when the job part is absent.

Source

Thrown at packages/prodia/src/prodia-video-model.ts:222

      if (contentDisposition.includes('name="job"')) {
        const jsonStr = new TextDecoder().decode(part.body);
        jobResult = await parseJSON({
          text: jsonStr,
          schema: zodSchema(prodiaJobResultSchema),
        });
      } else if (contentDisposition.includes('name="output"')) {
        videoBytes = part.body;
        if (partContentType.startsWith('video/')) {
          videoMediaType = partContentType;
        }
      } else if (partContentType.startsWith('video/')) {
        videoBytes = part.body;
        videoMediaType = partContentType;
      }
    }

    if (!jobResult) {
      throw new Error('Prodia multipart response missing job part');
    }
    if (!videoBytes) {
      throw new Error('Prodia multipart response missing output video');
    }

    return {
      value: { jobResult, videoBytes, videoMediaType },
      responseHeaders,
    };
  };
}

async function resolveVideoFileData(
  file: NonNullable<
    Parameters<NonNullable<VideoModelV4['doGenerate']>>[0]['image']
  >,
  abortSignal?: AbortSignal,
): Promise<{ bytes: Uint8Array; mediaType: string }> {

View on GitHub (pinned to 69428b1f8b)

Solutions

  1. Capture and inspect the raw multipart body (parts and their content-disposition headers) to confirm the job part is genuinely missing.
  2. Update @ai-sdk/prodia to the latest version so parsing matches the current Prodia response format.
  3. Regenerate any mocked or recorded fixtures from a fresh real Prodia response.
  4. Contact Prodia support if a genuine request reproducibly omits the job part.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const video = await generateVideo({ model: prodia.video(modelId), ... });
} catch (error) {
  if (error instanceof Error && error.message === 'Prodia multipart response missing job part') {
    // record raw multipart parts; likely provider format change or stale fixture
  }
  throw error;
}

Prevention

When it happens

Trigger: A Prodia video doGenerate call got a well-formed multipart body, but the parts contained only an output video (or unrelated parts) and no name="job" part — e.g. a provider-side format change or a truncated/stale recorded fixture.

Common situations: Prodia video API contract change on beta endpoints; mocked/test fixtures recorded from an older response shape; middleware mangling content-disposition headers of parts.

Related errors


AI-assisted analysis of vercel/ai@69428b1f8b (2026-08-30). Data as JSON: /api/errors/3a0350b69178ba78. Report an issue: GitHub.