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
new file mode 100644
index 00000000..42597707
--- /dev/null
+++ b/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs
@@ -0,0 +1,43 @@
+using AzureOpenAIProxy.ApiApp.Configurations;
+
+namespace AzureOpenAIProxy.ApiApp.Builders;
+
+///
+/// This provides interface to the class.
+///
+public interface IOpenAISettingsBuilder
+{
+ ///
+ /// Sets the list of instances.
+ ///
+ /// List of instances.
+ void SetOpenAIInstances(IEnumerable? instances);
+
+ ///
+ /// Builds the instance.
+ ///
+ /// Returns the instance.
+ OpenAISettings Build();
+}
+
+///
+/// This represents the builder entity for class.
+///
+public class OpenAISettingsBuilder : IOpenAISettingsBuilder
+{
+ private IEnumerable? _instances;
+
+ ///
+ public void SetOpenAIInstances(IEnumerable? instances)
+ {
+ this._instances = instances;
+ }
+
+ ///
+ public OpenAISettings Build()
+ {
+ var settings = new OpenAISettings() { Instances = (this._instances ?? []).ToList() };
+
+ return settings;
+ }
+}
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;
diff --git a/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs
new file mode 100644
index 00000000..bf5e8785
--- /dev/null
+++ b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs
@@ -0,0 +1,70 @@
+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();
+ }
+
+ [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