Refactor scripted response decision helpers

This commit is contained in:
Jacob Dubin
2026-05-21 06:53:02 -05:00
parent e85e14fbd3
commit bba1dfdcfc
2 changed files with 175 additions and 63 deletions

View File

@@ -562,7 +562,7 @@ public sealed class JiboInteractionService(
"robot_what_do_you_eat" => new JiboInteractionDecision(
"robot_what_do_you_eat",
"The only thing I consume is electricity.",
ContextUpdates: BuildScriptedResponseContextUpdates()),
ContextUpdates: ScriptedResponseDecisionBuilder.BuildScriptedResponseContextUpdates()),
"robot_where_do_you_live" => BuildScriptedPersonalityDecision(
catalog,
"robot_where_do_you_live",
@@ -912,7 +912,7 @@ public sealed class JiboInteractionService(
"robot_what_are_you_made_of" => new JiboInteractionDecision(
"robot_what_are_you_made_of",
"Let's see, I'm made of wires, motors, belts, gears, processors, cameras, and one baboon's heart in the middle of my body casing. I'm kidding about the baboon part, but everything else is true.",
ContextUpdates: BuildScriptedResponseContextUpdates()),
ContextUpdates: ScriptedResponseDecisionBuilder.BuildScriptedResponseContextUpdates()),
"good_morning" => BuildReactiveGreetingDecision(turn, "good_morning", referenceLocalTime),
"good_afternoon" => BuildReactiveGreetingDecision(turn, "good_afternoon", referenceLocalTime),
"good_evening" => BuildReactiveGreetingDecision(turn, "good_evening", referenceLocalTime),
@@ -1507,7 +1507,7 @@ public sealed class JiboInteractionService(
return new JiboInteractionDecision(
"current_location",
$"We're at {NormalizeLocationForSpeech(locationName)} if I'm not mistaken.",
ContextUpdates: BuildScriptedResponseContextUpdates());
ContextUpdates: ScriptedResponseDecisionBuilder.BuildScriptedResponseContextUpdates());
}
private async Task<JiboInteractionDecision> BuildWeatherReportDecisionAsync(
@@ -2826,10 +2826,11 @@ public sealed class JiboInteractionService(
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
return ScriptedResponseDecisionBuilder.BuildScriptedPersonalityDecision(
catalog,
randomizer,
intentName,
SelectLegacyPersonalityReply(catalog, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
preferredSnippets);
}
private JiboInteractionDecision BuildScriptedFavoriteAnimalDecision(
@@ -2837,10 +2838,11 @@ public sealed class JiboInteractionService(
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
return ScriptedResponseDecisionBuilder.BuildScriptedFavoriteAnimalDecision(
catalog,
randomizer,
intentName,
SelectLegacyReply(catalog.FavoriteAnimalReplies, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
preferredSnippets);
}
private JiboInteractionDecision BuildScriptedGreetingDecision(
@@ -2848,10 +2850,11 @@ public sealed class JiboInteractionService(
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
return ScriptedResponseDecisionBuilder.BuildScriptedGreetingDecision(
catalog,
randomizer,
intentName,
SelectLegacyGreetingReply(catalog, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
preferredSnippets);
}
private JiboInteractionDecision BuildScriptedHolidayDecision(
@@ -2859,10 +2862,11 @@ public sealed class JiboInteractionService(
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
return ScriptedResponseDecisionBuilder.BuildScriptedHolidayDecision(
replies,
randomizer,
intentName,
SelectLegacyReply(replies, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
preferredSnippets);
}
private JiboInteractionDecision BuildScriptedHolidayTrackerDecision(
@@ -2870,10 +2874,11 @@ public sealed class JiboInteractionService(
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
return ScriptedResponseDecisionBuilder.BuildScriptedHolidayTrackerDecision(
catalog,
randomizer,
intentName,
SelectLegacyReply(catalog.HolidayTrackerReplies, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
preferredSnippets);
}
private JiboInteractionDecision BuildScriptedHolidayGreetingDecision(
@@ -2881,10 +2886,11 @@ public sealed class JiboInteractionService(
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
return ScriptedResponseDecisionBuilder.BuildScriptedHolidayGreetingDecision(
catalog,
randomizer,
intentName,
SelectLegacyReply(catalog.HolidayGreetingReplies, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
preferredSnippets);
}
private JiboInteractionDecision BuildScriptedHolidayTemplateDecision(
@@ -2894,63 +2900,29 @@ public sealed class JiboInteractionService(
string intentName,
params string[] preferredSnippets)
{
var selected = SelectLegacyReply(catalog.HolidayReplies, preferredSnippets);
var selected = ScriptedResponseDecisionBuilder.SelectLegacyReply(
catalog.HolidayReplies,
randomizer,
preferredSnippets);
return new JiboInteractionDecision(
intentName,
RenderHolidayTemplate(selected, turn, presence),
ContextUpdates: BuildScriptedResponseContextUpdates());
}
private static IDictionary<string, object?> BuildScriptedResponseContextUpdates()
{
return new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
{
[ChitchatStateMachine.StateMetadataKey] = "complete",
[ChitchatStateMachine.RouteMetadataKey] = "ScriptedResponse",
[ChitchatStateMachine.EmotionMetadataKey] = string.Empty
};
ContextUpdates: ScriptedResponseDecisionBuilder.BuildScriptedResponseContextUpdates());
}
private string SelectLegacyPersonalityReply(JiboExperienceCatalog catalog, params string[] preferredSnippets)
{
foreach (var snippet in preferredSnippets)
{
if (string.IsNullOrWhiteSpace(snippet)) continue;
var match = catalog.PersonalityReplies.FirstOrDefault(reply =>
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(match)) return match;
}
return catalog.PersonalityReplies.Count == 0 ? string.Empty : randomizer.Choose(catalog.PersonalityReplies);
return ScriptedResponseDecisionBuilder.SelectLegacyPersonalityReply(catalog, randomizer, preferredSnippets);
}
private string SelectLegacyGreetingReply(JiboExperienceCatalog catalog, params string[] preferredSnippets)
{
foreach (var snippet in preferredSnippets)
{
if (string.IsNullOrWhiteSpace(snippet)) continue;
var match = catalog.GreetingReplies.FirstOrDefault(reply =>
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(match)) return match;
}
return catalog.GreetingReplies.Count == 0 ? string.Empty : randomizer.Choose(catalog.GreetingReplies);
return ScriptedResponseDecisionBuilder.SelectLegacyGreetingReply(catalog, randomizer, preferredSnippets);
}
private string SelectLegacyReply(IReadOnlyList<string> replies, params string[] preferredSnippets)
{
foreach (var snippet in preferredSnippets)
{
if (string.IsNullOrWhiteSpace(snippet)) continue;
var match = replies.FirstOrDefault(reply =>
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(match)) return match;
}
return replies.Count == 0 ? string.Empty : randomizer.Choose(replies);
return ScriptedResponseDecisionBuilder.SelectLegacyReply(replies, randomizer, preferredSnippets);
}
private static string ResolveSemanticIntent(

View File

@@ -0,0 +1,140 @@
using Jibo.Cloud.Application.Abstractions;
using Jibo.Runtime.Abstractions;
namespace Jibo.Cloud.Application.Services;
internal static class ScriptedResponseDecisionBuilder
{
internal static JiboInteractionDecision BuildScriptedPersonalityDecision(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
intentName,
SelectLegacyPersonalityReply(catalog, randomizer, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
}
internal static JiboInteractionDecision BuildScriptedFavoriteAnimalDecision(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
intentName,
SelectLegacyReply(catalog.FavoriteAnimalReplies, randomizer, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
}
internal static JiboInteractionDecision BuildScriptedGreetingDecision(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
intentName,
SelectLegacyGreetingReply(catalog, randomizer, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
}
internal static JiboInteractionDecision BuildScriptedHolidayDecision(
IReadOnlyList<string> replies,
IJiboRandomizer randomizer,
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
intentName,
SelectLegacyReply(replies, randomizer, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
}
internal static JiboInteractionDecision BuildScriptedHolidayTrackerDecision(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
intentName,
SelectLegacyReply(catalog.HolidayTrackerReplies, randomizer, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
}
internal static JiboInteractionDecision BuildScriptedHolidayGreetingDecision(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
string intentName,
params string[] preferredSnippets)
{
return new JiboInteractionDecision(
intentName,
SelectLegacyReply(catalog.HolidayGreetingReplies, randomizer, preferredSnippets),
ContextUpdates: BuildScriptedResponseContextUpdates());
}
internal static IDictionary<string, object?> BuildScriptedResponseContextUpdates()
{
return new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
{
[ChitchatStateMachine.StateMetadataKey] = "complete",
[ChitchatStateMachine.RouteMetadataKey] = "ScriptedResponse",
[ChitchatStateMachine.EmotionMetadataKey] = string.Empty
};
}
internal static string SelectLegacyPersonalityReply(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
params string[] preferredSnippets)
{
foreach (var snippet in preferredSnippets)
{
if (string.IsNullOrWhiteSpace(snippet)) continue;
var match = catalog.PersonalityReplies.FirstOrDefault(reply =>
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(match)) return match;
}
return catalog.PersonalityReplies.Count == 0 ? string.Empty : randomizer.Choose(catalog.PersonalityReplies);
}
internal static string SelectLegacyGreetingReply(
JiboExperienceCatalog catalog,
IJiboRandomizer randomizer,
params string[] preferredSnippets)
{
foreach (var snippet in preferredSnippets)
{
if (string.IsNullOrWhiteSpace(snippet)) continue;
var match = catalog.GreetingReplies.FirstOrDefault(reply =>
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(match)) return match;
}
return catalog.GreetingReplies.Count == 0 ? string.Empty : randomizer.Choose(catalog.GreetingReplies);
}
internal static string SelectLegacyReply(
IReadOnlyList<string> replies,
IJiboRandomizer randomizer,
params string[] preferredSnippets)
{
foreach (var snippet in preferredSnippets)
{
if (string.IsNullOrWhiteSpace(snippet)) continue;
var match = replies.FirstOrDefault(reply =>
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrWhiteSpace(match)) return match;
}
return replies.Count == 0 ? string.Empty : randomizer.Choose(replies);
}
}