sdk/textanalytics/Azure.AI.TextAnalytics/src/ServiceClients/LanguageServiceClient.cs (2,167 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; using Azure.AI.TextAnalytics.Models; using Azure.Core; using Azure.Core.Pipeline; namespace Azure.AI.TextAnalytics.ServiceClients { /// <summary> /// Allows the <see cref="TextAnalyticsClient" /> to operate against the /// Cognitive Language REST API service using an abstraction common among the /// different services. /// </summary> /// internal class LanguageServiceClient : ServiceClient { private readonly MicrosoftCognitiveLanguageServiceTextAnalysisRestClient _languageRestClient; private readonly ClientDiagnostics _clientDiagnostics; private readonly Uri _baseUri; public override ClientDiagnostics Diagnostics => _clientDiagnostics; public LanguageServiceClient(Uri endpoint, TokenCredential credential, string authorizationScope, string serviceVersion, TextAnalyticsClientOptions options) : base(options) { Argument.AssertNotNull(endpoint, nameof(endpoint)); Argument.AssertNotNull(credential, nameof(credential)); Argument.AssertNotNull(options, nameof(options)); Argument.AssertNotNullOrEmpty(authorizationScope, nameof(authorizationScope)); Argument.AssertNotNullOrEmpty(serviceVersion, nameof(serviceVersion)); _baseUri = endpoint; _clientDiagnostics = new ClientDiagnostics(options); var pipeline = HttpPipelineBuilder.Build(new HttpPipelineOptions(options) { PerRetryPolicies = { new BearerTokenAuthenticationPolicy(credential, authorizationScope) }, RequestFailedDetailsParser = new TextAnalyticsFailedDetailsParser() }); _languageRestClient = new MicrosoftCognitiveLanguageServiceTextAnalysisRestClient(_clientDiagnostics, pipeline, endpoint.AbsoluteUri, serviceVersion); } public LanguageServiceClient(Uri endpoint, AzureKeyCredential credential, string serviceVersion, TextAnalyticsClientOptions options) : base(options) { Argument.AssertNotNull(endpoint, nameof(endpoint)); Argument.AssertNotNull(credential, nameof(credential)); Argument.AssertNotNull(options, nameof(options)); Argument.AssertNotNullOrEmpty(serviceVersion, nameof(serviceVersion)); _baseUri = endpoint; _clientDiagnostics = new ClientDiagnostics(options); var pipeline = HttpPipelineBuilder.Build(new HttpPipelineOptions(options) { PerRetryPolicies = { new AzureKeyCredentialPolicy(credential, Constants.AuthorizationHeader) }, RequestFailedDetailsParser = new TextAnalyticsFailedDetailsParser() }); _languageRestClient = new MicrosoftCognitiveLanguageServiceTextAnalysisRestClient(_clientDiagnostics, pipeline, endpoint.AbsoluteUri, serviceVersion); } #region Detect Language public override async Task<Response<DetectedLanguage>> DetectLanguageAsync(string document, string countryHint = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(DetectLanguage)}"); scope.Start(); try { var documents = new List<LanguageInput>() { ConvertToLanguageInput(document, countryHint) }; var input = new LanguageDetectionAnalysisInput(); foreach (var doc in documents) { input.Documents.Add(doc); } var analyzeLanguageDetection = new AnalyzeTextLanguageDetectionInput { AnalysisInput = input }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync(analyzeLanguageDetection, cancellationToken: cancellationToken).ConfigureAwait(false); var languageDetection = (LanguageDetectionTaskResult)result.Value; Response response = result.GetRawResponse(); if (languageDetection.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToDetectedLanguage(languageDetection.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<DetectedLanguage> DetectLanguage(string document, string countryHint = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(DetectLanguage)}"); scope.Start(); try { var documents = new List<LanguageInput>() { ConvertToLanguageInput(document, countryHint) }; var input = new LanguageDetectionAnalysisInput(); foreach (var doc in documents) { input.Documents.Add(doc); } var analyzeLanguageDetection = new AnalyzeTextLanguageDetectionInput { AnalysisInput = input }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze(analyzeLanguageDetection, cancellationToken: cancellationToken); var languageDetection = (LanguageDetectionTaskResult)result.Value; Response response = result.GetRawResponse(); if (languageDetection.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToDetectedLanguage(languageDetection.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<DetectLanguageResultCollection>> DetectLanguageBatchAsync(IEnumerable<string> documents, string countryHint = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); LanguageDetectionAnalysisInput detectLanguageInputs = DocumentsToLanguageDetection(documents, countryHint); return await DetectLanguageBatchAsync(detectLanguageInputs, options, cancellationToken).ConfigureAwait(false); } public override Response<DetectLanguageResultCollection> DetectLanguageBatch(IEnumerable<string> documents, string countryHint = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); LanguageDetectionAnalysisInput detectLanguageInputs = DocumentsToLanguageDetection(documents, countryHint); return DetectLanguageBatch(detectLanguageInputs, options, cancellationToken); } public override async Task<Response<DetectLanguageResultCollection>> DetectLanguageBatchAsync(IEnumerable<DetectLanguageInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); LanguageDetectionAnalysisInput detectLanguageInputs = LanguageInputToLanguageDetection(documents); return await DetectLanguageBatchAsync(detectLanguageInputs, options, cancellationToken).ConfigureAwait(false); } public override Response<DetectLanguageResultCollection> DetectLanguageBatch(IEnumerable<DetectLanguageInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); LanguageDetectionAnalysisInput detectLanguageInputs = LanguageInputToLanguageDetection(documents); return DetectLanguageBatch(detectLanguageInputs, options, cancellationToken); } private async Task<Response<DetectLanguageResultCollection>> DetectLanguageBatchAsync(LanguageDetectionAnalysisInput batchInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(DetectLanguageBatch)}"); scope.Start(); try { var analyzeLanguageDetection = new AnalyzeTextLanguageDetectionInput { AnalysisInput = batchInput, Parameters = new LanguageDetectionTaskParameters(options.DisableServiceLogs, options.ModelVersion) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync(analyzeLanguageDetection, options.IncludeStatistics, cancellationToken: cancellationToken).ConfigureAwait(false); var languageDetection = result.Value as LanguageDetectionTaskResult; var response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(batchInput.Documents); DetectLanguageResultCollection results = Transforms.ConvertToDetectLanguageResultCollection(languageDetection.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private Response<DetectLanguageResultCollection> DetectLanguageBatch(LanguageDetectionAnalysisInput batchInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(DetectLanguageBatch)}"); scope.Start(); try { var analyzeLanguageDetection = new AnalyzeTextLanguageDetectionInput { AnalysisInput = batchInput, Parameters = new LanguageDetectionTaskParameters(options.DisableServiceLogs, options.ModelVersion) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze(analyzeLanguageDetection, options.IncludeStatistics, cancellationToken: cancellationToken); var languageDetection = result.Value as LanguageDetectionTaskResult; var response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(batchInput.Documents); DetectLanguageResultCollection results = Transforms.ConvertToDetectLanguageResultCollection(languageDetection.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private LanguageDetectionAnalysisInput DocumentsToLanguageDetection(IEnumerable<string> documents, string countryHint = default) { LanguageDetectionAnalysisInput detectLanguageInputs = new LanguageDetectionAnalysisInput(); int id = 0; foreach (var document in documents) { LanguageInput languageInput = ConvertToLanguageInput(document, countryHint, id); id++; detectLanguageInputs.Documents.Add(languageInput); } return detectLanguageInputs; } private static LanguageDetectionAnalysisInput LanguageInputToLanguageDetection(IEnumerable<DetectLanguageInput> documents) { LanguageDetectionAnalysisInput detectLanguageInputs = new LanguageDetectionAnalysisInput(); foreach (var document in documents) { LanguageInput languageInput = new LanguageInput(document.Id, document.Text); languageInput.CountryHint = document.CountryHint; detectLanguageInputs.Documents.Add(languageInput); } return detectLanguageInputs; } #endregion #region Recognize Entities public override async Task<Response<CategorizedEntityCollection>> RecognizeEntitiesAsync(string document, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeEntities)}"); scope.Start(); try { MultiLanguageAnalysisInput analysisInput = new(); analysisInput.Documents.Add(ConvertToMultiLanguageInput(document, language)); AnalyzeTextEntityRecognitionInput input = new() { AnalysisInput = analysisInput, Parameters = new EntitiesTaskParameters() { StringIndexType = Constants.DefaultStringIndexType } }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( input, cancellationToken: cancellationToken).ConfigureAwait(false); var entityRecognition = (EntitiesTaskResult)result.Value; Response response = result.GetRawResponse(); if (entityRecognition.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToCategorizedEntityCollection(entityRecognition.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<CategorizedEntityCollection> RecognizeEntities(string document, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeEntities)}"); scope.Start(); try { MultiLanguageAnalysisInput analysisInput = new(); analysisInput.Documents.Add(ConvertToMultiLanguageInput(document, language)); AnalyzeTextEntityRecognitionInput input = new() { AnalysisInput = analysisInput, Parameters = new EntitiesTaskParameters() { StringIndexType = Constants.DefaultStringIndexType } }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( input, cancellationToken: cancellationToken); var entityRecognition = (EntitiesTaskResult)result.Value; Response response = result.GetRawResponse(); if (entityRecognition.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToCategorizedEntityCollection(entityRecognition.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<RecognizeEntitiesResultCollection>> RecognizeEntitiesBatchAsync(IEnumerable<string> documents, string language = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return await RecognizeEntitiesBatchAsync(input, options, cancellationToken).ConfigureAwait(false); } public override Response<RecognizeEntitiesResultCollection> RecognizeEntitiesBatch(IEnumerable<string> documents, string language = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return RecognizeEntitiesBatch(input, options, cancellationToken); } public override async Task<Response<RecognizeEntitiesResultCollection>> RecognizeEntitiesBatchAsync(IEnumerable<TextDocumentInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return await RecognizeEntitiesBatchAsync(input, options, cancellationToken).ConfigureAwait(false); } public override Response<RecognizeEntitiesResultCollection> RecognizeEntitiesBatch(IEnumerable<TextDocumentInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return RecognizeEntitiesBatch(input, options, cancellationToken); } private async Task<Response<RecognizeEntitiesResultCollection>> RecognizeEntitiesBatchAsync(MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeEntitiesBatch)}"); scope.Start(); try { AnalyzeTextEntityRecognitionInput input = new() { AnalysisInput = multiLanguageInput, Parameters = new EntitiesTaskParameters( options.DisableServiceLogs, options.ModelVersion, Constants.DefaultStringIndexType) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( input, options.IncludeStatistics, cancellationToken: cancellationToken).ConfigureAwait(false); var entityRecognition = (EntitiesTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); RecognizeEntitiesResultCollection results = Transforms.ConvertToRecognizeEntitiesResultCollection(entityRecognition.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private Response<RecognizeEntitiesResultCollection> RecognizeEntitiesBatch(MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeEntitiesBatch)}"); scope.Start(); try { AnalyzeTextEntityRecognitionInput input = new() { AnalysisInput = multiLanguageInput, Parameters = new EntitiesTaskParameters( options.DisableServiceLogs, options.ModelVersion, Constants.DefaultStringIndexType) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( input, options.IncludeStatistics, cancellationToken: cancellationToken); var entityRecognition = (EntitiesTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); RecognizeEntitiesResultCollection results = Transforms.ConvertToRecognizeEntitiesResultCollection(entityRecognition.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Recognize PII Entities public override async Task<Response<PiiEntityCollection>> RecognizePiiEntitiesAsync(string document, string language = default, RecognizePiiEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizePiiEntities)}"); scope.Start(); try { var documents = new List<MultiLanguageInput>() { ConvertToMultiLanguageInput(document, language) }; var input = new MultiLanguageAnalysisInput(); foreach (var doc in documents) { input.Documents.Add(doc); } AnalyzeTextPiiEntitiesRecognitionInput analyzePiiEntities = new() { AnalysisInput = input, Parameters = PiiEntitiesParameters(options) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync(analyzePiiEntities, cancellationToken: cancellationToken).ConfigureAwait(false); var piiEntities = (PiiTaskResult)result.Value; Response response = result.GetRawResponse(); if (piiEntities.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToPiiEntityCollection(piiEntities.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<PiiEntityCollection> RecognizePiiEntities(string document, string language = default, RecognizePiiEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizePiiEntities)}"); scope.Start(); try { var documents = new List<MultiLanguageInput>() { ConvertToMultiLanguageInput(document, language) }; var input = new MultiLanguageAnalysisInput(); foreach (var doc in documents) { input.Documents.Add(doc); } AnalyzeTextPiiEntitiesRecognitionInput analyzePiiEntities = new() { AnalysisInput = input, Parameters = PiiEntitiesParameters(options) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze(analyzePiiEntities, cancellationToken: cancellationToken); var piiEntities = (PiiTaskResult)result.Value; Response response = result.GetRawResponse(); if (piiEntities.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToPiiEntityCollection(piiEntities.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<RecognizePiiEntitiesResultCollection>> RecognizePiiEntitiesBatchAsync(IEnumerable<string> documents, string language = default, RecognizePiiEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return await RecognizePiiEntitiesBatchAsync(input, options, cancellationToken).ConfigureAwait(false); } public override Response<RecognizePiiEntitiesResultCollection> RecognizePiiEntitiesBatch(IEnumerable<string> documents, string language = default, RecognizePiiEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return RecognizePiiEntitiesBatch(input, options, cancellationToken); } public override async Task<Response<RecognizePiiEntitiesResultCollection>> RecognizePiiEntitiesBatchAsync(IEnumerable<TextDocumentInput> documents, RecognizePiiEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return await RecognizePiiEntitiesBatchAsync(input, options, cancellationToken).ConfigureAwait(false); } public override Response<RecognizePiiEntitiesResultCollection> RecognizePiiEntitiesBatch(IEnumerable<TextDocumentInput> documents, RecognizePiiEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return RecognizePiiEntitiesBatch(input, options, cancellationToken); } private async Task<Response<RecognizePiiEntitiesResultCollection>> RecognizePiiEntitiesBatchAsync(MultiLanguageAnalysisInput multiLanguageInput, RecognizePiiEntitiesOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizePiiEntitiesBatch)}"); scope.Start(); try { AnalyzeTextPiiEntitiesRecognitionInput input = new() { AnalysisInput = multiLanguageInput, Parameters = PiiEntitiesParameters(options) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( input, options.IncludeStatistics, cancellationToken: cancellationToken).ConfigureAwait(false); var entityRecognition = (PiiTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); RecognizePiiEntitiesResultCollection results = Transforms.ConvertToRecognizePiiEntitiesResultCollection(entityRecognition.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private Response<RecognizePiiEntitiesResultCollection> RecognizePiiEntitiesBatch(MultiLanguageAnalysisInput multiLanguageInput, RecognizePiiEntitiesOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizePiiEntitiesBatch)}"); scope.Start(); try { AnalyzeTextPiiEntitiesRecognitionInput input = new() { AnalysisInput = multiLanguageInput, Parameters = PiiEntitiesParameters(options) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( input, options.IncludeStatistics, cancellationToken: cancellationToken); var entityRecognition = (PiiTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); RecognizePiiEntitiesResultCollection results = Transforms.ConvertToRecognizePiiEntitiesResultCollection(entityRecognition.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private static PiiTaskParameters PiiEntitiesParameters(RecognizePiiEntitiesOptions options) { PiiTaskParameters parameters = new() { LoggingOptOut = options.DisableServiceLogs, ModelVersion = options.ModelVersion, Domain = options.DomainFilter.GetString() ?? (PiiDomain?)null, StringIndexType = Constants.DefaultStringIndexType }; if (options.CategoriesFilter.Count > 0) { parameters.PiiCategories = options.CategoriesFilter; } return parameters; } #endregion #region Recognize Custom Entities public override RecognizeCustomEntitiesOperation RecognizeCustomEntities(WaitUntil waitUntil, IEnumerable<string> documents, string projectName, string deploymentName, string language = default, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(RecognizeCustomEntities)}"; return RecognizeCustomEntities(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken); } public override RecognizeCustomEntitiesOperation RecognizeCustomEntities(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(RecognizeCustomEntities)}"; return RecognizeCustomEntities(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken); } public override async Task<RecognizeCustomEntitiesOperation> RecognizeCustomEntitiesAsync(WaitUntil waitUntil, IEnumerable<string> documents, string projectName, string deploymentName, string language = default, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(RecognizeCustomEntities)}"; return await RecognizeCustomEntitiesAsync(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override async Task<RecognizeCustomEntitiesOperation> RecognizeCustomEntitiesAsync(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(RecognizeCustomEntities)}"; return await RecognizeCustomEntitiesAsync(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override RecognizeCustomEntitiesOperation StartRecognizeCustomEntities(IEnumerable<string> documents, string projectName, string deploymentName, string language = default, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartRecognizeCustomEntities)}"; return RecognizeCustomEntities(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken); } public override RecognizeCustomEntitiesOperation StartRecognizeCustomEntities(IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartRecognizeCustomEntities)}"; return RecognizeCustomEntities(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken); } public override async Task<RecognizeCustomEntitiesOperation> StartRecognizeCustomEntitiesAsync(IEnumerable<string> documents, string projectName, string deploymentName, string language = default, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartRecognizeCustomEntities)}"; return await RecognizeCustomEntitiesAsync(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override async Task<RecognizeCustomEntitiesOperation> StartRecognizeCustomEntitiesAsync(IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, RecognizeCustomEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartRecognizeCustomEntities)}"; return await RecognizeCustomEntitiesAsync(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } private static CustomEntitiesLROTask CreateCustomEntitiesTask(string projectName, string deploymentName, RecognizeCustomEntitiesOptions options) { return new CustomEntitiesLROTask() { Parameters = new CustomEntitiesTaskParameters(projectName, deploymentName) { StringIndexType = Constants.DefaultStringIndexType, LoggingOptOut = options.DisableServiceLogs, } }; } private RecognizeCustomEntitiesOperation RecognizeCustomEntities(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, string projectName, string deploymentName, RecognizeCustomEntitiesOptions options, CancellationToken cancellationToken) { options ??= new RecognizeCustomEntitiesOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateCustomEntitiesTask(projectName, deploymentName, options) }) { DisplayName = options.DisplayName, }; var response = _languageRestClient.AnalyzeBatchSubmitJob(input, cancellationToken); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new RecognizeCustomEntitiesOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { operation.WaitForCompletion(cancellationToken); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } private async Task<RecognizeCustomEntitiesOperation> RecognizeCustomEntitiesAsync(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, string projectName, string deploymentName, RecognizeCustomEntitiesOptions options, CancellationToken cancellationToken) { options ??= new RecognizeCustomEntitiesOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateCustomEntitiesTask(projectName, deploymentName, options) }) { DisplayName = options.DisplayName, }; var response = await _languageRestClient.AnalyzeBatchSubmitJobAsync(input, cancellationToken).ConfigureAwait(false); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new RecognizeCustomEntitiesOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { await operation.WaitForCompletionAsync(cancellationToken).ConfigureAwait(false); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Analyze Sentiment public override async Task<Response<DocumentSentiment>> AnalyzeSentimentAsync(string document, string language = default, AnalyzeSentimentOptions options = null, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeSentiment)}"); scope.Start(); try { MultiLanguageAnalysisInput analysisInput = new(); analysisInput.Documents.Add(ConvertToMultiLanguageInput(document, language)); AnalyzeTextSentimentAnalysisInput analyzePiiEntities = new() { AnalysisInput = analysisInput, Parameters = AnalyzeSentimentParameters(options) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync(analyzePiiEntities, cancellationToken: cancellationToken).ConfigureAwait(false); var sentimentResult = (SentimentTaskResult)result.Value; Response response = result.GetRawResponse(); if (sentimentResult.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(new DocumentSentiment(sentimentResult.Results.Documents[0]), response); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<DocumentSentiment> AnalyzeSentiment(string document, string language = default, AnalyzeSentimentOptions options = null, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeSentiment)}"); scope.Start(); try { MultiLanguageAnalysisInput analysisInput = new(); analysisInput.Documents.Add(ConvertToMultiLanguageInput(document, language)); AnalyzeTextSentimentAnalysisInput analyzePiiEntities = new() { AnalysisInput = analysisInput, Parameters = AnalyzeSentimentParameters(options) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze(analyzePiiEntities, cancellationToken: cancellationToken); var sentimentResult = (SentimentTaskResult)result.Value; Response response = result.GetRawResponse(); if (sentimentResult.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(new DocumentSentiment(sentimentResult.Results.Documents[0]), response); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<AnalyzeSentimentResultCollection>> AnalyzeSentimentBatchAsync(IEnumerable<string> documents, string language = default, AnalyzeSentimentOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); return await AnalyzeSentimentBatchAsync(documentInputs, options, cancellationToken).ConfigureAwait(false); } public override Response<AnalyzeSentimentResultCollection> AnalyzeSentimentBatch(IEnumerable<string> documents, string language = default, AnalyzeSentimentOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); return AnalyzeSentimentBatch(documentInputs, options, cancellationToken); } public override async Task<Response<AnalyzeSentimentResultCollection>> AnalyzeSentimentBatchAsync(IEnumerable<TextDocumentInput> documents, AnalyzeSentimentOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); return await AnalyzeSentimentBatchAsync(documentInputs, options, cancellationToken).ConfigureAwait(false); } public override Response<AnalyzeSentimentResultCollection> AnalyzeSentimentBatch(IEnumerable<TextDocumentInput> documents, AnalyzeSentimentOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); return AnalyzeSentimentBatch(documentInputs, options, cancellationToken); } private async Task<Response<AnalyzeSentimentResultCollection>> AnalyzeSentimentBatchAsync(MultiLanguageAnalysisInput multiLanguageInput, AnalyzeSentimentOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeSentimentBatch)}"); scope.Start(); try { AnalyzeTextSentimentAnalysisInput analyzeSentiment = new() { AnalysisInput = multiLanguageInput, Parameters = AnalyzeSentimentParameters(options) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( analyzeSentiment, options.IncludeStatistics, cancellationToken: cancellationToken).ConfigureAwait(false); var sentimentResult = (SentimentTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); AnalyzeSentimentResultCollection results = Transforms.ConvertToAnalyzeSentimentResultCollection(sentimentResult.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private Response<AnalyzeSentimentResultCollection> AnalyzeSentimentBatch(MultiLanguageAnalysisInput multiLanguageInput, AnalyzeSentimentOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeSentimentBatch)}"); scope.Start(); try { AnalyzeTextSentimentAnalysisInput analyzeSentiment = new() { AnalysisInput = multiLanguageInput, Parameters = AnalyzeSentimentParameters(options) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( analyzeSentiment, options.IncludeStatistics, cancellationToken: cancellationToken); var sentimentResult = (SentimentTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); AnalyzeSentimentResultCollection results = Transforms.ConvertToAnalyzeSentimentResultCollection(sentimentResult.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private static SentimentAnalysisTaskParameters AnalyzeSentimentParameters(AnalyzeSentimentOptions options) { return new SentimentAnalysisTaskParameters() { LoggingOptOut = options.DisableServiceLogs, ModelVersion = options.ModelVersion, OpinionMining = options.IncludeOpinionMining, StringIndexType = Constants.DefaultStringIndexType }; } #endregion #region Extract Key Phrases public override async Task<Response<KeyPhraseCollection>> ExtractKeyPhrasesAsync(string document, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(ExtractKeyPhrases)}"); scope.Start(); try { MultiLanguageAnalysisInput analysisInput = new(); analysisInput.Documents.Add(ConvertToMultiLanguageInput(document, language)); var input = new AnalyzeTextKeyPhraseExtractionInput { AnalysisInput = analysisInput }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( input, cancellationToken: cancellationToken).ConfigureAwait(false); var keyPhrases = (KeyPhraseTaskResult)result.Value; Response response = result.GetRawResponse(); if (keyPhrases.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToKeyPhraseCollection(keyPhrases.Results.Documents[0]), response); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<KeyPhraseCollection> ExtractKeyPhrases(string document, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(ExtractKeyPhrases)}"); scope.Start(); try { MultiLanguageAnalysisInput analysisInput = new(); analysisInput.Documents.Add(ConvertToMultiLanguageInput(document, language)); var input = new AnalyzeTextKeyPhraseExtractionInput { AnalysisInput = analysisInput }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( input, cancellationToken: cancellationToken); var keyPhrases = (KeyPhraseTaskResult)result.Value; Response response = result.GetRawResponse(); if (keyPhrases.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToKeyPhraseCollection(keyPhrases.Results.Documents[0]), response); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<ExtractKeyPhrasesResultCollection>> ExtractKeyPhrasesBatchAsync(IEnumerable<string> documents, string language = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); return await ExtractKeyPhrasesBatchAsync(documentInputs, options, cancellationToken).ConfigureAwait(false); } public override Response<ExtractKeyPhrasesResultCollection> ExtractKeyPhrasesBatch(IEnumerable<string> documents, string language = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); return ExtractKeyPhrasesBatch(documentInputs, options, cancellationToken); } public override async Task<Response<ExtractKeyPhrasesResultCollection>> ExtractKeyPhrasesBatchAsync(IEnumerable<TextDocumentInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); return await ExtractKeyPhrasesBatchAsync(documentInputs, options, cancellationToken).ConfigureAwait(false); } public override Response<ExtractKeyPhrasesResultCollection> ExtractKeyPhrasesBatch(IEnumerable<TextDocumentInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); return ExtractKeyPhrasesBatch(documentInputs, options, cancellationToken); } private async Task<Response<ExtractKeyPhrasesResultCollection>> ExtractKeyPhrasesBatchAsync(MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(ExtractKeyPhrasesBatch)}"); scope.Start(); try { AnalyzeTextKeyPhraseExtractionInput input = new() { AnalysisInput = multiLanguageInput, Parameters = new KeyPhraseTaskParameters(options.DisableServiceLogs, options.ModelVersion) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( input, options.IncludeStatistics, cancellationToken: cancellationToken).ConfigureAwait(false); var keyPhrases = (KeyPhraseTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); ExtractKeyPhrasesResultCollection results = Transforms.ConvertToExtractKeyPhrasesResultCollection(keyPhrases.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private Response<ExtractKeyPhrasesResultCollection> ExtractKeyPhrasesBatch(MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(ExtractKeyPhrasesBatch)}"); scope.Start(); try { AnalyzeTextKeyPhraseExtractionInput input = new() { AnalysisInput = multiLanguageInput, Parameters = new KeyPhraseTaskParameters(options.DisableServiceLogs, options.ModelVersion) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( input, options.IncludeStatistics, cancellationToken: cancellationToken); var keyPhrases = (KeyPhraseTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); ExtractKeyPhrasesResultCollection results = Transforms.ConvertToExtractKeyPhrasesResultCollection(keyPhrases.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Linked Entities public override async Task<Response<LinkedEntityCollection>> RecognizeLinkedEntitiesAsync(string document, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeLinkedEntities)}"); scope.Start(); try { var documents = new List<MultiLanguageInput>() { ConvertToMultiLanguageInput(document, language) }; var input = new MultiLanguageAnalysisInput(); foreach (var doc in documents) { input.Documents.Add(doc); } AnalyzeTextEntityLinkingInput analyzeRecognizeLinkedEntities = new() { AnalysisInput = input, Parameters = new EntityLinkingTaskParameters() { StringIndexType = Constants.DefaultStringIndexType } }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( analyzeRecognizeLinkedEntities, cancellationToken: cancellationToken).ConfigureAwait(false); var linkedEntities = (EntityLinkingTaskResult)result.Value; Response response = result.GetRawResponse(); if (linkedEntities.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToLinkedEntityCollection(linkedEntities.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<LinkedEntityCollection> RecognizeLinkedEntities(string document, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(document, nameof(document)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeLinkedEntities)}"); scope.Start(); try { var documents = new List<MultiLanguageInput>() { ConvertToMultiLanguageInput(document, language) }; var input = new MultiLanguageAnalysisInput(); foreach (var doc in documents) { input.Documents.Add(doc); } AnalyzeTextEntityLinkingInput analyzeRecognizeLinkedEntities = new() { AnalysisInput = input, Parameters = new EntityLinkingTaskParameters() { StringIndexType = Constants.DefaultStringIndexType } }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( analyzeRecognizeLinkedEntities, cancellationToken: cancellationToken); var linkedEntities = (EntityLinkingTaskResult)result.Value; Response response = result.GetRawResponse(); if (linkedEntities.Results.Errors.Count > 0) { throw new RequestFailedException(response); } return Response.FromValue(Transforms.ConvertToLinkedEntityCollection(linkedEntities.Results.Documents.FirstOrDefault()), response); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<RecognizeLinkedEntitiesResultCollection>> RecognizeLinkedEntitiesBatchAsync(IEnumerable<string> documents, string language = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return await RecognizeLinkedEntitiesBatchAsync(input, options, cancellationToken).ConfigureAwait(false); } public override Response<RecognizeLinkedEntitiesResultCollection> RecognizeLinkedEntitiesBatch(IEnumerable<string> documents, string language = default, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return RecognizeLinkedEntitiesBatch(input, options, cancellationToken); } public override async Task<Response<RecognizeLinkedEntitiesResultCollection>> RecognizeLinkedEntitiesBatchAsync(IEnumerable<TextDocumentInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return await RecognizeLinkedEntitiesBatchAsync(input, options, cancellationToken).ConfigureAwait(false); } public override Response<RecognizeLinkedEntitiesResultCollection> RecognizeLinkedEntitiesBatch(IEnumerable<TextDocumentInput> documents, TextAnalyticsRequestOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return RecognizeLinkedEntitiesBatch(input, options, cancellationToken); } private async Task<Response<RecognizeLinkedEntitiesResultCollection>> RecognizeLinkedEntitiesBatchAsync(MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeLinkedEntitiesBatch)}"); scope.Start(); try { AnalyzeTextEntityLinkingInput input = new() { AnalysisInput = multiLanguageInput, Parameters = new EntityLinkingTaskParameters( options.DisableServiceLogs, options.ModelVersion, Constants.DefaultStringIndexType) }; Response<AnalyzeTextTaskResult> result = await _languageRestClient.AnalyzeAsync( input, options.IncludeStatistics, cancellationToken: cancellationToken).ConfigureAwait(false); var linkedEntities = (EntityLinkingTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); RecognizeLinkedEntitiesResultCollection results = Transforms.ConvertToLinkedEntitiesResultCollection(linkedEntities.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } private Response<RecognizeLinkedEntitiesResultCollection> RecognizeLinkedEntitiesBatch(MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsRequestOptions options, CancellationToken cancellationToken) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(RecognizeLinkedEntitiesBatch)}"); scope.Start(); try { AnalyzeTextEntityLinkingInput input = new() { AnalysisInput = multiLanguageInput, Parameters = new EntityLinkingTaskParameters( options.DisableServiceLogs, options.ModelVersion, Constants.DefaultStringIndexType) }; Response<AnalyzeTextTaskResult> result = _languageRestClient.Analyze( input, options.IncludeStatistics, cancellationToken: cancellationToken); var linkedEntities = (EntityLinkingTaskResult)result.Value; Response response = result.GetRawResponse(); IDictionary<string, int> map = CreateIdToIndexMap(multiLanguageInput.Documents); RecognizeLinkedEntitiesResultCollection results = Transforms.ConvertToLinkedEntitiesResultCollection(linkedEntities.Results, map); return Response.FromValue(results, response); } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Healthcare public override AnalyzeHealthcareEntitiesOperation AnalyzeHealthcareEntities(WaitUntil waitUntil, IEnumerable<string> documents, string language = default, AnalyzeHealthcareEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeHealthcareEntities)}"; return AnalyzeHealthcareEntities(scopeName, waitUntil, documentInputs, options, cancellationToken); } public override AnalyzeHealthcareEntitiesOperation AnalyzeHealthcareEntities(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, AnalyzeHealthcareEntitiesOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeHealthcareEntities)}"; return AnalyzeHealthcareEntities(scopeName, waitUntil, documentInputs, options, cancellationToken); } public override async Task<AnalyzeHealthcareEntitiesOperation> AnalyzeHealthcareEntitiesAsync(WaitUntil waitUntil, IEnumerable<string> documents, string language = default, AnalyzeHealthcareEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeHealthcareEntities)}"; return await AnalyzeHealthcareEntitiesAsync(scopeName, waitUntil, documentInputs, options, cancellationToken).ConfigureAwait(false); } public override async Task<AnalyzeHealthcareEntitiesOperation> AnalyzeHealthcareEntitiesAsync(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, AnalyzeHealthcareEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeHealthcareEntities)}"; return await AnalyzeHealthcareEntitiesAsync(scopeName, waitUntil, documentInputs, options, cancellationToken).ConfigureAwait(false); } public override async Task<AnalyzeHealthcareEntitiesOperation> StartAnalyzeHealthcareEntitiesAsync(IEnumerable<string> documents, string language = default, AnalyzeHealthcareEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeHealthcareEntities)}"; return await AnalyzeHealthcareEntitiesAsync(scopeName, WaitUntil.Started, documentInputs, options, cancellationToken).ConfigureAwait(false); } public override AnalyzeHealthcareEntitiesOperation StartAnalyzeHealthcareEntities(IEnumerable<string> documents, string language = default, AnalyzeHealthcareEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeHealthcareEntities)}"; return AnalyzeHealthcareEntities(scopeName, WaitUntil.Started, documentInputs, options, cancellationToken); } public override AnalyzeHealthcareEntitiesOperation StartAnalyzeHealthcareEntities(IEnumerable<TextDocumentInput> documents, AnalyzeHealthcareEntitiesOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeHealthcareEntities)}"; return AnalyzeHealthcareEntities(scopeName, WaitUntil.Started, documentInputs, options, cancellationToken); } public override async Task<AnalyzeHealthcareEntitiesOperation> StartAnalyzeHealthcareEntitiesAsync(IEnumerable<TextDocumentInput> documents, AnalyzeHealthcareEntitiesOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(documents, nameof(documents)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeHealthcareEntities)}"; return await AnalyzeHealthcareEntitiesAsync(scopeName, WaitUntil.Started, documentInputs, options, cancellationToken).ConfigureAwait(false); } private static HealthcareLROTask CreateHealthcareTask(AnalyzeHealthcareEntitiesOptions options) { return new HealthcareLROTask() { Parameters = new HealthcareTaskParameters() { ModelVersion = options.ModelVersion, StringIndexType = Constants.DefaultStringIndexType, LoggingOptOut = options.DisableServiceLogs, } }; } private AnalyzeHealthcareEntitiesOperation AnalyzeHealthcareEntities(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, AnalyzeHealthcareEntitiesOptions options, CancellationToken cancellationToken = default) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateHealthcareTask(options) } ) { DisplayName = options.DisplayName, }; var response = _languageRestClient.AnalyzeBatchSubmitJob(input, cancellationToken); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new AnalyzeHealthcareEntitiesOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { operation.WaitForCompletion(cancellationToken); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } private async Task<AnalyzeHealthcareEntitiesOperation> AnalyzeHealthcareEntitiesAsync(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, AnalyzeHealthcareEntitiesOptions options, CancellationToken cancellationToken = default) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateHealthcareTask(options) }) { DisplayName = options.DisplayName, }; var response = await _languageRestClient.AnalyzeBatchSubmitJobAsync(input, cancellationToken).ConfigureAwait(false); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new AnalyzeHealthcareEntitiesOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { await operation.WaitForCompletionAsync(cancellationToken).ConfigureAwait(false); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<HealthcareJobStatusResult>> HealthStatusAsync(string jobId, bool? showStats, int? top, int? skip, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(HealthStatusAsync)}"); scope.Start(); try { var result = await _languageRestClient.AnalyzeBatchJobStatusAsync(id, showStats, top, skip, cancellationToken).ConfigureAwait(false); var status = Transforms.ConvertToHealthcareJobStatusResult(result.Value, idToIndexMap); return Response.FromValue(status, result.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<HealthcareJobStatusResult> HealthStatus(string jobId, bool? showStats, int? top, int? skip, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(HealthStatusAsync)}"); scope.Start(); try { var result = _languageRestClient.AnalyzeBatchJobStatus(id, showStats, top, skip, cancellationToken); var status = Transforms.ConvertToHealthcareJobStatusResult(result.Value, idToIndexMap); return Response.FromValue(status, result.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<HealthcareJobStatusResult>> HealthStatusNextPageAsync(string nextLink, int? pageSizeHint, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(nextLink, nameof(nextLink)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeStatusNextPage)}"); scope.Start(); try { var result = await _languageRestClient.AnalyzeBatchNextPageAsync(nextLink, cancellationToken).ConfigureAwait(false); var status = Transforms.ConvertToHealthcareJobStatusResult(result.Value, idToIndexMap); return Response.FromValue(status, result.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<HealthcareJobStatusResult> HealthStatusNextPage(string nextLink, int? pageSizeHint, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(nextLink, nameof(nextLink)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeStatusNextPage)}"); scope.Start(); try { var result = _languageRestClient.AnalyzeBatchNextPage(nextLink, cancellationToken); var status = Transforms.ConvertToHealthcareJobStatusResult(result.Value, idToIndexMap); return Response.FromValue(status, result.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task CancelHealthcareJobAsync(string jobId, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(CancelHealthcareJobAsync)}"); scope.Start(); try { await _languageRestClient.AnalyzeBatchCancelJobAsync(id, cancellationToken).ConfigureAwait(false); } catch (Exception e) { scope.Failed(e); throw; } } public override void CancelHealthcareJob(string jobId, CancellationToken cancellationToken = default) { { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(CancelHealthcareJob)}"); scope.Start(); try { _languageRestClient.AnalyzeBatchCancelJob(id, cancellationToken); } catch (Exception e) { scope.Failed(e); throw; } } } #endregion #region Analyze Operation public override AnalyzeActionsOperation AnalyzeActions(WaitUntil waitUntil, IEnumerable<string> documents, TextAnalyticsActions actions, string language = default, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeActions)}"; return AnalyzeActions(scopeName, waitUntil, documentInputs, actions, options, cancellationToken); } public override AnalyzeActionsOperation AnalyzeActions(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, TextAnalyticsActions actions, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeActions)}"; return AnalyzeActions(scopeName, waitUntil, documentInputs, actions, options, cancellationToken); } public override async Task<AnalyzeActionsOperation> AnalyzeActionsAsync(WaitUntil waitUntil, IEnumerable<string> documents, TextAnalyticsActions actions, string language = default, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeActions)}"; return await AnalyzeActionsAsync(scopeName, waitUntil, documentInputs, actions, options, cancellationToken).ConfigureAwait(false); } public override async Task<AnalyzeActionsOperation> AnalyzeActionsAsync(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, TextAnalyticsActions actions, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeActions)}"; return await AnalyzeActionsAsync(scopeName, waitUntil, documentInputs, actions, options, cancellationToken).ConfigureAwait(false); } public override async Task<AnalyzeActionsOperation> StartAnalyzeActionsAsync(IEnumerable<string> documents, TextAnalyticsActions actions, string language = default, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeActions)}"; return await AnalyzeActionsAsync(scopeName, WaitUntil.Started, documentInputs, actions, options, cancellationToken).ConfigureAwait(false); } public override AnalyzeActionsOperation StartAnalyzeActions(IEnumerable<string> documents, TextAnalyticsActions actions, string language = default, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeActions)}"; return AnalyzeActions(scopeName, WaitUntil.Started, documentInputs, actions, options, cancellationToken); } public override AnalyzeActionsOperation StartAnalyzeActions(IEnumerable<TextDocumentInput> documents, TextAnalyticsActions actions, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeActions)}"; return AnalyzeActions(scopeName, WaitUntil.Started, documentInputs, actions, options, cancellationToken); } public override async Task<AnalyzeActionsOperation> StartAnalyzeActionsAsync(IEnumerable<TextDocumentInput> documents, TextAnalyticsActions actions, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); Argument.AssertNotNull(actions, nameof(actions)); MultiLanguageAnalysisInput documentInputs = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartAnalyzeActions)}"; return await AnalyzeActionsAsync(scopeName, WaitUntil.Started, documentInputs, actions, options, cancellationToken).ConfigureAwait(false); } public override async Task<Response<AnalyzeTextJobStatusResult>> AnalyzeStatusAsync(string jobId, bool? showStats, int? top, int? skip, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); // Issue https://github.com/Azure/azure-sdk-for-net/issues/28355 if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeStatus)}"); scope.Start(); try { var response = await _languageRestClient.AnalyzeBatchJobStatusAsync(id, showStats, top, skip, cancellationToken).ConfigureAwait(false); var result = Transforms.ConvertToAnalyzeTextJobStatusResult(response.Value, idToIndexMap); return Response.FromValue(result, response.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<AnalyzeTextJobStatusResult> AnalyzeStatus(string jobId, bool? showStats, int? top, int? skip, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeStatus)}"); scope.Start(); try { var response = _languageRestClient.AnalyzeBatchJobStatus(id, showStats, top, skip, cancellationToken); var result = Transforms.ConvertToAnalyzeTextJobStatusResult(response.Value, idToIndexMap); return Response.FromValue(result, response.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<AnalyzeTextJobStatusResult>> AnalyzeStatusNextPageAsync(string nextLink, int? pageSizeHint, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(nextLink, nameof(nextLink)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeStatusNextPage)}"); scope.Start(); try { var response = await _languageRestClient.AnalyzeBatchNextPageAsync(nextLink, cancellationToken).ConfigureAwait(false); var result = Transforms.ConvertToAnalyzeTextJobStatusResult(response.Value, idToIndexMap); return Response.FromValue(result, response.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<AnalyzeTextJobStatusResult> AnalyzeStatusNextPage(string nextLink, int? pageSizeHint, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(nextLink, nameof(nextLink)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeStatusNextPage)}"); scope.Start(); try { var response = _languageRestClient.AnalyzeBatchNextPage(nextLink, cancellationToken); var result = Transforms.ConvertToAnalyzeTextJobStatusResult(response.Value, idToIndexMap); return Response.FromValue(result, response.GetRawResponse()); } catch (Exception e) { scope.Failed(e); throw; } } private AnalyzeActionsOperation AnalyzeActions(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsActions actions, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, CreateTasks(actions)) { DisplayName = actions.DisplayName, }; var response = _languageRestClient.AnalyzeBatchSubmitJob(input, cancellationToken); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new AnalyzeActionsOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { operation.WaitForCompletion(cancellationToken); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } private async Task<AnalyzeActionsOperation> AnalyzeActionsAsync(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, TextAnalyticsActions actions, AnalyzeActionsOptions options = default, CancellationToken cancellationToken = default) { options ??= new(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, CreateTasks(actions)) { DisplayName = actions.DisplayName, }; var response = await _languageRestClient.AnalyzeBatchSubmitJobAsync(input, cancellationToken).ConfigureAwait(false); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new AnalyzeActionsOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { await operation.WaitForCompletionAsync(cancellationToken).ConfigureAwait(false); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } public override async Task CancelAnalyzeActionsJobAsync(string jobId, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(CancelAnalyzeActionsJob)}"); scope.Start(); try { await _languageRestClient.AnalyzeBatchCancelJobAsync(id, cancellationToken).ConfigureAwait(false); } catch (Exception e) { scope.Failed(e); throw; } } public override void CancelAnalyzeActionsJob(string jobId, CancellationToken cancellationToken = default) { { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(CancelAnalyzeActionsJob)}"); scope.Start(); try { _languageRestClient.AnalyzeBatchCancelJob(id, cancellationToken); } catch (Exception e) { scope.Failed(e); throw; } } } private IList<AnalyzeTextLROTask> CreateTasks(TextAnalyticsActions actions) { List<AnalyzeTextLROTask> analyzeTasks = new(); if (actions.RecognizePiiEntitiesActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromRecognizePiiEntitiesActionsToTasks(actions.RecognizePiiEntitiesActions)); } if (actions.RecognizeEntitiesActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromRecognizeEntitiesActionsToTasks(actions.RecognizeEntitiesActions)); } if (actions.RecognizeCustomEntitiesActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromRecognizeCustomEntitiesActionsToTasks(actions.RecognizeCustomEntitiesActions)); } if (actions.ExtractKeyPhrasesActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromExtractKeyPhrasesActionsToTasks(actions.ExtractKeyPhrasesActions)); } if (actions.RecognizeLinkedEntitiesActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromRecognizeLinkedEntitiesActionsToTasks(actions.RecognizeLinkedEntitiesActions)); } if (actions.AnalyzeSentimentActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromAnalyzeSentimentActionsToTasks(actions.AnalyzeSentimentActions)); } if (actions.SingleLabelClassifyActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromSingleLabelClassifyActionsToTasks(actions.SingleLabelClassifyActions)); } if (actions.MultiLabelClassifyActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromMultiLabelClassifyActionsToTasks(actions.MultiLabelClassifyActions)); } if (actions.AnalyzeHealthcareEntitiesActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromAnalyzeHealthcareEntitiesActionsToTasks(actions.AnalyzeHealthcareEntitiesActions)); } if (actions.ExtractiveSummarizeActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromExtractiveSummarizeActionsToTasks(actions.ExtractiveSummarizeActions)); } if (actions.AbstractiveSummarizeActions != null) { analyzeTasks.AddRange(Transforms.ConvertFromAbstractiveSummarizeActionsToTasks(actions.AbstractiveSummarizeActions)); } // Validate supported version. if (actions.ExtractiveSummarizeActions != null && actions.ExtractiveSummarizeActions.Count > 0) { Validation.SupportsOperation(nameof(ExtractiveSummarizeAction), TextAnalyticsClientOptions.ServiceVersion.V2023_04_01, ServiceVersion); } if (actions.AbstractiveSummarizeActions != null && actions.AbstractiveSummarizeActions.Count > 0) { Validation.SupportsOperation(nameof(AbstractiveSummarizeAction), TextAnalyticsClientOptions.ServiceVersion.V2023_04_01, ServiceVersion); } return analyzeTasks; } #endregion #region Single Label Classify public override ClassifyDocumentOperation SingleLabelClassify(WaitUntil waitUntil, IEnumerable<string> documents, string projectName, string deploymentName, string language = default, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(SingleLabelClassify)}"; return SingleLabelClassify(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken); } public override ClassifyDocumentOperation SingleLabelClassify(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(SingleLabelClassify)}"; return SingleLabelClassify(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken); } public override async Task<ClassifyDocumentOperation> SingleLabelClassifyAsync(WaitUntil waitUntil, IEnumerable<string> documents, string projectName, string deploymentName, string language = default, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(SingleLabelClassify)}"; return await SingleLabelClassifyAsync(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override async Task<ClassifyDocumentOperation> SingleLabelClassifyAsync(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(SingleLabelClassify)}"; return await SingleLabelClassifyAsync(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override ClassifyDocumentOperation StartSingleLabelClassify(IEnumerable<string> documents, string projectName, string deploymentName, string language = default, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartSingleLabelClassify)}"; return SingleLabelClassify(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken); } public override ClassifyDocumentOperation StartSingleLabelClassify(IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartSingleLabelClassify)}"; return SingleLabelClassify(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken); } public override async Task<ClassifyDocumentOperation> StartSingleLabelClassifyAsync(IEnumerable<string> documents, string projectName, string deploymentName, string language = default, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartSingleLabelClassify)}"; return await SingleLabelClassifyAsync(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override async Task<ClassifyDocumentOperation> StartSingleLabelClassifyAsync(IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, SingleLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartSingleLabelClassify)}"; return await SingleLabelClassifyAsync(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } private static CustomSingleLabelClassificationLROTask CreateCustomSingleLabelClassificationTask(string projectName, string deploymentName, SingleLabelClassifyOptions options) { return new CustomSingleLabelClassificationLROTask() { Parameters = new CustomSingleLabelClassificationTaskParameters(projectName, deploymentName) { LoggingOptOut = options.DisableServiceLogs, } }; } private ClassifyDocumentOperation SingleLabelClassify(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, string projectName, string deploymentName, SingleLabelClassifyOptions options, CancellationToken cancellationToken) { options ??= new SingleLabelClassifyOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateCustomSingleLabelClassificationTask(projectName, deploymentName, options) }) { DisplayName = options.DisplayName, }; var response = _languageRestClient.AnalyzeBatchSubmitJob(input, cancellationToken); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new ClassifyDocumentOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { operation.WaitForCompletion(cancellationToken); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } private async Task<ClassifyDocumentOperation> SingleLabelClassifyAsync(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, string projectName, string deploymentName, SingleLabelClassifyOptions options, CancellationToken cancellationToken) { options ??= new SingleLabelClassifyOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateCustomSingleLabelClassificationTask(projectName, deploymentName, options) }) { DisplayName = options.DisplayName, }; var response = await _languageRestClient.AnalyzeBatchSubmitJobAsync(input, cancellationToken).ConfigureAwait(false); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new ClassifyDocumentOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { await operation.WaitForCompletionAsync(cancellationToken).ConfigureAwait(false); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Multi Label Classify public override ClassifyDocumentOperation MultiLabelClassify(WaitUntil waitUntil, IEnumerable<string> documents, string projectName, string deploymentName, string language = default, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(MultiLabelClassify)}"; return MultiLabelClassify(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken); } public override ClassifyDocumentOperation MultiLabelClassify(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(MultiLabelClassify)}"; return MultiLabelClassify(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken); } public override async Task<ClassifyDocumentOperation> MultiLabelClassifyAsync(WaitUntil waitUntil, IEnumerable<string> documents, string projectName, string deploymentName, string language = default, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(MultiLabelClassify)}"; return await MultiLabelClassifyAsync(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override async Task<ClassifyDocumentOperation> MultiLabelClassifyAsync(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(MultiLabelClassify)}"; return await MultiLabelClassifyAsync(scopeName, waitUntil, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override ClassifyDocumentOperation StartMultiLabelClassify(IEnumerable<string> documents, string projectName, string deploymentName, string language = default, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartMultiLabelClassify)}"; return MultiLabelClassify(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken); } public override ClassifyDocumentOperation StartMultiLabelClassify(IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartMultiLabelClassify)}"; return MultiLabelClassify(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken); } public override async Task<ClassifyDocumentOperation> StartMultiLabelClassifyAsync(IEnumerable<string> documents, string projectName, string deploymentName, string language = default, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartMultiLabelClassify)}"; return await MultiLabelClassifyAsync(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } public override async Task<ClassifyDocumentOperation> StartMultiLabelClassifyAsync(IEnumerable<TextDocumentInput> documents, string projectName, string deploymentName, MultiLabelClassifyOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); string scopeName = $"{nameof(TextAnalyticsClient)}.{nameof(StartMultiLabelClassify)}"; return await MultiLabelClassifyAsync(scopeName, WaitUntil.Started, input, projectName, deploymentName, options, cancellationToken).ConfigureAwait(false); } private static CustomMultiLabelClassificationLROTask CreateCustomMultiLabelClassificationTask(string projectName, string deploymentName, MultiLabelClassifyOptions options) { return new CustomMultiLabelClassificationLROTask() { Parameters = new CustomMultiLabelClassificationTaskParameters(projectName, deploymentName) { LoggingOptOut = options.DisableServiceLogs, } }; } private ClassifyDocumentOperation MultiLabelClassify(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, string projectName, string deploymentName, MultiLabelClassifyOptions options, CancellationToken cancellationToken) { options ??= new MultiLabelClassifyOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateCustomMultiLabelClassificationTask(projectName, deploymentName, options) }) { DisplayName = options.DisplayName, }; var response = _languageRestClient.AnalyzeBatchSubmitJob(input, cancellationToken); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new ClassifyDocumentOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { operation.WaitForCompletion(cancellationToken); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } private async Task<ClassifyDocumentOperation> MultiLabelClassifyAsync(string scopeName, WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, string projectName, string deploymentName, MultiLabelClassifyOptions options, CancellationToken cancellationToken) { options ??= new MultiLabelClassifyOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope(scopeName); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateCustomMultiLabelClassificationTask(projectName, deploymentName, options) }) { DisplayName = options.DisplayName, }; var response = await _languageRestClient.AnalyzeBatchSubmitJobAsync(input, cancellationToken).ConfigureAwait(false); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new ClassifyDocumentOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { await operation.WaitForCompletionAsync(cancellationToken).ConfigureAwait(false); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Extractive Summarize public override ExtractiveSummarizeOperation ExtractiveSummarize(WaitUntil waitUntil, IEnumerable<string> documents, string language = default, ExtractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return ExtractiveSummarize(waitUntil, input, options, cancellationToken); } public override ExtractiveSummarizeOperation ExtractiveSummarize(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, ExtractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return ExtractiveSummarize(waitUntil, input, options, cancellationToken); } public override async Task<ExtractiveSummarizeOperation> ExtractiveSummarizeAsync(WaitUntil waitUntil, IEnumerable<string> documents, string language = default, ExtractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return await ExtractiveSummarizeAsync(waitUntil, input, options, cancellationToken).ConfigureAwait(false); } public override async Task<ExtractiveSummarizeOperation> ExtractiveSummarizeAsync(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, ExtractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return await ExtractiveSummarizeAsync(waitUntil, input, options, cancellationToken).ConfigureAwait(false); } private static ExtractiveSummarizationLROTask CreateExtractiveSummarizationTask(ExtractiveSummarizeOptions options) { return new ExtractiveSummarizationLROTask() { Parameters = new ExtractiveSummarizationTaskParameters() { ModelVersion = options.ModelVersion, StringIndexType = Constants.DefaultStringIndexType, LoggingOptOut = options.DisableServiceLogs, SentenceCount = options.MaxSentenceCount, SortBy = options.OrderBy, } }; } private ExtractiveSummarizeOperation ExtractiveSummarize(WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, ExtractiveSummarizeOptions options, CancellationToken cancellationToken) { options ??= new ExtractiveSummarizeOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(ExtractiveSummarize)}"); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateExtractiveSummarizationTask(options) }) { DisplayName = options.DisplayName, }; var response = _languageRestClient.AnalyzeBatchSubmitJob(input, cancellationToken); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new ExtractiveSummarizeOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { operation.WaitForCompletion(cancellationToken); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } private async Task<ExtractiveSummarizeOperation> ExtractiveSummarizeAsync(WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, ExtractiveSummarizeOptions options, CancellationToken cancellationToken) { options ??= new ExtractiveSummarizeOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(ExtractiveSummarize)}"); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateExtractiveSummarizationTask(options) }) { DisplayName = options.DisplayName, }; var response = await _languageRestClient.AnalyzeBatchSubmitJobAsync(input, cancellationToken).ConfigureAwait(false); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new ExtractiveSummarizeOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { await operation.WaitForCompletionAsync(cancellationToken).ConfigureAwait(false); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Abstractive Summarize public override AbstractiveSummarizeOperation AbstractiveSummarize(WaitUntil waitUntil, IEnumerable<string> documents, string language = default, AbstractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return AbstractiveSummarize(waitUntil, input, options, cancellationToken); } public override AbstractiveSummarizeOperation AbstractiveSummarize(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, AbstractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return AbstractiveSummarize(waitUntil, input, options, cancellationToken); } public override async Task<AbstractiveSummarizeOperation> AbstractiveSummarizeAsync(WaitUntil waitUntil, IEnumerable<string> documents, string language = default, AbstractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents, language); return await AbstractiveSummarizeAsync(waitUntil, input, options, cancellationToken).ConfigureAwait(false); } public override async Task<AbstractiveSummarizeOperation> AbstractiveSummarizeAsync(WaitUntil waitUntil, IEnumerable<TextDocumentInput> documents, AbstractiveSummarizeOptions options = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(documents, nameof(documents)); MultiLanguageAnalysisInput input = ConvertToMultiLanguageInputs(documents); return await AbstractiveSummarizeAsync(waitUntil, input, options, cancellationToken).ConfigureAwait(false); } private static AbstractiveSummarizationLROTask CreateAbstractiveSummarizationTask(AbstractiveSummarizeOptions options) { AbstractiveSummarizationTaskParameters parameters = new() { ModelVersion = options.ModelVersion, StringIndexType = Constants.DefaultStringIndexType, LoggingOptOut = options.DisableServiceLogs, SentenceCount = options.SentenceCount, }; return new AbstractiveSummarizationLROTask(parameters); } private AbstractiveSummarizeOperation AbstractiveSummarize(WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, AbstractiveSummarizeOptions options, CancellationToken cancellationToken) { options ??= new AbstractiveSummarizeOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AbstractiveSummarize)}"); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateAbstractiveSummarizationTask(options) }) { DisplayName = options.DisplayName, }; var response = _languageRestClient.AnalyzeBatchSubmitJob(input, cancellationToken); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new AbstractiveSummarizeOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { operation.WaitForCompletion(cancellationToken); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } private async Task<AbstractiveSummarizeOperation> AbstractiveSummarizeAsync(WaitUntil waitUntil, MultiLanguageAnalysisInput multiLanguageInput, AbstractiveSummarizeOptions options, CancellationToken cancellationToken) { options ??= new AbstractiveSummarizeOptions(); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AbstractiveSummarize)}"); scope.Start(); try { AnalyzeTextJobsInput input = new(multiLanguageInput, new List<AnalyzeTextLROTask>() { CreateAbstractiveSummarizationTask(options) }) { DisplayName = options.DisplayName, }; var response = await _languageRestClient.AnalyzeBatchSubmitJobAsync(input, cancellationToken).ConfigureAwait(false); string location = response.Headers.OperationLocation; IDictionary<string, int> idToIndexMap = CreateIdToIndexMap(multiLanguageInput.Documents); var operation = new AbstractiveSummarizeOperation(this, _clientDiagnostics, location, idToIndexMap, options.IncludeStatistics); if (waitUntil == WaitUntil.Completed) { await operation.WaitForCompletionAsync(cancellationToken).ConfigureAwait(false); } return operation; } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Long Running Operations public override async Task<Response<AnalyzeTextJobState>> AnalyzeTextJobStatusAsync(string jobId, bool? showStats, int? top, int? skip, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); // Issue https://github.com/Azure/azure-sdk-for-net/issues/28355 if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeTextJobStatus)}"); scope.Start(); try { return await _languageRestClient.AnalyzeBatchJobStatusAsync(id, showStats, top, skip, cancellationToken).ConfigureAwait(false); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<AnalyzeTextJobState> AnalyzeTextJobStatus(string jobId, bool? showStats, int? top, int? skip, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(jobId, nameof(jobId)); if (!Guid.TryParse(jobId, out var id)) { throw new FormatException($"{nameof(jobId)} is not a valid GUID."); } using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeTextJobStatus)}"); scope.Start(); try { return _languageRestClient.AnalyzeBatchJobStatus(id, showStats, top, skip, cancellationToken); } catch (Exception e) { scope.Failed(e); throw; } } public override async Task<Response<AnalyzeTextJobState>> AnalyzeTextJobStatusNextPageAsync(string nextLink, int? pageSizeHint, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(nextLink, nameof(nextLink)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeTextJobStatusNextPage)}"); scope.Start(); try { return await _languageRestClient.AnalyzeBatchNextPageAsync(nextLink, cancellationToken).ConfigureAwait(false); } catch (Exception e) { scope.Failed(e); throw; } } public override Response<AnalyzeTextJobState> AnalyzeTextJobStatusNextPage(string nextLink, int? pageSizeHint, IDictionary<string, int> idToIndexMap, CancellationToken cancellationToken = default) { Argument.AssertNotNull(nextLink, nameof(nextLink)); using DiagnosticScope scope = _clientDiagnostics.CreateScope($"{nameof(TextAnalyticsClient)}.{nameof(AnalyzeTextJobStatusNextPage)}"); scope.Start(); try { return _languageRestClient.AnalyzeBatchNextPage(nextLink, cancellationToken); } catch (Exception e) { scope.Failed(e); throw; } } #endregion #region Common private static IDictionary<string, int> CreateIdToIndexMap<T>(IEnumerable<T> documents) { var map = new Dictionary<string, int>(documents.Count()); int i = 0; foreach (T item in documents) { string id = item switch { LanguageInput li => li.Id, MultiLanguageInput mli => mli.Id, _ => throw new NotSupportedException(), }; map[id] = i++; } return map; } private MultiLanguageInput ConvertToMultiLanguageInput(string document, string language, int id = 0) => new MultiLanguageInput(id.ToString(CultureInfo.InvariantCulture), document) { Language = language ?? Options.DefaultLanguage }; private MultiLanguageAnalysisInput ConvertToMultiLanguageInputs(IEnumerable<string> documents, string language) { MultiLanguageAnalysisInput input = new MultiLanguageAnalysisInput(); int i = 0; foreach (var document in documents) { input.Documents.Add(ConvertToMultiLanguageInput(document, language, i++)); } return input; } private MultiLanguageAnalysisInput ConvertToMultiLanguageInputs(IEnumerable<TextDocumentInput> documents) { MultiLanguageAnalysisInput input = new MultiLanguageAnalysisInput(); foreach (var document in documents) { input.Documents.Add(new MultiLanguageInput(document.Id, document.Text) { Language = document.Language ?? Options.DefaultLanguage }); } return input; } private LanguageInput ConvertToLanguageInput(string document, string countryHint, int id = 0) => new LanguageInput($"{id}", document) { CountryHint = countryHint ?? Options.DefaultCountryHint }; #endregion } }