Add person-aware favorites and multitenant state scaffolding
This commit is contained in:
@@ -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`:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.")]
|
||||
|
||||
Reference in New Issue
Block a user