private static async Task FindDeployableModel()

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];
        }