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
{