Exemplo n.º 1
0
        /// <summary>
        /// Sends a <see cref="DF2QueryInput"/> object as a HTTP request to the remote
        /// chatbot.
        /// </summary>
        /// <param name="queryInput">The input request.</param>
        /// <param name="session">The session ID, i.e., the ID of the user who talks to the chatbot.</param>
        private IEnumerator DetectIntent(DF2QueryInput queryInput, string session)
        {
            // Gets the JWT access token.
            string accessToken = string.Empty;

            while (!JwtCache.TryGetToken(accessSettings.ServiceAccount, out accessToken))
            {
                yield return(JwtCache.GetToken(accessSettings.CredentialsFileName,
                                               accessSettings.ServiceAccount));
            }

            // Prepares the HTTP request.
            var settings = new JsonSerializerSettings();

            settings.NullValueHandling = NullValueHandling.Ignore;
            settings.ContractResolver  = new CamelCasePropertyNamesContractResolver();
            DF2Request request = new DF2Request(session, queryInput);

            // Adds the input contexts and the entities.
            request.QueryParams          = new DF2QueryParams();
            request.QueryParams.Contexts = inputContexts.ToArray();
            inputContexts.Clear();
            request.QueryParams.SessionEntityTypes = inputEntities.ToArray();
            inputEntities.Clear();

            string jsonInput = JsonConvert.SerializeObject(request, settings);

            byte[] body = Encoding.UTF8.GetBytes(jsonInput);

            string          url        = string.Format(PARAMETRIC_DETECT_INTENT_URL, accessSettings.ProjectId, session);
            UnityWebRequest df2Request = new UnityWebRequest(url, "POST");

            df2Request.SetRequestHeader("Authorization", "Bearer " + accessToken);
            df2Request.SetRequestHeader("Content-Type", "application/json");
            df2Request.uploadHandler   = new UploadHandlerRaw(body);
            df2Request.downloadHandler = new DownloadHandlerBuffer();

            yield return(df2Request.SendWebRequest());

            // Processes response.
            if (df2Request.isNetworkError || df2Request.isHttpError)
            {
                DetectIntentError?.Invoke(JsonConvert.DeserializeObject <DF2ErrorResponse>(df2Request.downloadHandler.text));
            }
            else
            {
                string      response = Encoding.UTF8.GetString(df2Request.downloadHandler.data);
                DF2Response resp     = JsonConvert.DeserializeObject <DF2Response>(response);
                ChatbotResponded?.Invoke(resp);
                for (int i = 0; i < resp.queryResult.outputContexts.Length; i++)
                {
                    DF2Context context = resp.queryResult.outputContexts[i];
                    string[]   cName   = context.Name.ToLower().Split('/');
                    if (reactionContexts.ContainsKey(cName[cName.Length - 1]))
                    {
                        reactionContexts[cName[cName.Length - 1]](context);
                    }
                }
            }
        }
Exemplo n.º 2
0
 /// <summary>
 /// Adds an input context to the next request.
 /// </summary>
 /// <param name="inputContext">The input context to add.</param>
 /// <param name="session">The current session ID.</param>
 public void AddInputContext(DF2Context inputContext, string session)
 {
     if (!inputContext.Name.StartsWith("projects"))
     {
         inputContext.Name = string.Format(DF2Context.PARAMETRIC_CONTEXT_ID,
                                           accessSettings.ProjectId, session, inputContext.Name);
     }
     inputContexts.Add(inputContext);
 }