From b82d073d76740a485641db917da60e182dfdffc2 Mon Sep 17 00:00:00 2001 From: "Ram.Type-0" <39725073+RamType0@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:36:19 +0900 Subject: [PATCH 1/3] Fix #10389 Use `JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping` --- .../AI/FunctionCalling/FunctionCallsProcessor.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs b/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs index 5fe03ebb925d..d050156a431c 100644 --- a/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs +++ b/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs @@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.CompilerServices; +using System.Text.Encodings.Web; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -490,6 +491,10 @@ public static string ProcessFunctionResult(object functionResult) return chatMessageContent.ToString(); } - return JsonSerializer.Serialize(functionResult); + return JsonSerializer.Serialize(functionResult, s_functionResultSerializerOptions); } + private static readonly JsonSerializerOptions s_functionResultSerializerOptions = new() + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; } From d5ac12adb05d1d55927bd26a4e9ec0f74b825c2a Mon Sep 17 00:00:00 2001 From: "Ram.Type-0" <39725073+RamType0@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:52:50 +0900 Subject: [PATCH 2/3] Add some documents to private field --- .../AI/FunctionCalling/FunctionCallsProcessor.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs b/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs index d050156a431c..e1d3685238e5 100644 --- a/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs +++ b/dotnet/src/InternalUtilities/connectors/AI/FunctionCalling/FunctionCallsProcessor.cs @@ -493,6 +493,13 @@ public static string ProcessFunctionResult(object functionResult) return JsonSerializer.Serialize(functionResult, s_functionResultSerializerOptions); } + + /// + /// The which will be used in . + /// + /// + /// is very likely to escape characters and generates LLM unfriendly results by default. + /// private static readonly JsonSerializerOptions s_functionResultSerializerOptions = new() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, From 035d1ae7f951ef951a0080037660a5b56f14a7e5 Mon Sep 17 00:00:00 2001 From: "Ram.Type-0" Date: Sat, 8 Feb 2025 03:02:30 +0900 Subject: [PATCH 3/3] Add tests --- .../AIConnectors/FunctionCallsProcessorTests.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dotnet/src/SemanticKernel.UnitTests/Utilities/AIConnectors/FunctionCallsProcessorTests.cs b/dotnet/src/SemanticKernel.UnitTests/Utilities/AIConnectors/FunctionCallsProcessorTests.cs index 6f0b40f8e82d..c6559f1eac0f 100644 --- a/dotnet/src/SemanticKernel.UnitTests/Utilities/AIConnectors/FunctionCallsProcessorTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/Utilities/AIConnectors/FunctionCallsProcessorTests.cs @@ -824,6 +824,19 @@ public void ItShouldSerializeFunctionResultsOfComplexType() Assert.Equal("{\"a\":2,\"b\":\"test\"}", result); } + [Fact] + public void ItShouldSerializeFunctionResultsWithStringProperties() + { + // Arrange + var functionResult = new { Text = "テスト" }; + + // Act + var result = FunctionCallsProcessor.ProcessFunctionResult(functionResult); + + // Assert + Assert.Equal("{\"Text\":\"テスト\"}", result); + } + private sealed class AutoFunctionInvocationFilter( Func, Task>? onAutoFunctionInvocation) : IAutoFunctionInvocationFilter {