Skip to content
This repository was archived by the owner on Feb 12, 2025. It is now read-only.

Commit e1de3ad

Browse files
committed
Added GptClient static builder
Added image loader extension 'SetImageMask' for IEditImageBuilder Renaming
1 parent 0a41c64 commit e1de3ad

14 files changed

+123
-20
lines changed

ManagedCode.OpenAI.Tests/ImageTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public ImageTests(ITestOutputHelper output)
2020
public async Task GenerateImage_Success()
2121
{
2222
var image = await _client.ImageClient.GenerateImage("Red dragon")
23-
.SetImageResolution(ImageResolution._512x512).GenerateAsync();
23+
.SetImageResolution(ImageResolution._512x512).ExecuteAsync();
2424

2525
Log($"Image url: {image.Content}");
2626
Assert.False(string.IsNullOrWhiteSpace(image.Content));
@@ -33,7 +33,7 @@ public async Task EditImage_Success()
3333
.ImageClient.EditImage("change color to blue",
3434
x=> x.FromBytes(Properties.Resources.Dog))
3535
.AsUrl()
36-
.EditAsync();
36+
.ExecuteAsync();
3737

3838
Log($"Edited dog: {edited}");
3939
Assert.False(string.IsNullOrWhiteSpace(edited.Content));

ManagedCode.OpenAI.Tests/ModerationTests.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
using ManagedCode.OpenAI.Chat;
12
using ManagedCode.OpenAI.Client;
23
using ManagedCode.OpenAI.Moderation;
34
using Newtonsoft.Json;
45
using Xunit;
56
using Xunit.Abstractions;
7+
using ManagedCode.OpenAI.Image;
68

79
namespace ManagedCode.OpenAI.Tests;
810

@@ -47,11 +49,6 @@ public async Task CreateMultipleModeration_Success()
4749
Log(ToJson(moderation));
4850
}
4951

50-
51-
52-
53-
54-
5552
void Log(object obj) => Log(obj.ToString());
5653

5754
void Log(string str) => _output.WriteLine(str);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace ManagedCode.OpenAI.Client.Abstractions
8+
{
9+
public interface IGptClientBuilder
10+
{
11+
public IGptClientBuilder WithOrganization(string organization);
12+
13+
public IGptClientBuilder Configure(Action<IGptClientConfigurationBuilder> configuration);
14+
15+
public GptClient Build();
16+
}
17+
}

ManagedCode.OpenAI/Client/GptClient.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using ManagedCode.OpenAI.API;
22
using ManagedCode.OpenAI.Chat;
3+
using ManagedCode.OpenAI.Client.Abstractions;
34
using ManagedCode.OpenAI.Completions;
45
using ManagedCode.OpenAI.Edit;
56
using ManagedCode.OpenAI.Files;
@@ -12,6 +13,11 @@ public class GptClient : IGptClient
1213
{
1314
private IOpenAiWebClient _webClient = null!;
1415

16+
public static IGptClientBuilder Builder(string apiKey)
17+
{
18+
return new GptClientBuilder(apiKey);
19+
}
20+
1521
public GptClient(string apiKey)
1622
{
1723
Init(apiKey, default, new DefaultGptClientConfiguration());
@@ -32,6 +38,11 @@ public GptClient(string apiKey, string organization, IGptClientConfiguration con
3238
Init(apiKey, organization, configuration);
3339
}
3440

41+
internal GptClient(string apiKey, IGptClientConfiguration configuration, string? organization)
42+
{
43+
Init(apiKey, organization, configuration);
44+
}
45+
3546
private GptClient(){}
3647

3748
private void Init(string apiKey, string? organization, IGptClientConfiguration configuration)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using ManagedCode.OpenAI.Client.Abstractions;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace ManagedCode.OpenAI.Client
9+
{
10+
public class GptClientBuilder : IGptClientBuilder
11+
{
12+
private readonly string _apiKey;
13+
private string? _organization = null;
14+
private IGptClientConfiguration _configuration = new DefaultGptClientConfiguration();
15+
16+
public GptClientBuilder(string apiKey)
17+
{
18+
_apiKey = apiKey;
19+
}
20+
21+
public IGptClientBuilder WithOrganization(string organization)
22+
{
23+
_organization = organization;
24+
return this;
25+
}
26+
27+
public IGptClientBuilder Configure(Action<IGptClientConfigurationBuilder> configuration)
28+
{
29+
var builder = new GptClientConfigurationBuilder();
30+
configuration.Invoke(builder);
31+
32+
_configuration = builder.Build();
33+
return this;
34+
}
35+
36+
public GptClient Build()
37+
{
38+
var client = new GptClient(_apiKey, _configuration, _organization);
39+
return client;
40+
}
41+
}
42+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using ManagedCode.OpenAI.Client.Abstractions;
7+
using Microsoft.Extensions.DependencyInjection;
8+
9+
namespace ManagedCode.OpenAI.Client
10+
{
11+
public static class ServiceCollectionExtensions
12+
{
13+
public static void AddOpenAI(this IServiceCollection collection, string apiKey)
14+
{
15+
collection.AddSingleton<IGptClient>(s => new GptClient(apiKey));
16+
}
17+
18+
public static void AddOpenAI(this IServiceCollection collection, string apiKey,
19+
Action<IGptClientBuilder> build)
20+
{
21+
var builder = new GptClientBuilder(apiKey);
22+
build.Invoke(builder);
23+
collection.AddSingleton<IGptClient>(s => builder.Build());
24+
}
25+
}
26+
}

ManagedCode.OpenAI/Image/Abstractions/IEditImageBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ public interface IEditImageBuilder: IBaseImageBuilder<IEditImageBuilder>
44
{
55
public IEditImageBuilder SetImageMask(string base64);
66

7-
public Task<IGptImage<string>> EditAsync();
7+
public Task<IGptImage<string>> ExecuteAsync();
88

9-
public Task<IGptImage<string[]>> EditMultipleAsync(int count);
9+
public Task<IGptImage<string[]>> ExecuteMultipleAsync(int count);
1010
}
1111
}

ManagedCode.OpenAI/Image/Abstractions/IGenerateImageBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
{
33
public interface IGenerateImageBuilder: IBaseImageBuilder<IGenerateImageBuilder>
44
{
5-
public Task<IGptImage<string>> GenerateAsync();
5+
public Task<IGptImage<string>> ExecuteAsync();
66

7-
public Task<IGptImage<string[]>> GenerateMultipleAsync(int count);
7+
public Task<IGptImage<string[]>> ExecuteMultipleAsync(int count);
88
}
99
}

ManagedCode.OpenAI/Image/Abstractions/IVariationImageBuilder.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
{
33
public interface IVariationImageBuilder: IBaseImageBuilder<IVariationImageBuilder>
44
{
5-
6-
public Task<IGptImage<string>> VariationAsync();
5+
public Task<IGptImage<string>> ExecuteAsync();
76

8-
public Task<IGptImage<string[]>> VariationsMultipleAsync(int count);
7+
public Task<IGptImage<string[]>> ExecuteMultipleAsync(int count);
98
}
109
}

ManagedCode.OpenAI/Image/Builders/EditImageBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ public IEditImageBuilder SetImageMask(string base64)
2727
return this;
2828
}
2929

30-
public async Task<IGptImage<string>> EditAsync()
30+
public async Task<IGptImage<string>> ExecuteAsync()
3131
{
3232
Request.Validate();
3333
var response = await _webClient.EditImageAsync(Request);
3434
return response.AsSingle();
3535
}
3636

37-
public async Task<IGptImage<string[]>> EditMultipleAsync(int count)
37+
public async Task<IGptImage<string[]>> ExecuteMultipleAsync(int count)
3838
{
3939
Request.Validate();
4040
var response = await _webClient.EditImageAsync(Request);

ManagedCode.OpenAI/Image/Builders/GenerateImageBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ public GenerateImageBuilder(IOpenAiWebClient webClient, string description)
1616
Request.Description = description;
1717
}
1818

19-
public async Task<IGptImage<string>> GenerateAsync()
19+
public async Task<IGptImage<string>> ExecuteAsync()
2020
{
2121
Request.Validate();
2222
var response = await _webClient.GenerateImageAsync(Request);
2323
return response.AsSingle();
2424
}
2525

26-
public async Task<IGptImage<string[]>> GenerateMultipleAsync(int count)
26+
public async Task<IGptImage<string[]>> ExecuteMultipleAsync(int count)
2727
{
2828
Request.Validate();
2929
var response = await _webClient.GenerateImageAsync(Request);

ManagedCode.OpenAI/Image/Builders/VariationImageBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ public VariationImageBuilder(IOpenAiWebClient client, string imageBase64)
1616
}
1717

1818

19-
public async Task<IGptImage<string>> VariationAsync()
19+
public async Task<IGptImage<string>> ExecuteAsync()
2020
{
2121
Request.Validate();
2222
var response = await _client.VariationImageAsync(Request);
2323
return response.AsSingle();
2424
}
2525

26-
public async Task<IGptImage<string[]>> VariationsMultipleAsync(int count)
26+
public async Task<IGptImage<string[]>> ExecuteMultipleAsync(int count)
2727
{
2828
Request.Validate();
2929
var response = await _client.VariationImageAsync(Request);

ManagedCode.OpenAI/Image/Extensions/ImageClientEx.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,13 @@ public static IVariationImageBuilder VariationImage(this IImageClient client,
1515
var loader = new DefaultImageLoader();
1616
return client.VariationImage(image.Invoke(loader));
1717
}
18+
19+
public static IEditImageBuilder SetImageMask(this IEditImageBuilder builder,
20+
Func<IImageLoader, string> image)
21+
{
22+
var loader = new DefaultImageLoader();
23+
builder.SetImageMask(image.Invoke(loader));
24+
return builder;
25+
}
1826
}
1927
}

ManagedCode.OpenAI/ManagedCode.OpenAI.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,8 @@
2626
<None Remove="FileTunes\**" />
2727
<None Remove="Methods\**" />
2828
</ItemGroup>
29+
<ItemGroup>
30+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
31+
</ItemGroup>
2932

3033
</Project>

0 commit comments

Comments
 (0)