/*
* 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;
using Meta.Conduit;
using Meta.WitAi.Json;
using Meta.WitAi.Data.Intents;
using UnityEngine;
using UnityEngine.Serialization;
namespace Meta.WitAi.CallbackHandlers
{
// Abstract class to share confidence handling
public abstract class WitIntentMatcher : WitResponseHandler
{
///
/// Intent name to be matched
///
[Header("Intent Settings")]
[SerializeField] public string intent;
///
/// Confidence threshold
///
[FormerlySerializedAs("confidence")]
[Range(0, 1f), SerializeField] public float confidenceThreshold = .6f;
// Handle simple intent validation
protected override string OnValidateResponse(WitResponseNode response, bool isEarlyResponse)
{
// No response
if (response == null)
{
return "No response";
}
// Check against all intents
WitIntentData[] intents = response.GetIntents();
if (intents == null || intents.Length == 0)
{
return "No intents found";
}
// Find intent
WitIntentData found = null;
foreach (var intentData in intents)
{
if (string.Equals(intent, intentData.name, StringComparison.CurrentCultureIgnoreCase))
{
found = intentData;
break;
}
}
if (found == null)
{
return $"Missing required intent '{intent}'";
}
// Check confidence
if (found.confidence < confidenceThreshold)
{
return $"Required intent '{intent}' confidence too low: {found.confidence:0.000}\nRequired: {confidenceThreshold:0.000}";
}
return string.Empty;
}
protected override void OnEnable()
{
Manifest.WitResponseMatcherIntents.Add(intent);
base.OnEnable();
}
protected override void OnDisable()
{
Manifest.WitResponseMatcherIntents.Remove(intent);
base.OnDisable();
}
}
}