/// <summary> /// Creates a composed model from a collection of existing trained models with labels. /// </summary> /// <param name="modelIds">List of model ids to use in the composed model.</param> /// <param name="createComposedModelOptions">A set of options available for configuring the create composed model request.</param> /// <param name="cancellationToken">A <see cref="CancellationToken"/> controlling the request lifetime.</param> /// <returns> /// <para>A <see cref="CreateComposedModelOperation"/> to wait on this long-running operation. Its Value upon successful /// completion will contain meta-data about the composed model.</para> /// </returns> public virtual async Task <CreateComposedModelOperation> StartCreateComposedModelAsync(IEnumerable <string> modelIds, CreateComposedModelOptions createComposedModelOptions = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(modelIds, nameof(modelIds)); createComposedModelOptions ??= new CreateComposedModelOptions(); using DiagnosticScope scope = Diagnostics.CreateScope($"{nameof(FormTrainingClient)}.{nameof(StartCreateComposedModel)}"); scope.Start(); try { var modelIdsGuid = new List <Guid>(); foreach (var modelId in modelIds) { modelIdsGuid.Add(ClientCommon.ValidateModelId(modelId, nameof(modelId))); } var composeRequest = new ComposeRequest(modelIdsGuid); if (createComposedModelOptions.ModelName?.Length > 0) { composeRequest.ModelName = createComposedModelOptions.ModelName; } ResponseWithHeaders <FormRecognizerComposeCustomModelsAsyncHeaders> response = await ServiceClient.ComposeCustomModelsAsyncAsync(composeRequest).ConfigureAwait(false); return(new CreateComposedModelOperation(response.Headers.Location, ServiceClient, Diagnostics)); } catch (Exception e) { scope.Failed(e); throw; } }