{"record":{"id":"428d87af8a35e775","repo":"BerriAI/litellm","slug":"no-operation-name-in-veo-edit-response-response","errorCode":null,"errorMessage":"No operation name in Veo edit response: {response_data}","messagePattern":"No operation name in Veo edit response: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/llms/vertex_ai/videos/transformation.py","lineNumber":752,"sourceCode":"        raw_response: httpx.Response,\n        logging_obj: LiteLLMLoggingObj,\n        custom_llm_provider: str | None = None,\n        request_data: dict | None = None,\n    ) -> VideoObject:\n        \"\"\"\n        Transform the Veo video edit response.\n\n        Veo returns the same operation response as video generation:\n        {\"name\": \"projects/.../operations/OPERATION_ID\"}\n\n        usage includes duration_seconds and optional video_resolution from the\n        edit request parameters 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 edit response: {response_data}\")\n\n        model: Final = self.extract_model_from_operation_name(operation_name) or \"\"\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(\n            id=video_id,\n            object=\"video\",\n            status=\"processing\",\n            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_extension_request(","sourceCodeStart":734,"sourceCodeEnd":770,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/llms/vertex_ai/videos/transformation.py#L734-L770","documentation":"Raised by the Veo edit response transform when the parsed response JSON has no 'name' field. A successful predictLongRunning edit must return an operation name (projects/.../operations/ID) which becomes the new video id used for polling; absence means the call did not return an operation at all — typically an auth/quota/endpoint error body.","triggerScenarios":"The edit POST returns a JSON error body (401/403/429 style) instead of an operation, or the endpoint URL/model in the transformed request is wrong, so _parse_veo_operation yields a dict without 'name'.","commonSituations":"Expired or missing Vertex credentials; malformed api_base overriding the predictLongRunning URL; model name typos returning a 404 body; quota errors with JSON payloads.","solutions":["Log raw_response.text to see the actual error body Google returned","Verify Vertex AI credentials (gcloud auth, service account JSON) and that aiplatform.googleapis.com is enabled","Check the model id and that you are calling a model which supports editing (e.g. veo variants)","Confirm no custom api_base/proxy is rewriting the predictLongRunning path"],"exampleFix":"# before\nresult = litellm.video_edit(video_id=vid, prompt=\"...\", custom_llm_provider=\"vertex_ai\")\n\n# after (debug the raw body first)\ntry:\n    result = litellm.video_edit(video_id=vid, prompt=\"...\", custom_llm_provider=\"vertex_ai\")\nexcept ValueError as e:\n    print(response_body_if_available)  # or re-issue the POST with httpx to inspect .text\n    raise","handlingStrategy":"try-catch","validationCode":"def veo_edit_response_has_operation(response_json: dict) -> bool:\n    return isinstance(response_json.get(\"name\"), str) and \"operations/\" in response_json[\"name\"]\n\nif not veo_edit_response_has_operation(resp.json()):\n    raise RuntimeError(f\"edit call did not return an operation: {resp.text}\")","typeGuard":"def is_veo_operation_response(data: object) -> bool:\n    return isinstance(data, dict) and isinstance(data.get(\"name\"), str)","tryCatchPattern":"try:\n    result = litellm.video_edit(video_id=vid, prompt=p, custom_llm_provider=\"vertex_ai\")\nexcept ValueError as e:\n    if \"No operation name in Veo edit response\" in str(e):\n        # upstream returned an error body: re-issue with httpx or check creds/quota\n        raise RuntimeError(f\"veo edit rejected: likely auth/quota — check credentials\") from e\n    raise","preventionTips":["Verify Vertex credentials and API enablement before starting edit workflows","Log raw response bodies whenever an operation name is missing","Double-check model ids and avoid overriding api_base for Veo calls"],"tags":["vertex-ai","veo","video-edit","response-parsing","auth"],"backgroundTag":"missing-response-field","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}