{"record":{"id":"dc9537a092dabead","repo":"BerriAI/litellm","slug":"no-operation-name-in-veo-response-response-data-dc9537","errorCode":null,"errorMessage":"No operation name in Veo response: {response_data}","messagePattern":"No operation name in Veo response: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/llms/vertex_ai/videos/transformation.py","lineNumber":398,"sourceCode":"    ) -> VideoObject:\n        \"\"\"\n        Transform the Veo video creation response.\n\n        Veo returns:\n        {\n            \"name\": \"projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL/operations/OPERATION_ID\"\n        }\n\n        We return this as a VideoObject with:\n        - id: operation name (used for polling)\n        - status: \"processing\"\n        - usage: includes duration_seconds and optional video_resolution for cost calculation\n        \"\"\"\n        response_data: Final = _parse_veo_operation(raw_response)\n\n        operation_name: Final = response_data.get(\"name\")\n        if not operation_name:\n            raise ValueError(f\"No operation name in Veo response: {response_data}\")\n\n        if custom_llm_provider:\n            video_id = encode_video_id_with_provider(operation_name, custom_llm_provider, model)\n        else:\n            video_id = operation_name\n\n        video_obj: Final = VideoObject(id=video_id, object=\"video\", status=\"processing\", model=model)\n\n        video_obj.usage = _build_vertex_video_usage_from_request_data(request_data)\n        return video_obj\n\n    def transform_video_status_retrieve_request(\n        self,\n        video_id: str,\n        api_base: str,\n        litellm_params: GenericLiteLLMParams,\n        headers: dict,\n    ) -> tuple[str, dict]:","sourceCodeStart":380,"sourceCodeEnd":416,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/llms/vertex_ai/videos/transformation.py#L380-L416","documentation":"After submitting a Veo predictLongRunning request, LiteLLM parses the operation payload and expects a `name` field like `projects/P/locations/L/publishers/google/models/M/operations/OP` — that name becomes the video ID used for later status polling. If the parsed response contains no `name`, this ValueError fires, meaning the Vertex response is not a normal operation object. Usually the underlying response was an API error body (with `error`) that was not surfaced as an exception, or an unexpected response shape.","triggerScenarios":"A Veo generation call whose HTTP response body lacks \"name\" — e.g. the endpoint returned an error JSON like {\"error\": {\"code\": 429, ...}}, an HTML/quota page parsed into an empty dict, or a model alias that redirects to a different response schema.","commonSituations":"Quota exhaustion or billing-disabled projects returning error bodies; wrong model name causing a different endpoint shape; region mismatch (model not available in vertex_location) producing an error payload; transient GCP control-plane responses.","solutions":["Print the raw response captured in the message — it includes response_data, which shows whether it is an error body (fix the quota/billing/model issue it names).","Confirm the model is available in your region (e.g. veo models are us-central1/global only) and set vertex_location accordingly.","Check Vertex AI quotas and that billing is enabled for the project.","Retry with backoff — transient error bodies during high load can produce this shape."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":"def is_veo_operation(data: dict) -> bool:\n    return isinstance(data, dict) and bool(data.get(\"name\"))","tryCatchPattern":"try:\n    v = litellm.video_generation(model=\"vertex_ai/veo-2.0-generate-001\", prompt=p, vertex_project=proj)\nexcept ValueError as e:\n    if \"No operation name in Veo response\" in str(e):\n        # response body is embedded in the message; log it and retry with backoff\n        log.error(\"veo submit failed, raw=%s\", e)\n        time.sleep(backoff)\n        v = litellm.video_generation(model=\"vertex_ai/veo-2.0-generate-001\", prompt=p, vertex_project=proj)\n    else:\n        raise","preventionTips":["Verify the Veo model is deployed/available in your vertex_location before submitting (veo models are region-limited).","Check quota and billing for aiplatform.googleapis.com upfront.","Log the full error message when this fires — it contains the raw provider response that names the real issue."],"tags":["vertex-ai","veo","video-generation","response-parsing"],"backgroundTag":"malformed-provider-response","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}