src/common/details/azcli/AzCliConsoleGui_PickOrCreateAndConfig_CognitiveServicesResource_OpenAiKind.cs (138 lines of code) (raw):
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.md file in the project root for full license information.
//
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Net;
using Azure.AI.Details.Common.CLI.ConsoleGui;
using Azure.AI.Details.Common.CLI.Telemetry;
using Azure.AI.Details.Common.CLI.Telemetry.Events;
namespace Azure.AI.Details.Common.CLI
{
public partial class AzCliConsoleGui
{
public static async Task<AzCli.CognitiveServicesResourceInfoEx> PickOrCreateAndConfigCognitiveServicesOpenAiKindResource(
INamedValues values,
bool interactive,
string subscriptionId,
string regionFilter = null,
string groupFilter = null,
string resourceFilter = null,
string kinds = null,
string sku = null,
bool yes = false,
bool skipChat = false,
bool allowSkipChat = true,
bool skipEmbeddings = false,
bool allowSkipEmbeddings = true,
bool skipRealTime = false,
bool allowSkipRealTime = true,
string chatDeploymentFilter = null,
string embeddingsDeploymentFilter = null,
string realtimeDeploymentFilter = null,
string chatModelFilter = null,
string embeddingsModelFilter = null,
string realtimeModelFilter = null)
{
kinds ??= "OpenAI;AIServices";
var sectionHeader = "AZURE OPENAI RESOURCE";
var regionLocation = !string.IsNullOrEmpty(regionFilter) ? await AzCliConsoleGui.PickRegionLocationAsync(interactive, regionFilter) : new AzCli.AccountRegionLocationInfo();
var resource = await AzCliConsoleGui.PickOrCreateCognitiveResource(sectionHeader, interactive, subscriptionId, regionLocation.Name, groupFilter, resourceFilter, kinds, sku, yes);
var (chatDeployment, embeddingsDeployment, realtimeDeployment, keys) = await PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(
values,
sectionHeader,
interactive,
subscriptionId,
resource,
skipChat,
allowSkipChat,
chatDeploymentFilter,
chatModelFilter,
skipEmbeddings,
allowSkipEmbeddings,
embeddingsDeploymentFilter,
embeddingsModelFilter,
skipRealTime,
allowSkipRealTime,
realtimeDeploymentFilter,
realtimeModelFilter);
return new AzCli.CognitiveServicesResourceInfoEx
{
Id = resource.Id,
Group = resource.Group,
Name = resource.Name,
Kind = resource.Kind,
RegionLocation = resource.RegionLocation,
Endpoint = resource.Endpoint,
Key = keys.Key1,
ChatDeployment = chatDeployment.HasValue ? chatDeployment.Value.Name : null,
EmbeddingsDeployment = embeddingsDeployment.HasValue ? embeddingsDeployment.Value.Name : null,
RealTimeDeployment = realtimeDeployment.HasValue ? realtimeDeployment.Value.Name : null
};
}
public static async Task<(AzCli.CognitiveServicesDeploymentInfo?, AzCli.CognitiveServicesDeploymentInfo?, AzCli.CognitiveServicesDeploymentInfo?, AzCli.CognitiveServicesKeyInfo)>
PickOrCreateAndConfigCognitiveServicesOpenAiKindResourceDeployments(
INamedValues values,
string sectionHeader,
bool interactive,
string subscriptionId,
AzCli.CognitiveServicesResourceInfo resource,
bool skipChat = false,
bool allowSkipChat = true,
string chatDeploymentFilter = null,
string chatModelFilter = null,
bool skipEmbeddings = true,
bool allowSkipEmbeddings = true,
string embeddingsDeploymentFilter = null,
string embeddingsModelFilter = null,
bool skipRealtime = true,
bool allowSkipRealTime = true,
string realtimeDeploymentFilter = null,
string realtimeModelFilter = null)
{
bool createdNew = false;
AzCli.CognitiveServicesDeploymentInfo? chatDeployment = null, embeddingsDeployment = null, realtimeDeployment = null;
var token = CancellationToken.None;
(chatDeployment, createdNew) = !skipChat
? await Program.Telemetry.WrapAsync(
() => PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipChat, "Chat", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, chatDeploymentFilter, chatModelFilter),
(outcome, res, ex, timeTaken) => CreateInitDeploymentTelemetryEvent(values, InitStage.Chat, outcome, ex, timeTaken, res))
: (null, false);
(embeddingsDeployment, createdNew) = !skipEmbeddings
? await Program.Telemetry.WrapAsync(
() => PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipEmbeddings, "Embeddings", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, embeddingsDeploymentFilter, embeddingsModelFilter),
(outcome, res,ex, timeTaken) => CreateInitDeploymentTelemetryEvent(values, InitStage.Embeddings, outcome, ex, timeTaken, res))
: (null, false);
(realtimeDeployment, createdNew) = !skipRealtime
? await Program.Telemetry.WrapAsync(
() => PickOrCreateCognitiveServicesResourceDeployment(interactive, allowSkipRealTime, "RealTime", subscriptionId, resource.Group, resource.RegionLocation, resource.Name, realtimeDeploymentFilter, realtimeModelFilter),
(outcome, res, ex, timeTaken) => CreateInitDeploymentTelemetryEvent(values, InitStage.RealTime, outcome, ex, timeTaken, res))
: (null, false);
var keys = await AzCliConsoleGui.LoadCognitiveServicesResourceKeys(sectionHeader, subscriptionId, resource);
if (resource.Kind == "AIServices")
{
ConfigSetHelpers.ConfigCognitiveServicesAIServicesKindResource(subscriptionId, resource.RegionLocation, resource.Endpoint, chatDeployment, embeddingsDeployment, realtimeDeployment, keys.Key1);
}
else
{
ConfigSetHelpers.ConfigOpenAiResource(subscriptionId, resource.RegionLocation, resource.Endpoint, chatDeployment, embeddingsDeployment, realtimeDeployment, keys.Key1);
}
return (chatDeployment, embeddingsDeployment, realtimeDeployment, keys);
}
private static ITelemetryEvent CreateInitDeploymentTelemetryEvent(INamedValues values, InitStage stage, Outcome outcome, Exception ex, TimeSpan duration, (AzCli.CognitiveServicesDeploymentInfo? deployment, bool createdNew) result) =>
values == null ? null : new InitTelemetryEvent(stage)
{
Outcome = outcome,
DurationInMs = duration.TotalMilliseconds,
Error = ex?.Message,
Selected = result.deployment == null
? ex == null ? "skip" : "new"
: result.createdNew ? "new" : "existing",
RunId = values.GetOrDefault("telemetry.init.run_id", null),
RunType = values.GetOrDefault("telemetry.init.run_type", null),
};
}
}