BerriAI/litellm · error · ValueError

No operation name in Veo response: {response_data}

Error message

No operation name in Veo response: {response_data}

What it means

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.

Source

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

    ) -> VideoObject:
        """
        Transform the Veo video creation response.

        Veo returns:
        {
            "name": "projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL/operations/OPERATION_ID"
        }

        We return this as a VideoObject with:
        - id: operation name (used for polling)
        - status: "processing"
        - usage: includes duration_seconds and optional video_resolution for cost calculation
        """
        response_data: Final = _parse_veo_operation(raw_response)

        operation_name: Final = response_data.get("name")
        if not operation_name:
            raise ValueError(f"No operation name in Veo response: {response_data}")

        if custom_llm_provider:
            video_id = encode_video_id_with_provider(operation_name, custom_llm_provider, model)
        else:
            video_id = operation_name

        video_obj: Final = VideoObject(id=video_id, object="video", status="processing", model=model)

        video_obj.usage = _build_vertex_video_usage_from_request_data(request_data)
        return video_obj

    def transform_video_status_retrieve_request(
        self,
        video_id: str,
        api_base: str,
        litellm_params: GenericLiteLLMParams,
        headers: dict,
    ) -> tuple[str, dict]:

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. 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).
  2. Confirm the model is available in your region (e.g. veo models are us-central1/global only) and set vertex_location accordingly.
  3. Check Vertex AI quotas and that billing is enabled for the project.
  4. Retry with backoff — transient error bodies during high load can produce this shape.
Defensive patterns

Strategy: retry

Type guard

def is_veo_operation(data: dict) -> bool:
    return isinstance(data, dict) and bool(data.get("name"))

Try / catch

try:
    v = litellm.video_generation(model="vertex_ai/veo-2.0-generate-001", prompt=p, vertex_project=proj)
except ValueError as e:
    if "No operation name in Veo response" in str(e):
        # response body is embedded in the message; log it and retry with backoff
        log.error("veo submit failed, raw=%s", e)
        time.sleep(backoff)
        v = litellm.video_generation(model="vertex_ai/veo-2.0-generate-001", prompt=p, vertex_project=proj)
    else:
        raise

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


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