/// <summary> /// Creates a message request that will process a query string with NLU /// </summary> /// <param name="config"></param> /// <param name="query">Text string to process with the NLU</param> /// <returns></returns> public static WitRequest MessageRequest(this WitConfiguration config, string query, WitRequestOptions requestOptions, IDynamicEntitiesProvider[] additionalDynamicEntities = null) { List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam> { QueryParam("q", query) }; if (null != requestOptions && -1 != requestOptions.nBestIntents) { queryParams.Add(QueryParam("n", requestOptions.nBestIntents.ToString())); } HandleWitRequestOptions(requestOptions, additionalDynamicEntities, queryParams); if (null != requestOptions && !string.IsNullOrEmpty(requestOptions.tag)) { queryParams.Add(QueryParam("tag", requestOptions.tag)); } var path = WitEndpointConfig.GetEndpointConfig(config).Message; WitRequest request = new WitRequest(config, path, queryParams.ToArray()); if (null != requestOptions) { request.onResponse += requestOptions.onResponse; request.requestId = requestOptions.requestID; } return(request); }
/// <summary> /// Creates a request for getting the transcription from the mic data /// </summary> ///<param name="config"></param> /// <param name="requestOptions"></param> /// <returns>WitRequest</returns> public static WitRequest DictationRequest(this WitConfiguration config, WitRequestOptions requestOptions) { List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam>(); var path = WitEndpointConfig.GetEndpointConfig(config).Dictation; WitRequest request = new WitRequest(config, path, queryParams.ToArray()); if (null != requestOptions) { request.onResponse += requestOptions.onResponse; request.requestId = requestOptions.requestID; } return(request); }
/// <summary> /// Creates a request for nlu processing that includes a data stream for mic data /// </summary> /// <param name="config"></param> /// <returns></returns> public static WitRequest SpeechRequest(this WitConfiguration config, WitRequestOptions requestOptions) { List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam>(); if (null != requestOptions && -1 != requestOptions.nBestIntents) { queryParams.Add(QueryParam("n", requestOptions.nBestIntents.ToString())); } if (null != requestOptions?.dynamicEntities) { queryParams.Add(QueryParam("entities", requestOptions.dynamicEntities.ToJSON())); } var path = WitEndpointConfig.GetEndpointConfig(config).Speech; return(new WitRequest(config, path, queryParams.ToArray())); }
/// <summary> /// Creates a request for nlu processing that includes a data stream for mic data /// </summary> /// <param name="config"></param> /// <returns></returns> public static WitRequest SpeechRequest(this WitConfiguration config, WitRequestOptions requestOptions, IDynamicEntitiesProvider[] additionalEntityProviders = null) { List <WitRequest.QueryParam> queryParams = new List <WitRequest.QueryParam>(); if (null != requestOptions && -1 != requestOptions.nBestIntents) { queryParams.Add(QueryParam("n", requestOptions.nBestIntents.ToString())); } HandleWitRequestOptions(requestOptions, additionalEntityProviders, queryParams); var path = WitEndpointConfig.GetEndpointConfig(config).Speech; WitRequest request = new WitRequest(config, path, queryParams.ToArray()); if (null != requestOptions) { request.onResponse += requestOptions.onResponse; request.requestId = requestOptions.requestID; } return(request); }
// Get uri private static Uri GetUri(WitConfiguration configuration, string path, Dictionary <string, string> queryParams) { // Uri builder UriBuilder uriBuilder = new UriBuilder(); // Append endpoint data var endpointConfig = WitEndpointConfig.GetEndpointConfig(configuration); uriBuilder.Scheme = endpointConfig.UriScheme; uriBuilder.Host = endpointConfig.Authority; if (endpointConfig.Port > 0) { uriBuilder.Port = endpointConfig.Port; } // Set path uriBuilder.Path = path; // Build query uriBuilder.Query = $"v={endpointConfig.WitApiVersion}"; if (queryParams != null) { foreach (string key in queryParams.Keys) { string val = Uri.EscapeDataString(queryParams[key]); uriBuilder.Query += $"&{key}={val}"; } } // Return custom uri if (OnProvideCustomUri != null) { return(OnProvideCustomUri(uriBuilder)); } // Return uri return(uriBuilder.Uri); }
/// <summary> /// Start the async request for data from the Wit.ai servers /// </summary> public void Request() { responseStarted = false; UriBuilder uriBuilder = new UriBuilder(); var endpointConfig = WitEndpointConfig.GetEndpointConfig(configuration); uriBuilder.Scheme = endpointConfig.UriScheme; uriBuilder.Host = endpointConfig.Authority; var api = endpointConfig.WitApiVersion; if (endpointConfig.Port > 0) { uriBuilder.Port = endpointConfig.Port; } uriBuilder.Query = $"v={api}"; uriBuilder.Path = path; callingStackTrace = Environment.StackTrace; if (queryParams.Any()) { var p = queryParams.Select(par => $"{par.key}={Uri.EscapeDataString(par.value)}"); uriBuilder.Query += "&" + string.Join("&", p); } var uri = null == onCustomizeUri ? uriBuilder.Uri : onCustomizeUri(uriBuilder); StartRequest(uri); }
private bool RequestRequiresBody(string command) { return(command == WitEndpointConfig.GetEndpointConfig(configuration).Speech || command == WitEndpointConfig.GetEndpointConfig(configuration).Dictation); }
private void StartRequest(Uri uri) { if (!configuration && configurationRequired) { statusDescription = "Configuration is not set. Cannot start request."; Debug.LogError(statusDescription); statusCode = ERROR_CODE_NO_CONFIGURATION; SafeInvoke(onResponse); return; } if (!isServerAuthRequired && string.IsNullOrEmpty(configuration.clientAccessToken)) { statusDescription = "Client access token is not defined. Cannot start request."; Debug.LogError(statusDescription); statusCode = ERROR_CODE_NO_CLIENT_TOKEN; SafeInvoke(onResponse); return; } //allow app to intercept request and potentially modify uri or add custom headers //NOTE: the callback depends on knowing the original Uri, before it is modified Dictionary <string, string> customHeaders = null; if (onPreSendRequest != null) { onPreSendRequest(ref uri, out customHeaders); } WrapHttpWebRequest wr = new WrapHttpWebRequest((HttpWebRequest)WebRequest.Create(uri.AbsoluteUri)); //request = (IRequest)(HttpWebRequest) WebRequest.Create(uri); _request = wr; if (isServerAuthRequired) { _request.Headers["Authorization"] = $"Bearer {serverToken}"; } else { _request.Headers["Authorization"] = $"Bearer {configuration.clientAccessToken.Trim()}"; } if (null != postContentType) { _request.Method = "POST"; _request.ContentType = postContentType; _request.ContentLength = postData.Length; } // Configure additional headers if (WitEndpointConfig.GetEndpointConfig(configuration).Speech == command || WitEndpointConfig.GetEndpointConfig(configuration).Dictation == command) { _request.ContentType = audioEncoding.ToString(); _request.Method = "POST"; _request.SendChunked = true; } _request.Headers["X-Wit-Client-Request-Id"] = requestId; requestRequiresBody = RequestRequiresBody(command); var configId = "not-yet-configured"; #if UNITY_EDITOR if (configuration) { if (string.IsNullOrEmpty(configuration.configId)) { configuration.configId = Guid.NewGuid().ToString(); EditorUtility.SetDirty(configuration); } configId = configuration.configId; } #endif _request.UserAgent = GetUserAgent(configuration); requestStartTime = DateTime.UtcNow; isActive = true; statusCode = 0; statusDescription = "Starting request"; _request.Timeout = configuration ? configuration.timeoutMS : 10000; WatchMainThreadCallbacks(); if (null != onProvideCustomHeaders) { foreach (var header in onProvideCustomHeaders()) { _request.Headers[header.Key] = header.Value; } } //apply any modified headers last, as this allows us to overwrite headers if need be if (customHeaders != null) { foreach (var pair in customHeaders) { _request.Headers[pair.Key] = pair.Value; } } if (_request.Method == "POST") { var getRequestTask = _request.BeginGetRequestStream(HandleRequestStream, _request); ThreadPool.RegisterWaitForSingleObject(getRequestTask.AsyncWaitHandle, HandleTimeoutTimer, _request, Timeout, true); } else { StartResponse(); } }
private void StartRequest(Uri uri) { if (!configuration && configurationRequired) { statusDescription = "Configuration is not set. Cannot start request."; Debug.LogError(statusDescription); statusCode = ERROR_CODE_NO_CONFIGURATION; SafeInvoke(onResponse); return; } if (!isServerAuthRequired && string.IsNullOrEmpty(configuration.clientAccessToken)) { statusDescription = "Client access token is not defined. Cannot start request."; Debug.LogError(statusDescription); statusCode = ERROR_CODE_NO_CLIENT_TOKEN; SafeInvoke(onResponse); return; } request = (HttpWebRequest)WebRequest.Create(uri); if (isServerAuthRequired) { request.Headers["Authorization"] = $"Bearer {serverToken}"; } else { request.Headers["Authorization"] = $"Bearer {configuration.clientAccessToken.Trim()}"; } if (null != postContentType) { request.Method = "POST"; request.ContentType = postContentType; request.ContentLength = postData.Length; } // Configure additional headers if (WitEndpointConfig.GetEndpointConfig(configuration).Speech == command) { request.ContentType = audioEncoding.ToString(); request.Method = "POST"; request.SendChunked = true; } var configId = "not-yet-configured"; #if UNITY_EDITOR if (configuration) { if (string.IsNullOrEmpty(configuration.configId)) { configuration.configId = Guid.NewGuid().ToString(); EditorUtility.SetDirty(configuration); } configId = configuration.configId; } #endif request.UserAgent = $"voice-sdk-35.0.0.98.175,wit-unity-{WIT_SDK_VERSION},{operatingSystem},{deviceModel},{configId},{Application.identifier}"; #if UNITY_EDITOR request.UserAgent += ",Editor"; #else request.UserAgent += ",Runtime"; #endif requestStartTime = DateTime.Now; isActive = true; statusCode = 0; statusDescription = "Starting request"; request.Timeout = configuration ? configuration.timeoutMS : 10000; if (null != onProvideCustomHeaders) { foreach (var header in onProvideCustomHeaders()) { request.Headers[header.Key] = header.Value; } } if (request.Method == "POST") { var getRequestTask = request.BeginGetRequestStream(HandleRequestStream, request); ThreadPool.RegisterWaitForSingleObject(getRequestTask.AsyncWaitHandle, HandleTimeoutTimer, request, Timeout, true); } else { StartResponse(); } }