Files
ApexSurgery/Assets/Oculus/Voice/Lib/Wit.ai/Scripts/Runtime/WitRequestFactory.cs
T
2025-07-04 20:33:06 +03:00

174 lines
6.7 KiB
C#

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the license found in the
* LICENSE file in the root directory of this source tree.
*/
using System.Text;
using System.Collections.Generic;
using System.Web;
using Meta.Voice;
using Meta.WitAi.Configuration;
using Meta.WitAi.Data.Configuration;
using Meta.WitAi.Data.Entities;
using Meta.WitAi.Interfaces;
using Meta.WitAi.Json;
using Meta.WitAi.Requests;
namespace Meta.WitAi
{
public static class WitRequestFactory
{
private static VoiceServiceRequestOptions.QueryParam QueryParam(string key, string value)
{
return new VoiceServiceRequestOptions.QueryParam() { key = key, value = value };
}
private static void HandleWitRequestOptions(WitRequestOptions requestOptions,
IDynamicEntitiesProvider[] additionalEntityProviders)
{
WitResponseClass entities = new WitResponseClass();
bool hasEntities = false;
if (null != additionalEntityProviders)
{
foreach (var provider in additionalEntityProviders)
{
foreach (var providerEntity in provider.GetDynamicEntities())
{
hasEntities = true;
MergeEntities(entities, providerEntity);
}
}
}
if (DynamicEntityKeywordRegistry.HasDynamicEntityRegistry)
{
foreach (var providerEntity in DynamicEntityKeywordRegistry.Instance.GetDynamicEntities())
{
hasEntities = true;
MergeEntities(entities, providerEntity);
}
}
if (null != requestOptions)
{
if (!string.IsNullOrEmpty(requestOptions.tag))
{
requestOptions.QueryParams["tag"] = requestOptions.tag;
}
if (null != requestOptions.dynamicEntities)
{
foreach (var entity in requestOptions.dynamicEntities.GetDynamicEntities())
{
hasEntities = true;
MergeEntities(entities, entity);
}
}
}
if (hasEntities)
{
requestOptions.QueryParams["entities"] = entities.ToString();
}
}
private static void MergeEntities(WitResponseClass entities, WitDynamicEntity providerEntity)
{
if (!entities.HasChild(providerEntity.entity))
{
entities[providerEntity.entity] = new WitResponseArray();
}
var mergedArray = entities[providerEntity.entity];
Dictionary<string, WitResponseClass> map = new Dictionary<string, WitResponseClass>();
HashSet<string> synonyms = new HashSet<string>();
var existingKeywords = mergedArray.AsArray;
for (int i = 0; i < existingKeywords.Count; i++)
{
var keyword = existingKeywords[i].AsObject;
var key = keyword["keyword"].Value;
if(!map.ContainsKey(key))
{
map[key] = keyword;
}
}
foreach (var keyword in providerEntity.keywords)
{
if (map.TryGetValue(keyword.keyword, out var keywordObject))
{
foreach (var synonym in keyword.synonyms)
{
keywordObject["synonyms"].Add(synonym);
}
}
else
{
keywordObject = JsonConvert.SerializeToken(keyword).AsObject;
map[keyword.keyword] = keywordObject;
mergedArray.Add(keywordObject);
}
}
}
private static WitRequestOptions GetSetupOptions(WitRequestOptions newOptions,
IDynamicEntitiesProvider[] additionalDynamicEntities)
{
// Generate options exist
WitRequestOptions options = newOptions ?? new WitRequestOptions();
// Set intents
if (-1 != options.nBestIntents)
{
options.QueryParams["n"] = options.nBestIntents.ToString();
}
// Set dynamic entities
HandleWitRequestOptions(options, additionalDynamicEntities);
// Set tag
if (!string.IsNullOrEmpty(options.tag))
{
options.QueryParams["tag"] = options.tag;
}
return options;
}
/// <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 VoiceServiceRequest CreateMessageRequest(this WitConfiguration config, WitRequestOptions requestOptions, VoiceServiceRequestEvents requestEvents, IDynamicEntitiesProvider[] additionalEntityProviders = null)
{
var options = GetSetupOptions(requestOptions, additionalEntityProviders);
return new WitUnityRequest(config, NLPRequestInputType.Text, options, requestEvents);
}
/// <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 CreateSpeechRequest(this WitConfiguration config, WitRequestOptions requestOptions, VoiceServiceRequestEvents requestEvents, IDynamicEntitiesProvider[] additionalEntityProviders = null)
{
var options = GetSetupOptions(requestOptions, additionalEntityProviders);
var path = config.GetEndpointInfo().Speech;
return new WitRequest(config, path, options, requestEvents);
}
/// <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 CreateDictationRequest(this WitConfiguration config, WitRequestOptions requestOptions, VoiceServiceRequestEvents requestEvents = null)
{
var options = GetSetupOptions(requestOptions, null);
var path = config.GetEndpointInfo().Dictation;
return new WitRequest(config, path, options, requestEvents);
}
}
}