diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props index b3d2c48aa69e..280aa3d77d4c 100644 --- a/dotnet/Directory.Packages.props +++ b/dotnet/Directory.Packages.props @@ -94,10 +94,10 @@ - - - - + + + + diff --git a/dotnet/samples/GettingStartedWithProcesses/Step04/SchemaGenerator.cs b/dotnet/samples/GettingStartedWithProcesses/Step04/SchemaGenerator.cs index 5350e2c53d6e..77632832b023 100644 --- a/dotnet/samples/GettingStartedWithProcesses/Step04/SchemaGenerator.cs +++ b/dotnet/samples/GettingStartedWithProcesses/Step04/SchemaGenerator.cs @@ -1,6 +1,4 @@ // Copyright (c) Microsoft. All rights reserved. -using System.Text.Json; -using System.Text.Json.Serialization; using Microsoft.Extensions.AI; using Microsoft.SemanticKernel; @@ -8,21 +6,21 @@ namespace Step04; internal static class JsonSchemaGenerator { + private static readonly AIJsonSchemaCreateOptions s_config = new() + { + TransformOptions = new() + { + DisallowAdditionalProperties = true, + RequireAllProperties = true, + MoveDefaultKeywordToDescription = true, + } + }; + /// /// Wrapper for generating a JSON schema as string from a .NET type. /// public static string FromType() { - JsonSerializerOptions options = new(JsonSerializerOptions.Default) - { - UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow, - }; - AIJsonSchemaCreateOptions config = new() - { - IncludeSchemaKeyword = false, - DisallowAdditionalProperties = true, - }; - - return KernelJsonSchemaBuilder.Build(typeof(TSchemaType), "Intent Result", config).AsJson(); + return KernelJsonSchemaBuilder.Build(typeof(TSchemaType), "Intent Result", s_config).AsJson(); } } diff --git a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiRequest.cs b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiRequest.cs index f2e6c1819224..c5152ae979e5 100644 --- a/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiRequest.cs +++ b/dotnet/src/Connectors/Connectors.Google/Core/Gemini/Models/GeminiRequest.cs @@ -15,12 +15,12 @@ namespace Microsoft.SemanticKernel.Connectors.Google.Core; internal sealed class GeminiRequest { private static JsonSerializerOptions? s_options; - private static readonly AIJsonSchemaCreateOptions s_schemaOptions = new() + private static readonly AIJsonSchemaCreateOptions s_schemaConfiguration = new() { - IncludeSchemaKeyword = false, - IncludeTypeInEnumSchemas = true, - RequireAllProperties = false, - DisallowAdditionalProperties = false, + TransformOptions = new() + { + UseNullableKeyword = true, + } }; [JsonPropertyName("contents")] @@ -319,11 +319,11 @@ private static void AddConfiguration(GeminiPromptExecutionSettings executionSett var jsonElement = responseSchemaSettings switch { JsonElement element => element, - Type type => CreateSchema(type, GetDefaultOptions()), + Type type => CreateSchema(type, GetDefaultOptions(), configuration: s_schemaConfiguration), KernelJsonSchema kernelJsonSchema => kernelJsonSchema.RootElement, JsonNode jsonNode => JsonSerializer.SerializeToElement(jsonNode, GetDefaultOptions()), JsonDocument jsonDocument => JsonSerializer.SerializeToElement(jsonDocument, GetDefaultOptions()), - _ => CreateSchema(responseSchemaSettings.GetType(), GetDefaultOptions()) + _ => CreateSchema(responseSchemaSettings.GetType(), GetDefaultOptions(), configuration: s_schemaConfiguration) }; jsonElement = TransformToOpenApi3Schema(jsonElement); @@ -401,7 +401,7 @@ private static JsonElement CreateSchema( string? description = null, AIJsonSchemaCreateOptions? configuration = null) { - configuration ??= s_schemaOptions; + configuration ??= s_schemaConfiguration; return AIJsonUtilities.CreateJsonSchema(type, description, serializerOptions: options, inferenceOptions: configuration); } diff --git a/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Core/OpenAIJsonSchemaTransformerTests.cs b/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Core/OpenAIJsonSchemaTransformerTests.cs index d1690f560473..2c15249a3ca6 100644 --- a/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Core/OpenAIJsonSchemaTransformerTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Core/OpenAIJsonSchemaTransformerTests.cs @@ -16,10 +16,12 @@ public sealed class OpenAIJsonSchemaTransformerTests { private static readonly AIJsonSchemaCreateOptions s_jsonSchemaCreateOptions = new() { - IncludeSchemaKeyword = false, - IncludeTypeInEnumSchemas = true, - DisallowAdditionalProperties = true, - RequireAllProperties = true, + TransformOptions = new() + { + DisallowAdditionalProperties = true, + RequireAllProperties = true, + MoveDefaultKeywordToDescription = true, + } }; private static readonly JsonSerializerOptions s_jsonSerializerOptions = new() diff --git a/dotnet/src/Connectors/Connectors.OpenAI/Helpers/OpenAIChatResponseFormatBuilder.cs b/dotnet/src/Connectors/Connectors.OpenAI/Helpers/OpenAIChatResponseFormatBuilder.cs index e032335dbe5a..096b050e5151 100644 --- a/dotnet/src/Connectors/Connectors.OpenAI/Helpers/OpenAIChatResponseFormatBuilder.cs +++ b/dotnet/src/Connectors/Connectors.OpenAI/Helpers/OpenAIChatResponseFormatBuilder.cs @@ -17,10 +17,12 @@ internal static class OpenAIChatResponseFormatBuilder /// private static readonly Microsoft.Extensions.AI.AIJsonSchemaCreateOptions s_jsonSchemaCreateOptions = new() { - IncludeSchemaKeyword = false, - IncludeTypeInEnumSchemas = true, - DisallowAdditionalProperties = true, - RequireAllProperties = true, + TransformOptions = new() + { + DisallowAdditionalProperties = true, + RequireAllProperties = true, + MoveDefaultKeywordToDescription = true, + } }; /// diff --git a/dotnet/src/InternalUtilities/src/Schema/KernelJsonSchemaBuilder.cs b/dotnet/src/InternalUtilities/src/Schema/KernelJsonSchemaBuilder.cs index a693d49fc3fd..3a746f44f591 100644 --- a/dotnet/src/InternalUtilities/src/Schema/KernelJsonSchemaBuilder.cs +++ b/dotnet/src/InternalUtilities/src/Schema/KernelJsonSchemaBuilder.cs @@ -24,13 +24,7 @@ namespace Microsoft.SemanticKernel; internal static class KernelJsonSchemaBuilder { private static JsonSerializerOptions? s_options; - internal static readonly AIJsonSchemaCreateOptions s_schemaOptions = new() - { - IncludeSchemaKeyword = false, - IncludeTypeInEnumSchemas = true, - RequireAllProperties = false, - DisallowAdditionalProperties = false, - }; + internal static readonly AIJsonSchemaCreateOptions s_schemaOptions = new(); private static readonly JsonElement s_trueSchemaAsObject = JsonDocument.Parse("{}").RootElement; private static readonly JsonElement s_falseSchemaAsObject = JsonDocument.Parse("""{"not":true}""").RootElement; diff --git a/dotnet/src/SemanticKernel.UnitTests/AI/ChatCompletion/AIFunctionKernelFunctionTests.cs b/dotnet/src/SemanticKernel.UnitTests/AI/ChatCompletion/AIFunctionKernelFunctionTests.cs index 065784118c3d..d2b7634eec6b 100644 --- a/dotnet/src/SemanticKernel.UnitTests/AI/ChatCompletion/AIFunctionKernelFunctionTests.cs +++ b/dotnet/src/SemanticKernel.UnitTests/AI/ChatCompletion/AIFunctionKernelFunctionTests.cs @@ -15,7 +15,7 @@ public void ShouldAssignIsRequiredParameterMetadataPropertyCorrectly() { // Arrange and Act AIFunction aiFunction = AIFunctionFactory.Create((string p1, int? p2 = null) => p1, - new AIFunctionFactoryOptions { JsonSchemaCreateOptions = new AIJsonSchemaCreateOptions { RequireAllProperties = false } }); + new AIFunctionFactoryOptions { JsonSchemaCreateOptions = new AIJsonSchemaCreateOptions { TransformOptions = new() { RequireAllProperties = false } } }); AIFunctionKernelFunction sut = new(aiFunction);