diff --git a/app/MindWork AI Studio/Provider/BaseProvider.cs b/app/MindWork AI Studio/Provider/BaseProvider.cs index 00b4aa26..ebc706a0 100644 --- a/app/MindWork AI Studio/Provider/BaseProvider.cs +++ b/app/MindWork AI Studio/Provider/BaseProvider.cs @@ -40,7 +40,7 @@ public abstract class BaseProvider : IProvider, ISecretId protected static readonly JsonSerializerOptions JSON_SERIALIZER_OPTIONS = new() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, - Converters = { new AnnotationConverter() }, + Converters = { new AnnotationConverter(), new MessageBaseConverter() }, AllowTrailingCommas = false }; diff --git a/app/MindWork AI Studio/Provider/MessageBaseConverter.cs b/app/MindWork AI Studio/Provider/MessageBaseConverter.cs new file mode 100644 index 00000000..07a1cdd6 --- /dev/null +++ b/app/MindWork AI Studio/Provider/MessageBaseConverter.cs @@ -0,0 +1,29 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AIStudio.Provider; + +/// +/// Custom JSON converter for the IMessageBase interface to handle polymorphic serialization. +/// +/// +/// This converter ensures that when serializing IMessageBase objects, all properties +/// of the concrete implementation (e.g., TextMessage) are serialized, not just the +/// properties defined in the IMessageBase interface. +/// +public sealed class MessageBaseConverter : JsonConverter +{ + public override IMessageBase Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + // Deserialization is not needed for request objects, as messages are only serialized + // when sending requests to LLM providers. + throw new NotImplementedException("Deserializing IMessageBase is not supported. This converter is only used for serializing request messages."); + } + + public override void Write(Utf8JsonWriter writer, IMessageBase value, JsonSerializerOptions options) + { + // Serialize the actual concrete type (e.g., TextMessage) instead of just the IMessageBase interface. + // This ensures all properties of the concrete type are included in the JSON output. + JsonSerializer.Serialize(writer, value, value.GetType(), options); + } +}