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
- 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.
- Soften/reword the prompt and retry; safety-filtered generations often complete with no videos array.
- Try a different model version (e.g. veo-2.0-generate-001 vs veo-3) in a supported region.
- 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
- Inspect the full status payload before downloading; look for error or safety-filter fields.
- Avoid prompts likely to trip safety filters for Veo generations.
- Log status payloads for completed-but-empty operations and report them to your observability stack.
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
- No operation name in Veo response: {response_data}
- No base64 encoded video data found
- Failed to extract video data: {e}
- Failed to parse operation response: {e}
- vertex_project is required for Vertex AI video generation. S
AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18).
Data as JSON: /api/errors/c9483c0ea09a9c8e.
Report an issue: GitHub.