BerriAI/litellm · error · ValueError

No video data found in completed operation

Error message

No video data found in completed operation

What it means

Raised during Veo content download when the operation reports done=true but `response.videos` is missing or an empty list. The completion path expects at least one video object carrying the base64 payload; an empty list means the operation finished without producing retrievable video data — typically because generation actually failed (negative-safety filters, internal error) but the operation was still marked done, or the response used a different schema (e.g. Reresponse/gcsUri-only variants).

Source

Thrown at litellm/llms/vertex_ai/videos/transformation.py:556

    ) -> bytes:
        """
        Transform the Veo video content download response.

        Extracts the base64 encoded video from the response and decodes it to bytes.
        """
        response_data: Final = _parse_veo_operation(raw_response)

        if not response_data.get("done", False):
            raise ValueError(
                "Video generation is not complete yet. Please check status with video_status() before downloading."
            )

        try:
            video_response: Final = response_data.get("response", {})
            videos: Final = video_response.get("videos", [])

            if not videos or len(videos) == 0:
                raise ValueError("No video data found in completed operation")

            # Get the first video
            video_data: Final = videos[0]
            base64_encoded: Final = video_data.get("bytesBase64Encoded")

            if not base64_encoded:
                raise ValueError("No base64 encoded video data found")

            # Decode base64 to bytes
            video_bytes: Final = base64.b64decode(base64_encoded)
            return video_bytes

        except (KeyError, IndexError) as e:
            raise ValueError(f"Failed to extract video data: {e}")

    def transform_video_remix_request(
        self,
        video_id: str,

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Inspect the full operation response via video_status(video_id=...) — look for an error/filtered reason or a gcsUri-style result instead of inline bytes.
  2. Soften/reword the prompt and retry; safety-filtered generations often complete with no videos array.
  3. Try a different model version (e.g. veo-2.0-generate-001 vs veo-3) in a supported region.
  4. Upgrade litellm if the response schema changed for your Veo model.
Defensive patterns

Strategy: validation

Type guard

def veo_operation_has_video(status_payload: dict) -> bool:
    resp = status_payload.get("response") or {}
    return bool(resp.get("videos")) and len(resp["videos"]) > 0

Try / catch

try:
    content = litellm.retrieve_video_content(video_id=vid, vertex_project=proj)
except ValueError as e:
    if "No video data found" in str(e):
        st = litellm.video_status(video_id=vid, vertex_project=proj)
        # inspect st for error/filter/gcsUri and either fail with details or adjust prompt and resubmit
        raise RuntimeError(f"Veo completed without video payload: {st}") from e
    raise

Prevention

When it happens

Trigger: Prompt rejected by Veo safety filters causing the operation to complete with no artifacts; model versions returning only a gcsUri field under a different key; partially successful multi-segment generations where videos was pruned.

Common situations: Prompts with violence/copyright/celebrity content silently filtered; using newer Veo model versions whose response shape differs from what the parser expects; regional outages producing done-but-empty responses.

Related errors


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/c9483c0ea09a9c8e. Report an issue: GitHub.