From 0966885b48963d939e45db5925a4f0edd3aafa51 Mon Sep 17 00:00:00 2001 From: dfedoryshchev Date: Fri, 24 Jul 2026 23:48:01 +0100 Subject: [PATCH 1/2] .Net: Fix GeminiPromptExecutionSettings.Clone dropping Labels and CachedContent --- .../GeminiPromptExecutionSettingsTests.cs | 4 ++++ .../Connectors.Google/GeminiPromptExecutionSettings.cs | 2 ++ 2 files changed, 6 insertions(+) diff --git a/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs b/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs index 2eb2500b1a2e..d7efe987945c 100644 --- a/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs +++ b/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs @@ -207,6 +207,8 @@ public void PromptExecutionSettingsCloneWorksAsExpected(string thinkingConfigJso "threshold": "{{threshold.Label}}" } ], + "labels": { "env": "test", "team": "sk" }, + "cached_content": "projects/p/locations/l/cachedContents/c", "thinking_config": {{thinkingConfigJson}} } """; @@ -224,6 +226,8 @@ public void PromptExecutionSettingsCloneWorksAsExpected(string thinkingConfigJso Assert.Equivalent(executionSettings.SafetySettings, clone.SafetySettings); Assert.Equal(executionSettings.AudioTimestamp, clone.AudioTimestamp); Assert.Equivalent(executionSettings.ThinkingConfig, clone.ThinkingConfig); + Assert.Equivalent(executionSettings.Labels, clone.Labels); + Assert.Equal(executionSettings.CachedContent, clone.CachedContent); } [Fact] diff --git a/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs index a9729f518899..bcb9ba990925 100644 --- a/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs @@ -338,6 +338,8 @@ public override PromptExecutionSettings Clone() AudioTimestamp = this.AudioTimestamp, ResponseMimeType = this.ResponseMimeType, ResponseSchema = this.ResponseSchema, + Labels = this.Labels is not null ? new Dictionary(this.Labels) : null, + CachedContent = this.CachedContent, ThinkingConfig = this.ThinkingConfig?.Clone() }; } From 708e0c1e17d312cf9f59a6315417d269102aac26 Mon Sep 17 00:00:00 2001 From: dfedoryshchev Date: Fri, 31 Jul 2026 21:09:30 +0100 Subject: [PATCH 2/2] .Net: Copy ServiceId and FunctionChoiceBehavior in GeminiPromptExecutionSettings.Clone Cloning also dropped the base ServiceId and FunctionChoiceBehavior properties. Losing FunctionChoiceBehavior disables function calling on the clone, since FromExecutionSettings derives ToolCallBehavior from it. --- .../GeminiPromptExecutionSettingsTests.cs | 6 +++++- .../Connectors.Google/GeminiPromptExecutionSettings.cs | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs b/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs index d7efe987945c..ec5319176f53 100644 --- a/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs +++ b/dotnet/src/Connectors/Connectors.Google.UnitTests/GeminiPromptExecutionSettingsTests.cs @@ -194,6 +194,7 @@ public void PromptExecutionSettingsCloneWorksAsExpected(string thinkingConfigJso string json = $$""" { "model_id": "gemini-pro", + "service_id": "gemini-service", "temperature": 0.7, "top_p": 0.7, "top_k": 25, @@ -213,13 +214,15 @@ public void PromptExecutionSettingsCloneWorksAsExpected(string thinkingConfigJso } """; var executionSettings = JsonSerializer.Deserialize(json); + executionSettings!.FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(); // Act - var clone = executionSettings!.Clone() as GeminiPromptExecutionSettings; + var clone = executionSettings.Clone() as GeminiPromptExecutionSettings; // Assert Assert.NotNull(clone); Assert.Equal(executionSettings.ModelId, clone.ModelId); + Assert.Equal(executionSettings.ServiceId, clone.ServiceId); Assert.Equal(executionSettings.Temperature, clone.Temperature); Assert.Equivalent(executionSettings.ExtensionData, clone.ExtensionData); Assert.Equivalent(executionSettings.StopSequences, clone.StopSequences); @@ -228,6 +231,7 @@ public void PromptExecutionSettingsCloneWorksAsExpected(string thinkingConfigJso Assert.Equivalent(executionSettings.ThinkingConfig, clone.ThinkingConfig); Assert.Equivalent(executionSettings.Labels, clone.Labels); Assert.Equal(executionSettings.CachedContent, clone.CachedContent); + Assert.Same(executionSettings.FunctionChoiceBehavior, clone.FunctionChoiceBehavior); } [Fact] diff --git a/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs index bcb9ba990925..15f37ac90ead 100644 --- a/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.Google/GeminiPromptExecutionSettings.cs @@ -326,6 +326,8 @@ public override PromptExecutionSettings Clone() return new GeminiPromptExecutionSettings() { ModelId = this.ModelId, + ServiceId = this.ServiceId, + FunctionChoiceBehavior = this.FunctionChoiceBehavior, ExtensionData = this.ExtensionData is not null ? new Dictionary(this.ExtensionData) : null, Temperature = this.Temperature, TopP = this.TopP,