// Copyright (c) Microsoft. All rights reserved. using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.SemanticKernel; internal static class Program { internal static async Task Main(string[] args) { var builder = Host.CreateApplicationBuilder(args); builder.Configuration.AddUserSecrets(); // Adding configuration from appsettings.json and environment variables builder.Services.ConfigureOptions(OpenAIOptions.SectionName); builder.Services.ConfigureOptions(ChatOptions.SectionName); // Configure Semantic Kernel in DI container builder.Services .AddKernel() .AddOpenAIChatCompletion( modelId: builder.Configuration[$"{OpenAIOptions.SectionName}:ChatModelId"]!, apiKey: builder.Configuration[$"{OpenAIOptions.SectionName}:ApiKey"]! ); // Register audio chat pipeline services builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // Register audio chat pipeline builder.Services.AddTransient(); using var host = builder.Build(); // Setting up graceful shutdown on Ctrl+C using var cts = new CancellationTokenSource(); Console.CancelKeyPress += (_, e) => { e.Cancel = true; cts.Cancel(); }; // Run the voice chat pipeline using var pipeline = host.Services.GetRequiredService(); await pipeline.RunAsync(cts.Token); } private static void ConfigureOptions(this IServiceCollection services, string sectionName) where TOptions : class => services .AddOptions() .BindConfiguration(sectionName) .ValidateDataAnnotations() .ValidateOnStart(); }