forked from aliencube/azure-openai-sdk-proxy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServiceCollectionExtensions.cs
More file actions
170 lines (142 loc) · 6.72 KB
/
ServiceCollectionExtensions.cs
File metadata and controls
170 lines (142 loc) · 6.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
using Azure.Data.Tables;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using AzureOpenAIProxy.ApiApp.Builders;
using AzureOpenAIProxy.ApiApp.Configurations;
using AzureOpenAIProxy.ApiApp.Filters;
using AzureOpenAIProxy.ApiApp.Services;
using Microsoft.OpenApi.Models;
namespace AzureOpenAIProxy.ApiApp.Extensions;
/// <summary>
/// This represents the extension class for <see cref="IServiceCollection"/>
/// </summary>
public static class ServiceCollectionExtensions
{
/// <summary>
/// Adds the KeyVault service to the service collection.
/// </summary>
/// <param name="services"><see cref="IServiceCollection"/> instance.</param>
/// <returns>Returns <see cref="IServiceCollection"/> instance.</returns>
public static IServiceCollection AddKeyVaultService(this IServiceCollection services)
{
services.AddSingleton<SecretClient>(sp =>
{
var configuration = sp.GetService<IConfiguration>()
?? throw new InvalidOperationException($"{nameof(IConfiguration)} service is not registered.");
var settings = configuration.GetSection(AzureSettings.Name).GetSection(KeyVaultSettings.Name).Get<KeyVaultSettings>()
?? throw new InvalidOperationException($"{nameof(KeyVaultSettings)} could not be retrieved from the configuration.");
if (string.IsNullOrWhiteSpace(settings.VaultUri) == true)
{
throw new InvalidOperationException($"{nameof(KeyVaultSettings.VaultUri)} is not defined.");
}
if (string.IsNullOrWhiteSpace(settings.SecretNames[KeyVaultSecretNames.OpenAI]) == true)
{
throw new InvalidOperationException($"{nameof(KeyVaultSettings.SecretNames)}.{KeyVaultSecretNames.OpenAI} is not defined.");
}
var client = new SecretClient(new Uri(settings.VaultUri), new DefaultAzureCredential());
return client;
});
return services;
}
/// <summary>
/// Adds the OpenAI configuration settings to the service collection by reading appsettings.json.
/// </summary>
/// <param name="services"><see cref="IServiceCollection"/> instance.</param>
/// <returns>Returns <see cref="IServiceCollection"/> instance.</returns>
public static IServiceCollection AddOpenAISettings(this IServiceCollection services)
{
services.AddSingleton<OpenAISettings>(sp =>
{
var settings = new OpenAISettingsBuilder()
//.WithAppSettings(sp)
.WithKeyVault(sp)
.Build();
return settings;
});
return services;
}
/// <summary>
/// Adds the OpenAI service to the service collection.
/// </summary>
/// <param name="services"><see cref="IServiceCollection"/> instance.</param>
/// <returns>Returns <see cref="IServiceCollection"/> instance.</returns>
public static IServiceCollection AddOpenAIService(this IServiceCollection services)
{
services.AddOpenAISettings();
services.AddHttpClient<IOpenAIService, OpenAIService>();
return services;
}
/// <summary>
/// Adds the OpenAPI service to the services collection.
/// </summary>
/// <param name="services"><see cref="IServiceCollection"/> instance.</param>
/// <returns>Returns <see cref="IServiceCollection"/> instance.</returns>
public static IServiceCollection AddOpenApiService(this IServiceCollection services)
{
var settings = services.GetOpenApiSettings();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
services.AddEndpointsApiExplorer();
services.AddSwaggerGen(options =>
{
var info = new OpenApiInfo()
{
Version = settings.DocVersion,
Title = Constants.Title,
Description = "Providing a proxy service to Azure OpenAI API",
Contact = new OpenApiContact()
{
Name = "Azure OpenAI Proxy API",
Email = "aoai-proxy@contoso.com",
Url = new Uri("https://aka.ms/aoai-proxy.net")
},
};
options.SwaggerDoc(settings.DocVersion, info);
options.AddSecurityDefinition(
"apiKey",
new OpenApiSecurityScheme()
{
Name = "api-key",
Type = SecuritySchemeType.ApiKey,
Description = "API key needed to access the endpoints.",
In = ParameterLocation.Header,
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "apiKey" }
},
Array.Empty<string>()
}
});
options.DocumentFilter<OpenApiTagFilter>();
options.OperationFilter<OpenApiParameterIgnoreFilter>();
});
return services;
}
/// <summary>
/// Adds the TableServiceClient to the services collection.
/// </summary>
/// <param name="services"><see cref="IServiceCollection"/> instance.</param>
/// <returns>Returns <see cref="IServiceCollection"/> instance.</returns>
public static IServiceCollection AddTableStorageService(this IServiceCollection services)
{
services.AddSingleton<TableServiceClient>(sp => {
var configuration = sp.GetService<IConfiguration>()
?? throw new InvalidOperationException($"{nameof(IConfiguration)} service is not registerd.");
var settings = configuration.GetSection(AzureSettings.Name).GetSection(KeyVaultSettings.Name).Get<KeyVaultSettings>()
?? throw new InvalidOperationException($"{nameof(KeyVaultSettings)} could not be retrieved from the configuration.");
var clientSecret = sp.GetService<SecretClient>()
?? throw new InvalidOperationException($"{nameof(SecretClient)} service is not registered.");
if (string.IsNullOrWhiteSpace(settings.SecretNames[KeyVaultSecretNames.Storage]) == true)
{
throw new InvalidOperationException($"{nameof(KeyVaultSettings.SecretNames)}.{KeyVaultSecretNames.Storage} is not defined.");
}
var storageKeyVault = clientSecret.GetSecret(settings.SecretNames[KeyVaultSecretNames.Storage]!);
var client = new TableServiceClient(storageKeyVault.Value.Value);
return client;
});
return services;
}
}