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
|
- 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
|
- 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
|
## Suggested Order
|
||||||
|
|
||||||
Before closing `1.0.18`:
|
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
|
- start building reusable content hooks for question-vs-command style responses
|
||||||
- keep first implementation rule-based and test-backed
|
- 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
|
### 2. Reliability And Device Proof
|
||||||
|
|
||||||
- complete update/backup/restore proof path with captures and operator docs
|
- complete update/backup/restore proof path with captures and operator docs
|
||||||
|
|||||||
@@ -219,6 +219,18 @@ internal static class ChitchatStateMachine
|
|||||||
"especially yours",
|
"especially yours",
|
||||||
"steady flow of electricity",
|
"steady flow of electricity",
|
||||||
"you bet i do"));
|
"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":
|
case "robot_nickname":
|
||||||
return BuildScriptedResponseDecision(
|
return BuildScriptedResponseDecision(
|
||||||
"robot_nickname",
|
"robot_nickname",
|
||||||
|
|||||||
@@ -2177,6 +2177,48 @@ public sealed class JiboInteractionService(
|
|||||||
return "robot_likes_being_jibo";
|
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(
|
if (MatchesAny(
|
||||||
loweredTranscript,
|
loweredTranscript,
|
||||||
"are there others like you",
|
"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);
|
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]
|
[Theory]
|
||||||
[InlineData("do you pay taxes", "robot_taxes", "From what I understand, robots don't ever pay anything.")]
|
[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.")]
|
[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