Skip to content

Commit 59ecb02

Browse files
authored
Document via tests that image content type is jpeg (#48)
Input content type is omitted.
1 parent 581e2c7 commit 59ecb02

2 files changed

Lines changed: 11 additions & 14 deletions

File tree

src/xAI.Tests/ImageGeneratorTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public async Task GenerateImage_WithPrompt_ReturnsImageContent()
1717
var options = new ImageGenerationOptions
1818
{
1919
ResponseFormat = ImageGenerationResponseFormat.Uri,
20-
Count = 1
2120
};
2221

2322
var response = await imageGenerator.GenerateAsync(request, options);
@@ -44,6 +43,7 @@ public async Task GenerateImage_WithEditsToPreviousImage()
4443
var request = new ImageGenerationRequest("A cat sitting on a tree branch");
4544
var options = new ImageGenerationOptions
4645
{
46+
MediaType = "image/png",
4747
ResponseFormat = ImageGenerationResponseFormat.Uri,
4848
Count = 1
4949
};
@@ -54,6 +54,8 @@ public async Task GenerateImage_WithEditsToPreviousImage()
5454
Assert.NotEmpty(response.Contents);
5555
Assert.Single(response.Contents);
5656
var image = Assert.IsType<UriContent>(response.Contents.First());
57+
// media type in options is ignored and you always get the same jpg
58+
Assert.Equal("image/jpg", image.MediaType);
5759
output.WriteLine($"Generated image URL: {image.Uri}");
5860

5961
var edit = await imageGenerator.GenerateAsync(new ImageGenerationRequest("Edit provided image by adding a batman mask", [image]), options);
@@ -62,6 +64,8 @@ public async Task GenerateImage_WithEditsToPreviousImage()
6264
Assert.NotEmpty(edit.Contents);
6365
Assert.Single(edit.Contents);
6466
image = Assert.IsType<UriContent>(edit.Contents.First());
67+
// media type in options is ignored and you always get the same jpg
68+
Assert.Equal("image/jpg", image.MediaType);
6569

6670
output.WriteLine($"Edited image URL: {image.Uri}");
6771
}

src/xAI/GrokImageGenerator.cs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ sealed class GrokImageGenerator : IImageGenerator
1616
readonly ImageGeneratorMetadata metadata;
1717
readonly ImageClient imageClient;
1818
readonly string defaultModelId;
19-
readonly GrokClientOptions clientOptions;
2019

2120
internal GrokImageGenerator(GrpcChannel channel, GrokClientOptions clientOptions, string defaultModelId)
2221
: this(new ImageClient(channel), clientOptions, defaultModelId)
@@ -32,7 +31,6 @@ internal GrokImageGenerator(ImageClient imageClient, string defaultModelId)
3231
GrokImageGenerator(ImageClient imageClient, GrokClientOptions clientOptions, string defaultModelId)
3332
{
3433
this.imageClient = imageClient;
35-
this.clientOptions = clientOptions;
3634
this.defaultModelId = defaultModelId;
3735
metadata = new ImageGeneratorMetadata("xai", clientOptions.Endpoint, defaultModelId);
3836
}
@@ -63,9 +61,8 @@ public async Task<ImageGenerationResponse> GenerateAsync(
6361
}
6462

6563
// Handle image editing if original images are provided
66-
if (request.OriginalImages is not null && request.OriginalImages.Any())
64+
if (request.OriginalImages?.FirstOrDefault() is { } originalImage)
6765
{
68-
var originalImage = request.OriginalImages.FirstOrDefault();
6966
if (originalImage is DataContent dataContent)
7067
{
7168
var imageUrl = dataContent.Uri?.ToString();
@@ -91,7 +88,7 @@ public async Task<ImageGenerationResponse> GenerateAsync(
9188

9289
var response = await imageClient.GenerateImageAsync(protocolRequest, cancellationToken: cancellationToken).ConfigureAwait(false);
9390

94-
return ToImageGenerationResponse(response, options?.MediaType);
91+
return ToImageGenerationResponse(response);
9592
}
9693

9794
/// <inheritdoc />
@@ -103,18 +100,14 @@ public async Task<ImageGenerationResponse> GenerateAsync(
103100
};
104101

105102
/// <inheritdoc />
106-
void IDisposable.Dispose()
107-
{
108-
// Nothing to dispose. Implementation required for the IImageGenerator interface.
109-
}
103+
void IDisposable.Dispose() { }
110104

111105
/// <summary>
112106
/// Converts an xAI <see cref="ImageResponse"/> to a <see cref="ImageGenerationResponse"/>.
113107
/// </summary>
114-
static ImageGenerationResponse ToImageGenerationResponse(ImageResponse response, string? mediaType)
108+
static ImageGenerationResponse ToImageGenerationResponse(ImageResponse response)
115109
{
116110
var contents = new List<AIContent>();
117-
var contentType = mediaType ?? DefaultOutputContentType; // xAI returns JPG by default
118111

119112
foreach (var image in response.Images)
120113
{
@@ -123,12 +116,12 @@ static ImageGenerationResponse ToImageGenerationResponse(ImageResponse response,
123116
case GeneratedImage.ImageOneofCase.Base64:
124117
{
125118
var imageBytes = Convert.FromBase64String(image.Base64);
126-
contents.Add(new DataContent(imageBytes, contentType));
119+
contents.Add(new DataContent(imageBytes, DefaultOutputContentType));
127120
break;
128121
}
129122
case GeneratedImage.ImageOneofCase.Url:
130123
{
131-
contents.Add(new UriContent(new Uri(image.Url), contentType));
124+
contents.Add(new UriContent(new Uri(image.Url), DefaultOutputContentType));
132125
break;
133126
}
134127
default:

0 commit comments

Comments
 (0)