diff --git a/src/Extensions/ToolJsonOptions.cs b/src/Extensions/ToolJsonOptions.cs index a4625e3..3d286e6 100644 --- a/src/Extensions/ToolJsonOptions.cs +++ b/src/Extensions/ToolJsonOptions.cs @@ -1,7 +1,6 @@ using System.Diagnostics; using System.Text.Json; -using System.Text.Json.Serialization; -using System.Text.Json.Serialization.Metadata; +using Microsoft.Extensions.AI; namespace Devlooped.Extensions.AI; @@ -16,19 +15,14 @@ public static class ToolJsonOptions /// /// Default for function calling and tools. /// - public static JsonSerializerOptions Default { get; } = new(JsonSerializerDefaults.Web) + public static JsonSerializerOptions Default { get; } = new(AIJsonUtilities.DefaultOptions) { Converters = { new AdditionalPropertiesDictionaryConverter(), - new JsonStringEnumConverter(), }, - DefaultIgnoreCondition = - JsonIgnoreCondition.WhenWritingDefault | - JsonIgnoreCondition.WhenWritingNull, - Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, - WriteIndented = Debugger.IsAttached, - TypeInfoResolver = new TypeInjectingResolver(new DefaultJsonTypeInfoResolver()) + WriteIndented = Debugger.IsAttached || AIJsonUtilities.DefaultOptions.WriteIndented, + TypeInfoResolver = new TypeInjectingResolver(AIJsonUtilities.DefaultOptions.TypeInfoResolverChain) }; } diff --git a/src/Extensions/TypeInjectingResolver.cs b/src/Extensions/TypeInjectingResolver.cs index 570d129..0a0eee3 100644 --- a/src/Extensions/TypeInjectingResolver.cs +++ b/src/Extensions/TypeInjectingResolver.cs @@ -18,8 +18,7 @@ public static JsonSerializerOptions WithTypeInjection(this JsonSerializerOptions if (options.IsReadOnly) options = new(options); - options.TypeInfoResolver = new TypeInjectingResolver( - JsonTypeInfoResolver.Combine([.. options.TypeInfoResolverChain])); + options.TypeInfoResolver = new TypeInjectingResolver(options.TypeInfoResolverChain); return options; } @@ -29,12 +28,15 @@ public static JsonSerializerOptions WithTypeInjection(this JsonSerializerOptions /// A custom that injects a $type property into object types /// so they can be automatically distinguished during deserialization or inspection. /// -public class TypeInjectingResolver(IJsonTypeInfoResolver inner) : IJsonTypeInfoResolver +public class TypeInjectingResolver(IList chain) : IJsonTypeInfoResolver { + readonly IJsonTypeInfoResolver resolver = JsonTypeInfoResolver.Combine([.. chain]); + /// public JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options) { - var info = inner.GetTypeInfo(type, options); + var info = resolver.GetTypeInfo(type, options); + // The $type would already be present for polymorphic serialization. if (info?.Kind == JsonTypeInfoKind.Object && !info.Properties.Any(x => x.Name == "$type")) { @@ -43,6 +45,7 @@ public class TypeInjectingResolver(IJsonTypeInfoResolver inner) : IJsonTypeInfoR prop.Order = -1000; // Ensure it is serialized first info.Properties.Add(prop); } + return info; } }