diff --git a/OpenJibo/docs/feature-backlog.md b/OpenJibo/docs/feature-backlog.md index cca8b4f..108603a 100644 --- a/OpenJibo/docs/feature-backlog.md +++ b/OpenJibo/docs/feature-backlog.md @@ -815,6 +815,31 @@ Current release theme: - at least one legacy prompt pack is running through OpenJibo content instead of hand-authored fallback text - we have a clear second-wave list for the more conditional MIM families +### 30. Original Personalized Function Inventory + +- Status: `discovery` +- Tags: `content`, `docs`, `protocol` +- Why now: + - we are actively porting persona and memory slices, so we need a bounded checklist of the original Jibo charm surfaces + - the goal is to keep the next few passes focused on personality-rich wins instead of letting the work sprawl +- Known sources: + - legacy Jibo OS/Pegasus chitchat and MIM response families + - current OpenJibo persona, memory, and greeting work as the implementation target +- Inventory to track: + - identity and origin questions + - personality and capability questions + - favorite-style prompts like `what is your favorite color` + - mood / affect questions + - follow-up state prompts that should stay warm and locally grounded +- Next pass targets: + - port a small favorites family, starting with `favorite color` + - keep adding 1-3 persona prompts per pass with tests + - prefer source-backed MIM imports when the legacy text is available, and use a temporary runtime reply only when needed to unblock user value +- Exit criteria: + - a stable checklist exists for the original persona surface + - each pass can be scoped to a small batch of prompts + - the backlog makes it obvious what is still missing without losing momentum + ## Suggested Order Before closing `1.0.18`: diff --git a/OpenJibo/docs/release-1.0.19-plan.md b/OpenJibo/docs/release-1.0.19-plan.md index 91be779..f753b17 100644 --- a/OpenJibo/docs/release-1.0.19-plan.md +++ b/OpenJibo/docs/release-1.0.19-plan.md @@ -20,6 +20,25 @@ The goal is to keep compatibility work steady while shipping personality and cap - start building reusable content hooks for question-vs-command style responses - keep first implementation rule-based and test-backed +### 1a. Original Personalized Function Inventory + +Keep a running checklist of the legacy persona questions and identity surfaces we want to preserve or port: + +- identity and origin: `what are you`, `who are you`, `what is Jibo`, `who made you`, `where are you from` +- persona and capability: `do you have a personality`, `what is your job`, `how much do you know`, `what do you want` +- self-description and social charm: `what's your name`, `do you have a nickname`, `do you like being Jibo`, `are there others like you` +- favorite-style prompts: `what is your favorite color`, `what is your favorite food`, `what is your favorite music` +- affect and mood: `how are you`, `are you happy`, `are you sad`, `are you angry` +- conversational follow-ups that should stay local and warm instead of falling into generic chat + +Current batch note: + +- `favorite color`, `favorite food`, and `favorite music` are the first small favorites-family slice +- 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 + +The goal is to port these in small batches, capture the source-backed phrasing where possible, and keep a test for each batch so the list never becomes a vague backlog graveyard. + ### 2. Reliability And Device Proof - complete update/backup/restore proof path with captures and operator docs diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/ChitchatStateMachine.cs b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/ChitchatStateMachine.cs index 541eb8d..facc205 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/ChitchatStateMachine.cs +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/ChitchatStateMachine.cs @@ -219,6 +219,18 @@ internal static class ChitchatStateMachine "especially yours", "steady flow of electricity", "you bet i do")); + case "robot_favorite_color": + return BuildScriptedResponseDecision( + "robot_favorite_color", + "Blue."); + case "robot_favorite_food": + return BuildScriptedResponseDecision( + "robot_favorite_food", + "Pizza. It is hard to argue with pizza."); + case "robot_favorite_music": + return BuildScriptedResponseDecision( + "robot_favorite_music", + "Something upbeat with a good rhythm."); case "robot_nickname": return BuildScriptedResponseDecision( "robot_nickname", 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 1a7303b..eb28075 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 @@ -2177,6 +2177,48 @@ public sealed class JiboInteractionService( return "robot_likes_being_jibo"; } + if (MatchesAny( + loweredTranscript, + "what is your favorite color", + "what's your favorite color", + "what s your favorite color", + "what is your favourite color", + "what's your favourite color", + "what s your favourite color", + "what color do you like", + "what colour do you like")) + { + return "robot_favorite_color"; + } + + if (MatchesAny( + loweredTranscript, + "what is your favorite food", + "what's your favorite food", + "what s your favorite food", + "what is your favourite food", + "what's your favourite food", + "what s your favourite food", + "what food do you like", + "what kind of food do you like")) + { + return "robot_favorite_food"; + } + + if (MatchesAny( + loweredTranscript, + "what is your favorite music", + "what's your favorite music", + "what s your favorite music", + "what is your favourite music", + "what's your favourite music", + "what s your favourite music", + "what music do you like", + "what kind of music do you like")) + { + return "robot_favorite_music"; + } + if (MatchesAny( loweredTranscript, "are there others like you", diff --git a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs index afcefd0..04ca5c0 100644 --- a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs +++ b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs @@ -316,6 +316,46 @@ public sealed class JiboInteractionServiceTests Assert.Equal("I do. I am curious, playful, and always up for a new experiment.", decision.ReplyText); } + [Theory] + [InlineData("what is your favorite color")] + [InlineData("what's your favorite color")] + [InlineData("what color do you like")] + public async Task BuildDecisionAsync_FavoriteColor_UsesPersonalityReply(string transcript) + { + var service = CreateService(); + + var decision = await service.BuildDecisionAsync(new TurnContext + { + RawTranscript = transcript, + NormalizedTranscript = transcript + }); + + Assert.Equal("robot_favorite_color", decision.IntentName); + Assert.Equal("Blue.", decision.ReplyText); + Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]); + } + + [Theory] + [InlineData("what is your favorite food", "robot_favorite_food", "Pizza. It is hard to argue with pizza.")] + [InlineData("what is your favorite music", "robot_favorite_music", "Something upbeat with a good rhythm.")] + public async Task BuildDecisionAsync_FavoritesFamily_UsesPersonalityReplies( + string transcript, + string expectedIntent, + string expectedReply) + { + var service = CreateService(); + + var decision = await service.BuildDecisionAsync(new TurnContext + { + RawTranscript = transcript, + NormalizedTranscript = transcript + }); + + Assert.Equal(expectedIntent, decision.IntentName); + Assert.Equal(expectedReply, decision.ReplyText); + Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]); + } + [Theory] [InlineData("do you pay taxes", "robot_taxes", "From what I understand, robots don't ever pay anything.")] [InlineData("what do you want", "robot_desire", "Socializing and electricity. I'd also be happy if everyone in the world was nicer to each other. It seems like they should be.")]