From 74ac1ffc06327e63571cf89050759747776bce25 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:01:18 -0500 Subject: [PATCH] fix: when serializing source use media type to deserialize to image or document source --- src/AnthropicClient/Json/SourceConverter.cs | 11 ++++++++++- .../Unit/Models/MessageRequestTests.cs | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/AnthropicClient/Json/SourceConverter.cs b/src/AnthropicClient/Json/SourceConverter.cs index 3847e8d..642295d 100644 --- a/src/AnthropicClient/Json/SourceConverter.cs +++ b/src/AnthropicClient/Json/SourceConverter.cs @@ -16,11 +16,20 @@ class SourceConverter : JsonConverter { SourceType.Text => JsonSerializer.Deserialize(root.GetRawText(), options)!, SourceType.Content => JsonSerializer.Deserialize(root.GetRawText(), options)!, - SourceType.Base64 => JsonSerializer.Deserialize(root.GetRawText(), options)!, + SourceType.Base64 => DeserializeBase64Source(root, options), _ => throw new JsonException($"Unknown content type: {type}") }; } + private static Source DeserializeBase64Source(JsonElement root, JsonSerializerOptions options) + { + var mediaType = root.GetProperty("media_type").GetString() ?? throw new JsonException("Missing 'media_type' property"); + var isImage = ImageType.IsValidImageType(mediaType); + return isImage + ? JsonSerializer.Deserialize(root.GetRawText(), options)! + : JsonSerializer.Deserialize(root.GetRawText(), options)!; + } + public override void Write(Utf8JsonWriter writer, Source value, JsonSerializerOptions options) { if (value is TextSource textSource) diff --git a/tests/AnthropicClient.Tests/Unit/Models/MessageRequestTests.cs b/tests/AnthropicClient.Tests/Unit/Models/MessageRequestTests.cs index da3f848..2210e90 100644 --- a/tests/AnthropicClient.Tests/Unit/Models/MessageRequestTests.cs +++ b/tests/AnthropicClient.Tests/Unit/Models/MessageRequestTests.cs @@ -74,7 +74,7 @@ public class MessageRequestTests : SerializationTest ""content"": [ { ""type"": ""image"", - ""source"": { ""media_type"": ""image/jpeg"", ""data"": ""data"" } + ""source"": { ""type"": ""base64"", ""media_type"": ""image/jpeg"", ""data"": ""data"" } } ] }