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);
+ }
+}