From 59b5bd6e57d5f127f66e006a1a702320d9b4a6c1 Mon Sep 17 00:00:00 2001 From: Justin Yoo Date: Thu, 15 Aug 2024 10:25:41 +0900 Subject: [PATCH 1/3] Add OpenAISettingsBuilder --- .../Builders/OpenAISettingsBuilder.cs | 31 +++++++++++++++++++ .../Builders/OpenAISettingsBuilderTests.cs | 22 +++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs create mode 100644 test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs diff --git a/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs b/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs new file mode 100644 index 00000000..f9210482 --- /dev/null +++ b/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs @@ -0,0 +1,31 @@ +using AzureOpenAIProxy.ApiApp.Configurations; + +namespace AzureOpenAIProxy.ApiApp.Builders; + +/// +/// This provides interface to the class. +/// +public interface IOpenAISettingsBuilder +{ + /// + /// Builds the instance. + /// + /// Returns the instance. + OpenAISettings Build(); +} + +/// +/// This represents the builder entity for class. +/// +public class OpenAISettingsBuilder : IOpenAISettingsBuilder +{ + private OpenAISettings? _settings; + + /// + public OpenAISettings Build() + { + this._settings ??= new OpenAISettings(); + + return this._settings; + } +} diff --git a/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs new file mode 100644 index 00000000..c024ffd9 --- /dev/null +++ b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs @@ -0,0 +1,22 @@ +using AzureOpenAIProxy.ApiApp.Builders; +using AzureOpenAIProxy.ApiApp.Configurations; + +using FluentAssertions; + +namespace AzureOpenAIProxy.ApiApp.Tests.Builders; + +public class OpenAISettingsBuilderTests +{ + [Fact] + public void Given_OpenAISettingsBuilder_When_Invoked_Build_Then_It_Should_Return_Instance() + { + // Arrange + var builder = new OpenAISettingsBuilder(); + + // Act + var result = builder.Build(); + + // Assert + result.Should().NotBeNull().And.BeOfType(); + } +} \ No newline at end of file From 947bb90a2a8e6869506f6ae4e50fc97ef08114bf Mon Sep 17 00:00:00 2001 From: Justin Yoo Date: Thu, 15 Aug 2024 11:44:02 +0900 Subject: [PATCH 2/3] Add comments what to be implemented --- .../Extensions/ServiceCollectionExtensions.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs b/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs index 4afb057e..de22edeb 100644 --- a/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs +++ b/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs @@ -16,10 +16,15 @@ public static class ServiceCollectionExtensions /// /// instance. /// Returns instance. - public static IServiceCollection AddOpenAISettingsFromAppSettings(this IServiceCollection services) + public static IServiceCollection AddOpenAISettings(this IServiceCollection services) { services.AddSingleton(sp => { + //var settings = new OpenAISettingsBuilder() + // .WithAppSettings(sp) + // .WithKeyVault(sp) + // .Build(); + var configuration = sp.GetService() ?? throw new InvalidOperationException($"{nameof(IConfiguration)} service is not registered."); @@ -39,7 +44,7 @@ public static IServiceCollection AddOpenAISettingsFromAppSettings(this IServiceC /// Returns instance. public static IServiceCollection AddOpenAIService(this IServiceCollection services) { - services.AddOpenAISettingsFromAppSettings(); + services.AddOpenAISettings(); services.AddHttpClient(); return services; From 2ad2f35b80b17ebdefebe5f356f678367e6a38d8 Mon Sep 17 00:00:00 2001 From: Justin Yoo Date: Thu, 15 Aug 2024 14:03:14 +0900 Subject: [PATCH 3/3] Add method - To add list of OpenAI access details --- .gitignore | 4 ++ .../Builders/OpenAISettingsBuilder.cs | 18 +++++-- .../Builders/OpenAISettingsBuilderTests.cs | 50 ++++++++++++++++++- 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index cbd84e36..bba0bd1b 100644 --- a/.gitignore +++ b/.gitignore @@ -483,12 +483,16 @@ $RECYCLE.BIN/ # Vim temporary swap files *.swp +# Project-specific *.bak *.org appsettings.Development.json appsettings.Production.json +# Live Unit Testing +*.lutconfig + # azd .azure diff --git a/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs b/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs index f9210482..42597707 100644 --- a/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs +++ b/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs @@ -7,6 +7,12 @@ namespace AzureOpenAIProxy.ApiApp.Builders; /// public interface IOpenAISettingsBuilder { + /// + /// Sets the list of instances. + /// + /// List of instances. + void SetOpenAIInstances(IEnumerable? instances); + /// /// Builds the instance. /// @@ -19,13 +25,19 @@ public interface IOpenAISettingsBuilder /// public class OpenAISettingsBuilder : IOpenAISettingsBuilder { - private OpenAISettings? _settings; + private IEnumerable? _instances; + + /// + public void SetOpenAIInstances(IEnumerable? instances) + { + this._instances = instances; + } /// public OpenAISettings Build() { - this._settings ??= new OpenAISettings(); + var settings = new OpenAISettings() { Instances = (this._instances ?? []).ToList() }; - return this._settings; + return settings; } } diff --git a/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs index c024ffd9..bf5e8785 100644 --- a/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs +++ b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs @@ -17,6 +17,54 @@ public void Given_OpenAISettingsBuilder_When_Invoked_Build_Then_It_Should_Return var result = builder.Build(); // Assert - result.Should().NotBeNull().And.BeOfType(); + result.Should().NotBeNull() + .And.BeOfType(); + } + + [Fact] + public void Given_OpenAISettingsBuilder_When_Invoked_Build_Then_It_Should_Return_Empty() + { + // Arrange + var builder = new OpenAISettingsBuilder(); + + // Act + var result = builder.Build(); + + // Assert + result.Instances.Should().NotBeNull() + .And.BeEmpty(); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(10)] + public void Given_OpenAISettingsBuilder_When_Invoked_SetOpenAIInstances_Then_It_Should_Set_Instances(int count) + { + // Arrange + var builder = new OpenAISettingsBuilder(); + var instances = Enumerable.Range(0, count).Select(p => new OpenAIInstanceSettings()).ToList(); + + // Act + builder.SetOpenAIInstances(instances); + var result = builder.Build(); + + // Assert + result.Instances.Should().HaveCount(count); + } + + [Fact] + public void Given_OpenAISettingsBuilder_When_Invoked_SetOpenAIInstances_Then_It_Should_Return_Empty() + { + // Arrange + var builder = new OpenAISettingsBuilder(); + + // Act + builder.SetOpenAIInstances(null); + var result = builder.Build(); + + // Assert + result.Instances.Should().NotBeNull() + .And.BeEmpty(); } } \ No newline at end of file