in src/common/details/azcli/AzCliConsoleGui_CognitiveServicesResourceDeploymentPicker.cs [166:232]
private static async Task<AzCli.CognitiveServicesModelInfo?> FindDeployableModel(bool interactive, string deploymentExtra, string subscriptionId, string resourceRegionLocation, string modelFilter)
{
Console.Write("\rModel: *** Loading choices ***");
var models = await AzCli.ListCognitiveServicesModels(subscriptionId, resourceRegionLocation);
var usage = await AzCli.ListCognitiveServicesUsage(subscriptionId, resourceRegionLocation);
if (string.IsNullOrEmpty(models.Output.StdOutput) && !string.IsNullOrEmpty(models.Output.StdError))
{
throw new ApplicationException($"ERROR: Loading models\n{models.Output.StdError}");
}
else if (string.IsNullOrEmpty(usage.Output.StdOutput) && !string.IsNullOrEmpty(usage.Output.StdError))
{
throw new ApplicationException($"ERROR: Loading model usage\n{usage.Output.StdError}");
}
var lookForChatCompletionCapable = deploymentExtra.ToLower() == "chat" || deploymentExtra.ToLower() == "evaluation";
var lookForEmbeddingCapable = deploymentExtra.ToLower() == "embeddings";
var lookForRealtimeCapable = deploymentExtra.ToLower() == "realtime";
var capableModels = models.Payload
.Where(x => !lookForChatCompletionCapable || x.ChatCompletionCapable)
.Where(x => !lookForEmbeddingCapable || x.EmbeddingsCapable)
.Where(x => !lookForRealtimeCapable || x.RealtimeCapable)
.ToArray();
Console.Write("\rModel: ");
var deployableModels = FilterModelsByUsage(capableModels, usage.Payload);
var exactMatch = modelFilter != null && deployableModels.Count(x => ExactMatchModel(x, modelFilter)) == 1;
if (exactMatch) deployableModels = deployableModels.Where(x => ExactMatchModel(x, modelFilter)).ToArray();
if (deployableModels.Count() == 0)
{
ConsoleHelpers.WriteLineError(models.Payload.Count() > 0
? $"*** No matching {deploymentExtra} capable models with capacity found ***"
: "*** No deployable models found ***");
return null;
}
else if (deployableModels.Count() == 1 && (!interactive || exactMatch))
{
var model = deployableModels.First();
Console.WriteLine($"{model.Name} (version {model.Version}) ({model.SkuName}) ({model.UsageName})");
return model;
}
else if (!interactive)
{
ConsoleHelpers.WriteLineError("*** More than 1 deployable model found ***");
Console.WriteLine();
DisplayDeployableModels(deployableModels.ToList(), " ");
return null;
}
var choices = deployableModels.Select(x => x.Name + " (version " + x.Version + ") (" + x.SkuName + ")").ToArray();
var scanFor = deploymentExtra.ToLower() switch
{
"chat" => "gpt",
"embeddings" => "embedding",
_ => deploymentExtra.ToLower()
};
var select = Math.Max(0, Array.FindLastIndex(choices, x => x.Contains(scanFor)));
var index = ListBoxPicker.PickIndexOf(choices, select);
if (index < 0) return null;
return deployableModels[index];
}