{"record":{"id":"e824d0971267b891","repo":"BerriAI/litellm","slug":"error-transforming-content-delta-events-e-got","errorCode":null,"errorMessage":"Error transforming content delta events: {e}, got message: {message}","messagePattern":"Error transforming content delta events: (.+?), got message: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/llms/gemini/realtime/transformation.py","lineNumber":737,"sourceCode":"        return response_items\n\n    def transform_content_delta_events(\n        self,\n        message: BidiGenerateContentServerContent,\n        output_item_id: str,\n        response_id: str,\n        delta_type: ALL_DELTA_TYPES,\n    ) -> OpenAIRealtimeResponseDelta:\n        delta = \"\"\n        try:\n            if \"modelTurn\" in message and \"parts\" in message[\"modelTurn\"]:\n                for part in message[\"modelTurn\"][\"parts\"]:\n                    if \"text\" in part:\n                        delta += part[\"text\"]\n                    elif \"inlineData\" in part:\n                        delta += part[\"inlineData\"].get(\"data\", \"\")\n        except Exception as e:\n            raise ValueError(f\"Error transforming content delta events: {e}, got message: {message}\")\n\n        return OpenAIRealtimeResponseDelta(\n            type=(\"response.output_text.delta\" if delta_type == \"text\" else \"response.output_audio.delta\"),\n            content_index=0,\n            event_id=f\"event_{uuid.uuid4()}\",\n            item_id=output_item_id,\n            output_index=0,\n            response_id=response_id,\n            delta=delta,\n        )\n\n    def transform_content_done_event(\n        self,\n        delta_chunks: list[OpenAIRealtimeResponseDelta] | None,\n        current_output_item_id: str | None,\n        current_response_id: str | None,\n        delta_type: ALL_DELTA_TYPES,\n    ) -> OpenAIRealtimeResponseTextDone | OpenAIRealtimeResponseAudioDone:","sourceCodeStart":719,"sourceCodeEnd":755,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/llms/gemini/realtime/transformation.py#L719-L755","documentation":"Raised in transform_content_delta_event when any exception occurs while walking message['modelTurn']['parts'] and accumulating 'text' / 'inlineData.data' values — for example a part is not a dict, inlineData is not a dict, or keys are missing in unexpected ways. The original exception is wrapped in a ValueError together with the raw message for diagnosis.","triggerScenarios":"A serverContent delta frame whose modelTurn.parts entries have an unexpected shape (part is a string, inlineData missing 'data' as a dict, None entries), causing AttributeError/TypeError inside the accumulation loop.","commonSituations":"Gemini API schema drift on the streaming path; partially decoded frames from a flaky proxy; litellm version older than the current Gemini realtime wire format.","solutions":["Upgrade litellm to the latest release (streaming schema fixes land frequently).","Log e.args to capture the wrapped message and confirm the frame shape; report it if it's a new server format.","Wrap per-frame transformation in try/except to drop corrupt frames instead of ending the stream."],"exampleFix":"# before\ndelta = config.transform_content_delta_event(message, item_id, resp_id, delta_type)\n\n# after\ntry:\n    delta = config.transform_content_delta_event(message, item_id, resp_id, delta_type)\nexcept ValueError as e:\n    logger.warning('Dropping malformed delta frame: %s', e)\n    delta = None\n","handlingStrategy":"try-catch","validationCode":"def is_wellformed_delta_frame(message: dict) -> bool:\n    try:\n        parts = message[\"modelTurn\"][\"parts\"]\n    except (KeyError, TypeError):\n        return False\n    return all(\n        isinstance(p, dict) and (\"text\" in p or isinstance(p.get(\"inlineData\"), dict))\n        for p in parts\n    )","typeGuard":"def is_wellformed_delta_frame(message: object) -> bool:\n    if not isinstance(message, dict):\n        return False\n    turn = message.get(\"modelTurn\")\n    if not isinstance(turn, dict) or not isinstance(turn.get(\"parts\"), list):\n        return False\n    return all(\n        isinstance(p, dict) and (\"text\" in p or isinstance(p.get(\"inlineData\"), dict))\n        for p in turn[\"parts\"]\n    )","tryCatchPattern":"try:\n    delta = config.transform_content_delta_event(message, item_id, resp_id, delta_type)\nexcept ValueError as e:\n    if \"Error transforming content delta\" in str(e):\n        logger.warning(\"Dropping malformed delta frame: %s\", e)\n        delta = None\n    else:\n        raise","preventionTips":["Treat single malformed delta frames as droppable; never let them end the stream.","Capture and report the raw frame embedded in the error to detect schema drift.","Keep litellm updated alongside Gemini realtime API changes."],"tags":["gemini","realtime","parsing","streaming","error-wrapping"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}