From a0043494a0ab9f8b7ee4c85fc4e72a383c86e370 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 22 May 2026 21:33:07 +0000 Subject: [PATCH] fix(gemini realtime): deep-merge nested config in follow-up session update Previously, the follow-up setup performed a shallow merge between the original setup and new overrides. If a session.update touched any field inside generationConfig (e.g. modalities), the entire generationConfig would be replaced, silently dropping unrelated sub-keys like temperature or maxOutputTokens. Apply the same deep-merge to realtimeInputConfig so partial automatic-activity-detection updates don't drop other realtime input config fields either. Co-authored-by: Yassin Kortam --- .../llms/gemini/realtime/transformation.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/litellm/llms/gemini/realtime/transformation.py b/litellm/llms/gemini/realtime/transformation.py index a1df67e9a98..29c7df8f289 100644 --- a/litellm/llms/gemini/realtime/transformation.py +++ b/litellm/llms/gemini/realtime/transformation.py @@ -349,6 +349,27 @@ class GeminiRealtimeConfig(BaseRealtimeConfig): **new_overrides, "model": f"models/{model}", } + # Deep-merge nested config dicts so that a partial session.update + # (e.g. only ``modalities``) does not silently drop unrelated + # sub-keys (e.g. ``temperature``) from the original setup. + original_generation_config = original_setup.get("generationConfig") + new_generation_config = new_overrides.get("generationConfig") + if isinstance(original_generation_config, dict) and isinstance( + new_generation_config, dict + ): + follow_up_setup["generationConfig"] = { + **original_generation_config, + **new_generation_config, + } + original_realtime_input_config = original_setup.get("realtimeInputConfig") + new_realtime_input_config = new_overrides.get("realtimeInputConfig") + if isinstance(original_realtime_input_config, dict) and isinstance( + new_realtime_input_config, dict + ): + follow_up_setup["realtimeInputConfig"] = { + **original_realtime_input_config, + **new_realtime_input_config, + } verbose_logger.debug( "Gemini Realtime: Forwarding session.update as follow-up setup" )