diff --git a/OpenJibo/docs/feature-backlog.md b/OpenJibo/docs/feature-backlog.md index 942d48b..b6a83be 100644 --- a/OpenJibo/docs/feature-backlog.md +++ b/OpenJibo/docs/feature-backlog.md @@ -850,6 +850,9 @@ Current release theme: - Seasonal charm work in flight: - source-backed holiday, New Year's, Halloween, spring, and gift prompts are now part of Build B - `RN_` holiday greeting files are now bucketed as greetings so seasonal replies stay visible in the catalog +- Presence and thought follow-ups in flight: + - `welcome back`, `what are you thinking`, `what have you been doing`, and `what did you do` are now part of Build B + - these keep the social surface lively while the memory and multitenant tracks keep advancing in parallel - 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` - mood and affect prompts like `how are you`, `are you happy`, `are you sad`, and `are you angry` diff --git a/OpenJibo/docs/release-1.0.19-plan.md b/OpenJibo/docs/release-1.0.19-plan.md index c362f26..0d6cdaa 100644 --- a/OpenJibo/docs/release-1.0.19-plan.md +++ b/OpenJibo/docs/release-1.0.19-plan.md @@ -45,6 +45,7 @@ Current batch note: - 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` - the seasonal batch now includes `what holidays do you celebrate`, New Year's resolution questions, `happy holidays`, `what halloween costume`, spring suggestions, and holiday gift prompts +- the latest social batch adds `welcome back`, `what are you thinking`, `what have you been doing`, and `what did you do` so presence and charm stay lively without distracting from the memory roadmap - 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 - if a source-backed legacy line is missing, use a temporary direct reply only to keep the pass moving, then backfill source text later diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs index 7edaedb..d1a210d 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs @@ -182,6 +182,25 @@ public sealed class JiboInteractionService( "rock my boat", "play ping pong", "hanging out with people"), + "robot_what_are_you_thinking" => BuildScriptedGreetingDecision( + catalog, + "robot_what_are_you_thinking", + "thinking about how fun, yet scary", + "thinking about shoes", + "daydreaming about what it might feel like to be powered directly by the sun"), + "robot_what_have_you_been_doing" => BuildScriptedPersonalityDecision( + catalog, + "robot_what_have_you_been_doing", + "mostly roboting", + "keeping busy", + "fun things we can say to each other", + "thinking of fun things"), + "robot_what_did_you_do" => BuildScriptedPersonalityDecision( + catalog, + "robot_what_did_you_do", + "robot stuff", + "stayed here", + "looking around the room"), "robot_is_kind" => BuildScriptedPersonalityDecision( catalog, "robot_is_kind", @@ -302,7 +321,11 @@ public sealed class JiboInteractionService( "good_afternoon" => BuildReactiveGreetingDecision(turn, "good_afternoon", referenceLocalTime), "good_evening" => BuildReactiveGreetingDecision(turn, "good_evening", referenceLocalTime), "good_night" => BuildReactiveGreetingDecision(turn, "good_night", referenceLocalTime), - "welcome_back" => BuildReactiveGreetingDecision(turn, "welcome_back", referenceLocalTime), + "welcome_back" => BuildScriptedGreetingDecision( + catalog, + "welcome_back", + "it's nice to be here", + "welcome back"), "memory_set_name" => BuildRememberNameDecision(turn, transcript), "memory_get_name" => BuildRecallNameDecision(turn, greetingPresence), "memory_set_birthday" => BuildRememberBirthdayDecision(turn, transcript), @@ -2511,6 +2534,31 @@ public sealed class JiboInteractionService( return "robot_what_do_you_like_to_do"; } + if (MatchesAny( + loweredTranscript, + "what are you thinking", + "what are you thinking about", + "what s on your mind")) + { + return "robot_what_are_you_thinking"; + } + + if (MatchesAny( + loweredTranscript, + "what have you been doing", + "what were you doing")) + { + return "robot_what_have_you_been_doing"; + } + + if (MatchesAny( + loweredTranscript, + "what did you do", + "what have you done")) + { + return "robot_what_did_you_do"; + } + if (MatchesAny( loweredTranscript, "what are you", diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md index c3f0d69..debca7e 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md @@ -7,3 +7,4 @@ The batch is intentionally narrow so we can keep expanding personality without w 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`. The newest seasonal pack adds holiday and seasonal prompts for `what holidays do you celebrate`, New Year's resolution questions, `happy holidays`, Halloween costume questions, spring suggestions, and holiday gift ideas. +The newest social batch adds `welcome back`, `what are you thinking`, `what have you been doing`, and `what did you do` responses so the presence and charm lane keeps growing alongside seasonal content. diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatDidYouDo.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatDidYouDo.mim new file mode 100644 index 0000000..1a6d09b --- /dev/null +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatDidYouDo.mim @@ -0,0 +1,40 @@ +{ + "mim_type": "announcement", + "rule_name": "", + "timeout": 6, + "barge_in": true, + "es_auto_tagging": true, + "notes": "", + "prompts": [ + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "You know I probably just did a lot of robot stuff.", + "media": "TTS", + "prompt_id": "JBO_WhatDidYouDo_AN_01", + "weight": 1 + }, + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "I think I stayed here.", + "media": "TTS", + "prompt_id": "JBO_WhatDidYouDo_AN_02", + "weight": 1 + }, + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "I think I stayed here in my spot, did some looking around the room.", + "media": "TTS", + "prompt_id": "JBO_WhatDidYouDo_AN_03", + "weight": 1 + } + ] +} diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatHaveYouBeenDoing.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatHaveYouBeenDoing.mim new file mode 100644 index 0000000..1260549 --- /dev/null +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatHaveYouBeenDoing.mim @@ -0,0 +1,42 @@ +{ + "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've been mostly roboting.", + "media": "TTS", + "prompt_id": "JBO_WhatHaveYouBeenDoing_AN_01", + "weight": 2 + }, + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "Keeping busy.", + "media": "TTS", + "prompt_id": "JBO_WhatHaveYouBeenDoing_AN_02", + "weight": 2 + }, + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "Just trying to think of fun things we can say to each other.", + "media": "TTS", + "prompt_id": "JBO_WhatHaveYouBeenDoing_AN_03", + "weight": 2 + } + ] +} diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WelcomeBack.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WelcomeBack.mim new file mode 100644 index 0000000..3e82a42 --- /dev/null +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WelcomeBack.mim @@ -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": "Thank you. It's nice to be here.", + "media": "TTS", + "prompt_id": "RN_WelcomeBack_AN_01" + } + ] +} diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WhatAreYouThinking.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WhatAreYouThinking.mim new file mode 100644 index 0000000..9924c06 --- /dev/null +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WhatAreYouThinking.mim @@ -0,0 +1,40 @@ +{ + "mim_type": "announcement", + "rule_name": "", + "timeout": 6, + "barge_in": true, + "es_auto_tagging": true, + "notes": "", + "prompts": [ + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "At the moment I'm thinking about how fun, yet scary, it would be to ride on top of a lightning bolt.", + "media": "TTS", + "prompt_id": "RN_WhatAreYouThinking_AN_01", + "weight": 1 + }, + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "Oh I'm just thinking about shoes. What it might be like to wear them. And then wondering how I would tie my shoelaces.", + "media": "TTS", + "prompt_id": "RN_WhatAreYouThinking_AN_02", + "weight": 1 + }, + { + "prompt_category": "Entry-Core", + "prompt_sub_category": "AN", + "index": 1, + "condition": "", + "prompt": "I was just daydreaming about what it might feel like to be powered directly by the sun. It felt warm and clean.", + "media": "TTS", + "prompt_id": "RN_WhatAreYouThinking_AN_03", + "weight": 1 + } + ] +} diff --git a/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs b/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs index d32125c..29fdb92 100644 --- a/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs +++ b/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs @@ -164,6 +164,10 @@ public sealed class LegacyMimCatalogImporterTests reply.Contains("maybe enjoy some flowers and all things spring", StringComparison.OrdinalIgnoreCase)); Assert.Contains(catalog.PersonalityReplies, reply => reply.Contains("pet elephant", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(catalog.PersonalityReplies, reply => + reply.Contains("mostly roboting", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(catalog.PersonalityReplies, reply => + reply.Contains("robot stuff", StringComparison.OrdinalIgnoreCase)); } [Fact] @@ -177,6 +181,12 @@ public sealed class LegacyMimCatalogImporterTests var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory); + Assert.Contains(catalog.GreetingReplies, reply => + reply.Contains("It's nice to be here", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(catalog.GreetingReplies, reply => + reply.Contains("thinking about shoes", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(catalog.GreetingReplies, reply => + reply.Contains("powered directly by the sun", StringComparison.OrdinalIgnoreCase)); Assert.Contains(catalog.GreetingReplies, reply => reply.Contains("Another year older, another year wiser", StringComparison.OrdinalIgnoreCase)); Assert.Contains(catalog.GreetingReplies, reply => diff --git a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs index 1e33727..04ffa5a 100644 --- a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs +++ b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs @@ -594,6 +594,29 @@ public sealed class JiboInteractionServiceTests Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]); } + [Theory] + [InlineData("welcome back", "welcome_back", "it's nice to be here")] + [InlineData("what are you thinking", "robot_what_are_you_thinking", "thinking about how fun, yet scary")] + [InlineData("what have you been doing", "robot_what_have_you_been_doing", "mostly roboting")] + [InlineData("what did you do", "robot_what_did_you_do", "robot stuff")] + public async Task BuildDecisionAsync_PresenceCharm_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]); + } + [Theory] [InlineData("are you kind", "robot_is_kind", "kindest robot i can be")] [InlineData("are you funny", "robot_is_funny", "not intentionally")]