Skip to content

Commit 37f15ba

Browse files
authored
Add Quality and Background properties to ImageEditOptions (#621)
1 parent f77f26e commit 37f15ba

File tree

8 files changed

+89
-9
lines changed

8 files changed

+89
-9
lines changed

api/OpenAI.net8.0.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class OpenAIClientOptions : ClientPipelineOptions {
4444
public string ProjectId { get; set; }
4545
public string UserAgentApplicationId { get; set; }
4646
}
47+
[Experimental("OPENAI001")]
4748
public class OpenAIContext : ModelReaderWriterContext {
4849
public static OpenAIContext Default { get; }
4950
protected override bool TryGetTypeBuilderCore(Type type, out ModelReaderWriterTypeBuilder builder);
@@ -3511,7 +3512,11 @@ public class ImageClient {
35113512
public virtual Task<ClientResult<GeneratedImageCollection>> GenerateImageVariationsAsync(string imageFilePath, int imageCount, ImageVariationOptions options = null);
35123513
}
35133514
public class ImageEditOptions : IJsonModel<ImageEditOptions>, IPersistableModel<ImageEditOptions> {
3515+
[Experimental("OPENAI001")]
3516+
public GeneratedImageBackground? Background { get; set; }
35143517
public string EndUserId { get; set; }
3518+
[Experimental("OPENAI001")]
3519+
public GeneratedImageQuality? Quality { get; set; }
35153520
public GeneratedImageFormat? ResponseFormat { get; set; }
35163521
public GeneratedImageSize? Size { get; set; }
35173522
[Experimental("OPENAI001")]

api/OpenAI.netstandard2.0.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3063,7 +3063,9 @@ public class ImageClient {
30633063
public virtual Task<ClientResult<GeneratedImageCollection>> GenerateImageVariationsAsync(string imageFilePath, int imageCount, ImageVariationOptions options = null);
30643064
}
30653065
public class ImageEditOptions : IJsonModel<ImageEditOptions>, IPersistableModel<ImageEditOptions> {
3066+
public GeneratedImageBackground? Background { get; set; }
30663067
public string EndUserId { get; set; }
3068+
public GeneratedImageQuality? Quality { get; set; }
30673069
public GeneratedImageFormat? ResponseFormat { get; set; }
30683070
public GeneratedImageSize? Size { get; set; }
30693071
protected virtual ImageEditOptions JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options);

src/Custom/Images/ImageEditOptions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics.CodeAnalysis;
23
using System.IO;
34

45
namespace OpenAI.Images;
@@ -68,6 +69,16 @@ public partial class ImageEditOptions
6869
/// <summary> The number of images to generate. Must be between 1 and 10. </summary>
6970
internal long? N { get; set; }
7071

72+
// CUSTOM: Changed property type.
73+
[Experimental("OPENAI001")]
74+
[CodeGenMember("Background")]
75+
public GeneratedImageBackground? Background { get; set; }
76+
77+
// CUSTOM: Changed property type.
78+
[Experimental("OPENAI001")]
79+
[CodeGenMember("Quality")]
80+
public GeneratedImageQuality? Quality { get; set; }
81+
7182
// CUSTOM: Changed property type.
7283
/// <summary> The size of the generated images. Must be one of `256x256`, `512x512`, or `1024x1024`. </summary>
7384
[CodeGenMember("Size")]

src/Custom/OpenAIContext.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
3+
namespace OpenAI;
4+
5+
[Experimental("OPENAI001")]
6+
public partial class OpenAIContext
7+
{
8+
}

src/Generated/Models/Images/ImageEditOptions.Serialization.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,13 @@ internal static ImageEditOptions DeserializeImageEditOptions(JsonElement element
134134
BinaryData image = default;
135135
string prompt = default;
136136
BinaryData mask = default;
137-
InternalCreateImageEditRequestBackground? background = default;
137+
GeneratedImageBackground? background = default;
138138
InternalCreateImageEditRequestModel? model = default;
139139
long? n = default;
140140
GeneratedImageSize? size = default;
141141
GeneratedImageFormat? responseFormat = default;
142142
string endUserId = default;
143-
InternalCreateImageEditRequestQuality? quality = default;
143+
GeneratedImageQuality? quality = default;
144144
IDictionary<string, BinaryData> additionalBinaryDataProperties = new ChangeTrackingDictionary<string, BinaryData>();
145145
foreach (var prop in element.EnumerateObject())
146146
{
@@ -170,7 +170,7 @@ internal static ImageEditOptions DeserializeImageEditOptions(JsonElement element
170170
background = null;
171171
continue;
172172
}
173-
background = new InternalCreateImageEditRequestBackground(prop.Value.GetString());
173+
background = new GeneratedImageBackground(prop.Value.GetString());
174174
continue;
175175
}
176176
if (prop.NameEquals("model"u8))
@@ -225,7 +225,7 @@ internal static ImageEditOptions DeserializeImageEditOptions(JsonElement element
225225
quality = null;
226226
continue;
227227
}
228-
quality = new InternalCreateImageEditRequestQuality(prop.Value.GetString());
228+
quality = new GeneratedImageQuality(prop.Value.GetString());
229229
continue;
230230
}
231231
// Plugin customization: remove options.Format != "W" check

src/Generated/Models/Images/ImageEditOptions.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public partial class ImageEditOptions
1111
{
1212
private protected IDictionary<string, BinaryData> _additionalBinaryDataProperties;
1313

14-
internal ImageEditOptions(BinaryData image, string prompt, BinaryData mask, InternalCreateImageEditRequestBackground? background, InternalCreateImageEditRequestModel? model, long? n, GeneratedImageSize? size, GeneratedImageFormat? responseFormat, string endUserId, InternalCreateImageEditRequestQuality? quality, IDictionary<string, BinaryData> additionalBinaryDataProperties)
14+
internal ImageEditOptions(BinaryData image, string prompt, BinaryData mask, GeneratedImageBackground? background, InternalCreateImageEditRequestModel? model, long? n, GeneratedImageSize? size, GeneratedImageFormat? responseFormat, string endUserId, GeneratedImageQuality? quality, IDictionary<string, BinaryData> additionalBinaryDataProperties)
1515
{
1616
Image = image;
1717
Prompt = prompt;
@@ -26,10 +26,6 @@ internal ImageEditOptions(BinaryData image, string prompt, BinaryData mask, Inte
2626
_additionalBinaryDataProperties = additionalBinaryDataProperties;
2727
}
2828

29-
internal InternalCreateImageEditRequestBackground? Background { get; set; }
30-
31-
internal InternalCreateImageEditRequestQuality? Quality { get; set; }
32-
3329
internal IDictionary<string, BinaryData> SerializedAdditionalRawData
3430
{
3531
get => _additionalBinaryDataProperties;

src/Generated/OpenAIModelFactory.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,22 @@ public static ImageInputTokenUsageDetails ImageInputTokenUsageDetails(int textTo
737737
return new ImageInputTokenUsageDetails(textTokenCount, imageTokenCount, additionalBinaryDataProperties: null);
738738
}
739739

740+
public static ImageEditOptions ImageEditOptions(BinaryData image = default, string prompt = default, BinaryData mask = default, GeneratedImageBackground? background = default, InternalCreateImageEditRequestModel? model = default, long? n = default, GeneratedImageSize? size = default, GeneratedImageFormat? responseFormat = default, string endUserId = default, GeneratedImageQuality? quality = default)
741+
{
742+
return new ImageEditOptions(
743+
image,
744+
prompt,
745+
mask,
746+
background,
747+
model,
748+
n,
749+
size,
750+
responseFormat,
751+
endUserId,
752+
quality,
753+
additionalBinaryDataProperties: null);
754+
}
755+
740756
public static ImageVariationOptions ImageVariationOptions(BinaryData image = default, InternalCreateImageVariationRequestModel? model = default, long? n = default, GeneratedImageFormat? responseFormat = default, GeneratedImageSize? size = default, string endUserId = default)
741757
{
742758
return new ImageVariationOptions(

tests/Images/ImageEditsTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,48 @@ public async Task GenerateImageEditWorks(ImageSourceKind imageSourceKind)
5858
ValidateGeneratedImage(image.ImageUri, ["cat", "owl", "animal"], "Note that it likely depicts some sort of animal.");
5959
}
6060

61+
[Test]
62+
[TestCaseSource(nameof(s_imageSourceKindSource))]
63+
public async Task GptImage1Works(ImageSourceKind imageSourceKind)
64+
{
65+
ImageClient client = GetTestClient<ImageClient>(TestScenario.Images, "gpt-image-1");
66+
67+
string maskFilename = "images_empty_room_with_mask.png";
68+
string maskImagePath = Path.Combine("Assets", maskFilename);
69+
GeneratedImage image = null;
70+
71+
ImageEditOptions options = new()
72+
{
73+
Background = GeneratedImageBackground.Opaque,
74+
Quality = GeneratedImageQuality.Low,
75+
Size = GeneratedImageSize.W1024xH1024
76+
};
77+
78+
if (imageSourceKind == ImageSourceKind.UsingStream)
79+
{
80+
using FileStream mask = File.OpenRead(maskImagePath);
81+
82+
image = IsAsync
83+
? await client.GenerateImageEditAsync(mask, maskFilename, CatPrompt, options)
84+
: client.GenerateImageEdit(mask, maskFilename, CatPrompt, options);
85+
}
86+
else if (imageSourceKind == ImageSourceKind.UsingFilePath)
87+
{
88+
image = IsAsync
89+
? await client.GenerateImageEditAsync(maskImagePath, CatPrompt, options)
90+
: client.GenerateImageEdit(maskImagePath, CatPrompt, options);
91+
}
92+
else
93+
{
94+
Assert.Fail("Invalid source kind.");
95+
}
96+
97+
Assert.That(image.ImageUri, Is.Null);
98+
Assert.That(image.ImageBytes, Is.Not.Null);
99+
100+
ValidateGeneratedImage(image.ImageBytes, ["cat", "owl", "animal"], "Note that it likely depicts some sort of animal.");
101+
}
102+
61103
[Test]
62104
[TestCaseSource(nameof(s_imageSourceKindSource))]
63105
public async Task GenerateImageEditWithBytesResponseWorks(ImageSourceKind imageSourceKind)

0 commit comments

Comments
 (0)