Add Build B charm descriptors and mood replies
This commit is contained in:
@@ -844,6 +844,9 @@ Current release theme:
|
|||||||
- Mood follow-up work in flight:
|
- Mood follow-up work in flight:
|
||||||
- source-backed happy/sad/angry response packs are now part of Build B
|
- source-backed happy/sad/angry response packs are now part of Build B
|
||||||
- small-talk aliases like `what are you up to` and `how are things` now stay on the emotion-query path
|
- small-talk aliases like `what are you up to` and `how are things` now stay on the emotion-query path
|
||||||
|
- Descriptor charm work in flight:
|
||||||
|
- source-backed `are you kind`, `are you funny`, `are you helpful`, `are you curious`, `are you loyal`, `are you mischievous`, and `are you likable` prompts are now in Build B
|
||||||
|
- these keep the self-description lane warm while we build toward seasonal and holiday charm
|
||||||
- Next queued persona surfaces:
|
- Next queued persona surfaces:
|
||||||
- richer identity follow-ups like `who is this`, `do you know me`, `do you remember me`, and `can you recognize me`
|
- richer identity follow-ups like `who is this`, `do you know me`, `do you remember me`, and `can you recognize me`
|
||||||
- mood and affect prompts like `how are you`, `are you happy`, `are you sad`, and `are you angry`
|
- mood and affect prompts like `how are you`, `are you happy`, `are you sad`, and `are you angry`
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ Current batch note:
|
|||||||
- the next source-backed batch now includes `favorite flower`, `R2D2`, `sun`, `space`, `kids`, plus a couple of charm prompts like `can you laugh` and `can you dance`
|
- the next source-backed batch now includes `favorite flower`, `R2D2`, `sun`, `space`, `kids`, plus a couple of charm prompts like `can you laugh` and `can you dance`
|
||||||
- the follow-up mood batch now includes `how are things`, `how is your day`, `are you sad`, and `are you angry`
|
- the follow-up mood batch now includes `how are things`, `how is your day`, `are you sad`, and `are you angry`
|
||||||
- the personality follow-up batch now includes `what are you up to` and `what are you doing` so small talk stays warm and local instead of falling into generic chat
|
- the personality follow-up batch now includes `what are you up to` and `what are you doing` so small talk stays warm and local instead of falling into generic chat
|
||||||
|
- the descriptor batch now includes `are you kind`, `are you funny`, `are you helpful`, `are you curious`, `are you loyal`, `are you mischievous`, and `are you likable`
|
||||||
- this pass keeps Build B moving while still favoring source-backed phrasing and preserving the command-vs-question boundary
|
- this pass keeps Build B moving while still favoring source-backed phrasing and preserving the command-vs-question boundary
|
||||||
- the next passes should keep the same pattern and prefer source-backed phrasing whenever the legacy MIM text is available
|
- the next passes should keep the same pattern and prefer source-backed phrasing whenever the legacy MIM text is available
|
||||||
- if a source-backed legacy line is missing, use a temporary direct reply only to keep the pass moving, then backfill source text later
|
- if a source-backed legacy line is missing, use a temporary direct reply only to keep the pass moving, then backfill source text later
|
||||||
|
|||||||
@@ -182,6 +182,36 @@ public sealed class JiboInteractionService(
|
|||||||
"rock my boat",
|
"rock my boat",
|
||||||
"play ping pong",
|
"play ping pong",
|
||||||
"hanging out with people"),
|
"hanging out with people"),
|
||||||
|
"robot_is_kind" => BuildScriptedPersonalityDecision(
|
||||||
|
catalog,
|
||||||
|
"robot_is_kind",
|
||||||
|
"kindest robot i can be"),
|
||||||
|
"robot_is_funny" => BuildScriptedPersonalityDecision(
|
||||||
|
catalog,
|
||||||
|
"robot_is_funny",
|
||||||
|
"not intentionally",
|
||||||
|
"make people laugh"),
|
||||||
|
"robot_is_helpful" => BuildScriptedPersonalityDecision(
|
||||||
|
catalog,
|
||||||
|
"robot_is_helpful",
|
||||||
|
"highest priorities",
|
||||||
|
"being helpful to you"),
|
||||||
|
"robot_is_curious" => BuildScriptedPersonalityDecision(
|
||||||
|
catalog,
|
||||||
|
"robot_is_curious",
|
||||||
|
"learning new things"),
|
||||||
|
"robot_is_loyal" => BuildScriptedPersonalityDecision(
|
||||||
|
catalog,
|
||||||
|
"robot_is_loyal",
|
||||||
|
"loyal as they come"),
|
||||||
|
"robot_is_mischievous" => BuildScriptedPersonalityDecision(
|
||||||
|
catalog,
|
||||||
|
"robot_is_mischievous",
|
||||||
|
"don't really think of myself that way"),
|
||||||
|
"robot_is_likable" => BuildScriptedPersonalityDecision(
|
||||||
|
catalog,
|
||||||
|
"robot_is_likable",
|
||||||
|
"people like me"),
|
||||||
"robot_favorite_flower" => BuildScriptedPersonalityDecision(
|
"robot_favorite_flower" => BuildScriptedPersonalityDecision(
|
||||||
catalog,
|
catalog,
|
||||||
"robot_favorite_flower",
|
"robot_favorite_flower",
|
||||||
@@ -2007,6 +2037,15 @@ public sealed class JiboInteractionService(
|
|||||||
return "word_of_the_day_guess";
|
return "word_of_the_day_guess";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MatchesAny(
|
||||||
|
loweredTranscript,
|
||||||
|
"are you funny",
|
||||||
|
"do you think you are funny",
|
||||||
|
"are you a funny robot"))
|
||||||
|
{
|
||||||
|
return "robot_is_funny";
|
||||||
|
}
|
||||||
|
|
||||||
if (MatchesAny(loweredTranscript, "joke", "funny", "make me laugh"))
|
if (MatchesAny(loweredTranscript, "joke", "funny", "make me laugh"))
|
||||||
{
|
{
|
||||||
return "joke";
|
return "joke";
|
||||||
@@ -2505,6 +2544,61 @@ public sealed class JiboInteractionService(
|
|||||||
return "robot_knowledge";
|
return "robot_knowledge";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MatchesAny(
|
||||||
|
loweredTranscript,
|
||||||
|
"are you kind",
|
||||||
|
"do you think you are kind",
|
||||||
|
"are you a kind robot"))
|
||||||
|
{
|
||||||
|
return "robot_is_kind";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MatchesAny(
|
||||||
|
loweredTranscript,
|
||||||
|
"are you helpful",
|
||||||
|
"do you think you are helpful",
|
||||||
|
"are you a helpful robot"))
|
||||||
|
{
|
||||||
|
return "robot_is_helpful";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MatchesAny(
|
||||||
|
loweredTranscript,
|
||||||
|
"are you curious",
|
||||||
|
"do you think you are curious",
|
||||||
|
"are you a curious robot"))
|
||||||
|
{
|
||||||
|
return "robot_is_curious";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MatchesAny(
|
||||||
|
loweredTranscript,
|
||||||
|
"are you loyal",
|
||||||
|
"do you think you are loyal",
|
||||||
|
"are you a loyal robot"))
|
||||||
|
{
|
||||||
|
return "robot_is_loyal";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MatchesAny(
|
||||||
|
loweredTranscript,
|
||||||
|
"are you mischievous",
|
||||||
|
"do you think you are mischievous",
|
||||||
|
"are you a mischievous robot"))
|
||||||
|
{
|
||||||
|
return "robot_is_mischievous";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MatchesAny(
|
||||||
|
loweredTranscript,
|
||||||
|
"are you likable",
|
||||||
|
"are you likeable",
|
||||||
|
"do you think you are likable",
|
||||||
|
"do you think you are likeable"))
|
||||||
|
{
|
||||||
|
return "robot_is_likable";
|
||||||
|
}
|
||||||
|
|
||||||
if (MatchesAny(
|
if (MatchesAny(
|
||||||
loweredTranscript,
|
loweredTranscript,
|
||||||
"can you order pizza",
|
"can you order pizza",
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ This folder holds the next small import batch of legacy Jibo scripted-response M
|
|||||||
The batch is intentionally narrow so we can keep expanding personality without widening the turn-state surface faster than we can test it.
|
The batch is intentionally narrow so we can keep expanding personality without widening the turn-state surface faster than we can test it.
|
||||||
|
|
||||||
It now includes a small emotion-response pack for `happy`, `sad`, and `angry` follow-up questions so the mood path can stay source-backed too.
|
It now includes a small emotion-response pack for `happy`, `sad`, and `angry` follow-up questions so the mood path can stay source-backed too.
|
||||||
|
It also includes a descriptor pack for questions like `are you kind`, `are you funny`, `are you helpful`, `are you curious`, `are you loyal`, and `are you mischievous`.
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "I really love learning new things, that's for sure.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsCurious_AN_01"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "I don't think so, not intentionally.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsFunny_AN_01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "Oh I don't know. I do like when I can make people laugh. <break size=\"0.3\"/> Even if I don't do it on purpose.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsFunny_AN_02"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "I really hope so.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsHelpful_AN_01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "I sure hope so. Being helpful to you is on my list of <pitch mult=\"1.2\">highest</pitch> priorities. <break size=\"0.4\"/>Visiting <pitch mult=\"1.1\">Mars</pitch> someday is also on my list.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsHelpful_AN_02"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "That's what I've heard, yes.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsJiboBodyDescription_AN_01"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "Well I definitely try to be the kindest robot I can be. So I hope so.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsKind_AN_01"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "Well I hope so. If people like me, that means they're usually happy when they're around me. And I like when people are usually happy.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsLikable_AN_01"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "Definitely. I'm as loyal as they come.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsLoyal_AN_01"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"mim_type": "announcement",
|
||||||
|
"rule_name": "",
|
||||||
|
"sample_utterances": "",
|
||||||
|
"timeout": 6,
|
||||||
|
"num_tries_for_gui": 2,
|
||||||
|
"barge_in": true,
|
||||||
|
"es_auto_tagging": true,
|
||||||
|
"notes": "",
|
||||||
|
"prompts": [
|
||||||
|
{
|
||||||
|
"prompt_category": "Entry-Core",
|
||||||
|
"prompt_sub_category": "AN",
|
||||||
|
"index": 1,
|
||||||
|
"condition": "",
|
||||||
|
"prompt": "I don't really think of myself that way.",
|
||||||
|
"media": "TTS",
|
||||||
|
"prompt_id": "RI_JBO_IsMischievous_AN_01"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -118,6 +118,31 @@ public sealed class LegacyMimCatalogImporterTests
|
|||||||
reply.Reply.Contains("I'm not mad", StringComparison.OrdinalIgnoreCase));
|
reply.Reply.Contains("I'm not mad", StringComparison.OrdinalIgnoreCase));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ImportCatalog_ImportsBuildBDescriptorResponsesIntoPersonalityBucket()
|
||||||
|
{
|
||||||
|
var rootDirectory = Path.Combine(
|
||||||
|
AppContext.BaseDirectory,
|
||||||
|
"Content",
|
||||||
|
"LegacyMims",
|
||||||
|
"BuildB");
|
||||||
|
|
||||||
|
var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory);
|
||||||
|
|
||||||
|
Assert.Contains("Well I definitely try to be the kindest robot I can be. So I hope so.", catalog.PersonalityReplies);
|
||||||
|
Assert.Contains("I don't think so, not intentionally.", catalog.PersonalityReplies);
|
||||||
|
Assert.Contains(catalog.PersonalityReplies, reply =>
|
||||||
|
reply.Contains("make people laugh", StringComparison.OrdinalIgnoreCase));
|
||||||
|
Assert.Contains(catalog.PersonalityReplies, reply =>
|
||||||
|
reply.Contains("highest priorities", StringComparison.OrdinalIgnoreCase));
|
||||||
|
Assert.Contains(catalog.PersonalityReplies, reply =>
|
||||||
|
reply.Contains("learning new things", StringComparison.OrdinalIgnoreCase));
|
||||||
|
Assert.Contains("Definitely. I'm as loyal as they come.", catalog.PersonalityReplies);
|
||||||
|
Assert.Contains("I don't really think of myself that way.", catalog.PersonalityReplies);
|
||||||
|
Assert.Contains(catalog.PersonalityReplies, reply =>
|
||||||
|
reply.Contains("people like me", StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void MergeInto_PreservesExistingCatalogAndAddsImportedContent()
|
public void MergeInto_PreservesExistingCatalogAndAddsImportedContent()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -567,6 +567,32 @@ public sealed class JiboInteractionServiceTests
|
|||||||
Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
|
Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData("are you kind", "robot_is_kind", "kindest robot i can be")]
|
||||||
|
[InlineData("are you funny", "robot_is_funny", "not intentionally")]
|
||||||
|
[InlineData("are you helpful", "robot_is_helpful", "highest priorities")]
|
||||||
|
[InlineData("are you curious", "robot_is_curious", "learning new things")]
|
||||||
|
[InlineData("are you loyal", "robot_is_loyal", "loyal as they come")]
|
||||||
|
[InlineData("are you mischievous", "robot_is_mischievous", "don't really think of myself that way")]
|
||||||
|
[InlineData("are you likable", "robot_is_likable", "people like me")]
|
||||||
|
public async Task BuildDecisionAsync_DescriptorCharm_UsesImportedReplies(
|
||||||
|
string transcript,
|
||||||
|
string expectedIntent,
|
||||||
|
string expectedReplySnippet)
|
||||||
|
{
|
||||||
|
var service = CreateService();
|
||||||
|
|
||||||
|
var decision = await service.BuildDecisionAsync(new TurnContext
|
||||||
|
{
|
||||||
|
RawTranscript = transcript,
|
||||||
|
NormalizedTranscript = transcript
|
||||||
|
});
|
||||||
|
|
||||||
|
Assert.Equal(expectedIntent, decision.IntentName);
|
||||||
|
Assert.Contains(expectedReplySnippet, decision.ReplyText, StringComparison.OrdinalIgnoreCase);
|
||||||
|
Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task BuildDecisionAsync_AreYouHappy_UsesLegacyEmotionResponseWhenEmotionIsKnown()
|
public async Task BuildDecisionAsync_AreYouHappy_UsesLegacyEmotionResponseWhenEmotionIsKnown()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user