From 2af75aed5fb2404a4afc23d8d8061ef02050a1fd Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sun, 16 Feb 2025 13:31:54 +0100 Subject: [PATCH] Implemented the base64 image encoding --- app/MindWork AI Studio/Chat/ContentImage.cs | 58 +++++++++++++++++++++ 1 file changed, 58 insertions(+) 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