public override async Task ExecuteAsync(WorkloadContext context) { var response = await DefaultHttpClient.PostAsync(url, body, context.CancellationToken).ConfigureAwait(false); await ReadResponseAsync(response, context.CancellationToken).ConfigureAwait(false); }
private async Task <RecognizerResult> RecognizeInternalAsync(ITurnContext turnContext, LuisPredictionOptions predictionOptions, Dictionary <string, string> telemetryProperties, Dictionary <string, double> telemetryMetrics, CancellationToken cancellationToken) { BotAssert.ContextNotNull(turnContext); if (turnContext.Activity.Type != ActivityTypes.Message) { return(null); } var options = predictionOptions ?? _predictionOptions; var utterance = turnContext.Activity?.AsMessageActivity()?.Text; RecognizerResult recognizerResult; JObject luisResponse = null; if (string.IsNullOrWhiteSpace(utterance)) { recognizerResult = new RecognizerResult { Text = utterance, Intents = new Dictionary <string, IntentScore>() { { string.Empty, new IntentScore() { Score = 1.0 } } }, Entities = new JObject(), }; } else { var uri = new UriBuilder(_application.Endpoint); // TODO: When the endpoint GAs, we will need to change this. I could make it an option, but other code is likely to need to change. uri.Path += $"luis/v3.0-preview/apps/{_application.ApplicationId}"; var query = AddParam(null, "verbose", options.IncludeInstanceData); query = AddParam(query, "log", options.Log); query = AddParam(query, "show-all-intents", options.IncludeAllIntents); uri.Query = query; var content = new JObject { { "query", utterance }, }; var queryOptions = new JObject { { "overridePredictions", options.PreferExternalEntities }, }; content.Add("options", queryOptions); var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; if (options.DynamicLists != null) { foreach (var list in options.DynamicLists) { list.Validate(); } content.Add("dynamicLists", (JArray)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(options.DynamicLists, settings))); } if (options.ExternalEntities != null) { foreach (var entity in options.ExternalEntities) { entity.Validate(); } content.Add("externalEntities", (JArray)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(options.ExternalEntities, settings))); } if (options.Version == null) { uri.Path += $"/slots/{options.Slot}/predict"; } else { uri.Path += $"/versions/{options.Version}/predict"; } var response = await DefaultHttpClient.PostAsync(uri.Uri, new StringContent(content.ToString(), System.Text.Encoding.UTF8, "application/json")).ConfigureAwait(false); response.EnsureSuccessStatusCode(); luisResponse = (JObject)JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync().ConfigureAwait(false)); var prediction = (JObject)luisResponse["prediction"]; recognizerResult = new RecognizerResult { Text = utterance, AlteredText = prediction["alteredQuery"]?.Value <string>(), Intents = LuisUtil.GetIntents(prediction), Entities = LuisUtil.ExtractEntitiesAndMetadata(prediction), }; LuisUtil.AddProperties(prediction, recognizerResult); if (options.IncludeAPIResults) { recognizerResult.Properties.Add("luisResult", luisResponse); } } // Log telemetry OnRecognizerResult(recognizerResult, turnContext, telemetryProperties, telemetryMetrics); var traceInfo = JObject.FromObject( new { recognizerResult, luisModel = new { ModelID = _application.ApplicationId, }, luisOptions = options, luisResult = luisResponse, }); await turnContext.TraceActivityAsync("LuisRecognizer", traceInfo, LuisTraceType, LuisTraceLabel, cancellationToken).ConfigureAwait(false); return(recognizerResult); }