openai/openai-dotnet

Public

mirrored from https://github.com/openai/openai-dotnetAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.0.0-beta.12

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/Custom/Chat/Internal/InternalChatCompletionRequestMessageContentPartImageImageUrl.cs

80lines · modeblame

9f9f2936Jose Arriaga Maldonado2 years ago1using System;
2using System.Collections.Generic;
3using System.Text.RegularExpressions;
4
5namespace OpenAI.Chat;
6
7[CodeGenModel("ChatCompletionRequestMessageContentPartImageImageUrl")]
8[CodeGenSuppress("InternalChatCompletionRequestMessageContentPartImageImageUrl", typeof(string))]
9internal partial class InternalChatCompletionRequestMessageContentPartImageImageUrl
10{
efd76b50Stephen Toub2 years ago11#if NET8_0_OR_GREATER
12[GeneratedRegex(@"^data:(?<type>.+?);base64,(?<data>.+)$")]
13private static partial Regex ParseDataUriRegex();
14#else
15private static Regex ParseDataUriRegex() => s_parseDataUriRegex;
16private static readonly Regex s_parseDataUriRegex = new(@"^data:(?<type>.+?);base64,(?<data>.+)$", RegexOptions.Compiled);
17#endif
18
22ab606bStephen Toub2 years ago19private readonly Uri _imageUri;
20private readonly BinaryData _imageBytes;
21private readonly string _imageBytesMediaType;
9f9f2936Jose Arriaga Maldonado2 years ago22
23// CUSTOM: Changed type from Uri to string to be able to support data URIs properly.
24/// <summary> Either a URL of the image or the base64 encoded image data. </summary>
25[CodeGenMember("Url")]
26internal string Url { get; }
27
28/// <summary> Initializes a new instance of <see cref="InternalChatCompletionRequestMessageContentPartImageImageUrl"/>. </summary>
29/// <param name="uri"> Either a URL of the image or the base64 encoded image data. </param>
30/// <exception cref="ArgumentNullException"> <paramref name="uri"/> is null. </exception>
31public InternalChatCompletionRequestMessageContentPartImageImageUrl(Uri uri)
32{
33Argument.AssertNotNull(uri, nameof(uri));
34
35_imageUri = uri;
36
37Url = uri.ToString();
38}
39
40public InternalChatCompletionRequestMessageContentPartImageImageUrl(BinaryData imageBytes, string imageBytesMediaType)
41{
42Argument.AssertNotNull(imageBytes, nameof(imageBytes));
43Argument.AssertNotNull(imageBytesMediaType, nameof(imageBytesMediaType));
44
45_imageBytes = imageBytes;
46_imageBytesMediaType = imageBytesMediaType;
47
48string base64EncodedData = Convert.ToBase64String(_imageBytes.ToArray());
49Url = $"data:{_imageBytesMediaType};base64,{base64EncodedData}";
50}
51
52/// <summary> Initializes a new instance of <see cref="InternalChatCompletionRequestMessageContentPartImageImageUrl"/>. </summary>
53/// <param name="url"> Either a URL of the image or the base64 encoded image data. </param>
54/// <param name="detail"> Specifies the detail level of the image. Learn more in the [Vision guide](/docs/guides/vision/low-or-high-fidelity-image-understanding). </param>
55/// <param name="serializedAdditionalRawData"> Keeps track of any properties unknown to the library. </param>
2ab1a942Jose Arriaga Maldonado1 years ago56internal InternalChatCompletionRequestMessageContentPartImageImageUrl(string url, ChatImageDetailLevel? detail, IDictionary<string, BinaryData> serializedAdditionalRawData)
9f9f2936Jose Arriaga Maldonado2 years ago57{
efd76b50Stephen Toub2 years ago58Match parsedDataUri = ParseDataUriRegex().Match(url);
79014abcShivangiReja1 years ago59
9f9f2936Jose Arriaga Maldonado2 years ago60if (parsedDataUri.Success)
61{
62_imageBytes = BinaryData.FromBytes(Convert.FromBase64String(parsedDataUri.Groups["data"].Value));
63_imageBytesMediaType = parsedDataUri.Groups["type"].Value;
64}
65else
66{
67_imageUri = new Uri(url);
68}
69
70Url = url;
71Detail = detail;
19fc7d54Jose Arriaga Maldonado2 years ago72SerializedAdditionalRawData = serializedAdditionalRawData;
9f9f2936Jose Arriaga Maldonado2 years ago73}
74
75public Uri ImageUri => _imageUri;
76
77public BinaryData ImageBytes => _imageBytes;
78
79public string ImageBytesMediaType => _imageBytesMediaType;
80}