diff --git a/app/MindWork AI Studio/Chat/ContentImage.cs b/app/MindWork AI Studio/Chat/ContentImage.cs
index 0d831453..4e108df4 100644
--- a/app/MindWork AI Studio/Chat/ContentImage.cs
+++ b/app/MindWork AI Studio/Chat/ContentImage.cs
@@ -49,4 +49,62 @@ public sealed class ContentImage : IContent
/// The image source.
///
public required string Source { get; set; }
+
+ ///
+ /// Read the image content as a base64 string.
+ ///
+ ///
+ /// The images are directly converted to base64 strings. The maximum
+ /// size of the image is around 10 MB. If the image is larger, the method
+ /// returns an empty string.
+ ///
+ /// As of now, this method does no sort of image processing. LLMs usually
+ /// do not work with arbitrary image sizes. In the future, we might have
+ /// to resize the images before sending them to the model.
+ ///
+ /// The cancellation token.
+ /// The image content as a base64 string; might be empty.
+ public async Task AsBase64(CancellationToken token = default)
+ {
+ switch (this.SourceType)
+ {
+ case ContentImageSource.BASE64:
+ return this.Source;
+
+ case ContentImageSource.URL:
+ {
+ using var httpClient = new HttpClient();
+ using var response = await httpClient.GetAsync(this.Source, HttpCompletionOption.ResponseHeadersRead, token);
+ if(response.IsSuccessStatusCode)
+ {
+ // Read the length of the content:
+ var lengthBytes = response.Content.Headers.ContentLength;
+ if(lengthBytes > 10_000_000)
+ return string.Empty;
+
+ var bytes = await response.Content.ReadAsByteArrayAsync(token);
+ return Convert.ToBase64String(bytes);
+ }
+
+ return string.Empty;
+ }
+
+ case ContentImageSource.LOCAL_PATH:
+ if(File.Exists(this.Source))
+ {
+ // Read the content length:
+ var length = new FileInfo(this.Source).Length;
+ if(length > 10_000_000)
+ return string.Empty;
+
+ var bytes = await File.ReadAllBytesAsync(this.Source, token);
+ return Convert.ToBase64String(bytes);
+ }
+
+ return string.Empty;
+
+ default:
+ return string.Empty;
+ }
+ }
}
\ No newline at end of file