{"record":{"id":"179ba2fbc16a988b","repo":"BerriAI/litellm","slug":"usagemetadata-not-found-in-completion-response-go","errorCode":null,"errorMessage":"usageMetadata not found in completion_response. Got={completion_response}","messagePattern":"usageMetadata not found in completion_response\\. Got=(.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py","lineNumber":1743,"sourceCode":"        URL context also emits groundingMetadata (with groundingChunks but no webSearchQueries),\n        so presence of groundingMetadata alone is not a sufficient signal.\n        See https://ai.google.dev/gemini-api/docs/pricing and\n        https://github.com/BerriAI/litellm/discussions/33198\n        \"\"\"\n        if \"candidates\" not in completion_response:\n            return False\n        for candidate in completion_response[\"candidates\"] or []:\n            grounding_metadata, _, _, _ = VertexGeminiConfig._extract_candidate_metadata(candidate)\n            if VertexGeminiConfig._calculate_web_search_requests(grounding_metadata):\n                return True\n        return False\n\n    @staticmethod\n    def _calculate_usage(\n        completion_response: GenerateContentResponseBody | BidiGenerateContentServerMessage,\n    ) -> Usage:\n        if completion_response is not None and \"usageMetadata\" not in completion_response:\n            raise ValueError(f\"usageMetadata not found in completion_response. Got={completion_response}\")\n        cached_tokens: int | None = None\n        # Separate variables for prompt tokens by modality\n        prompt_audio_tokens: int | None = None\n        prompt_image_tokens: int | None = None\n        prompt_text_tokens: int | None = None\n        prompt_video_tokens: int | None = None\n        prompt_tokens_details: PromptTokensDetailsWrapper | None = None\n        reasoning_tokens: int | None = None\n        response_tokens: int | None = None\n        response_tokens_details: CompletionTokensDetailsWrapper | None = None\n        usage_metadata: Final = completion_response[\"usageMetadata\"]\n\n        def _get_token_count(detail: Mapping[str, object]) -> int:\n            raw_token_count: Final = detail.get(\"tokenCount\", detail.get(\"token_count\", 0))\n            return raw_token_count if isinstance(raw_token_count, int) else 0\n\n        if \"cachedContentTokenCount\" in usage_metadata:\n            cached_tokens = usage_metadata[\"cachedContentTokenCount\"]","sourceCodeStart":1725,"sourceCodeEnd":1761,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/llms/vertex_ai/gemini/vertex_and_google_ai_studio_gemini.py#L1725-L1761","documentation":"Gemini response guard: the completion_response JSON has candidates but no usageMetadata block, so token usage cannot be extracted; the full response is echoed to aid debugging of the unexpected payload shape.","triggerScenarios":"Triggered when the Gemini completion response lacks usageMetadata.","commonSituations":"See trigger scenarios.","solutions":["The completion response lacked usageMetadata; inspect the raw completion_response.","Report to litellm if the Vertex response schema changed."],"exampleFix":"# log completion_response to inspect the returned payload.","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}