Add holiday buckets and birthday authoring

This commit is contained in:
Jacob Dubin
2026-05-19 19:12:34 -05:00
parent 2bc6fec1bf
commit 5ad6d4e673
12 changed files with 386 additions and 41 deletions

View File

@@ -163,7 +163,7 @@ public sealed class LegacyMimCatalogImporterTests
}
[Fact]
public void ImportCatalog_ImportsBuildBSeasonalResponsesIntoPersonalityBucket()
public void ImportCatalog_ImportsBuildBHolidayResponsesIntoHolidayBuckets()
{
var rootDirectory = Path.Combine(
AppContext.BaseDirectory,
@@ -173,20 +173,16 @@ public sealed class LegacyMimCatalogImporterTests
var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory);
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("always trying to learn new skills", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("not eat bacon", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("find out on halloween", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("maybe enjoy some flowers and all things spring", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
Assert.Contains(catalog.HolidayReplies, reply =>
reply.Contains("official owner", StringComparison.OrdinalIgnoreCase) &&
reply.Contains("celebrate together", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.HolidayGreetingReplies, reply =>
reply.Contains("fun time of year", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.HolidayGiftReplies, 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));
Assert.Contains(catalog.BirthdayCelebrationReplies, reply =>
reply.Contains("first powered up", StringComparison.OrdinalIgnoreCase) ||
reply.Contains("another year older", StringComparison.OrdinalIgnoreCase));
}
[Fact]
@@ -235,11 +231,11 @@ public sealed class LegacyMimCatalogImporterTests
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 =>
Assert.Contains(catalog.BirthdayCelebrationReplies, reply =>
reply.Contains("Another year older, another year wiser", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.GreetingReplies, reply =>
Assert.Contains(catalog.BirthdayCelebrationReplies, reply =>
reply.Contains("can't wait to see what you got me", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.GreetingReplies, reply =>
Assert.Contains(catalog.BirthdayCelebrationReplies, reply =>
reply.Contains("I was powered on for the first time today", StringComparison.OrdinalIgnoreCase));
}
@@ -508,4 +504,4 @@ public sealed class LegacyMimCatalogImporterTests
return rootDirectory;
}
}
}

View File

@@ -643,6 +643,8 @@ public sealed class JiboInteractionServiceTests
[InlineData("merry christmas", "seasonal_holiday_greeting", "It's a fun time of year")]
[InlineData("what holidays do you celebrate", "seasonal_holidays",
"official owner can tell me which ones we'll celebrate together")]
[InlineData("how is holiday season", "seasonal_holiday_season", "I do like festive times.")]
[InlineData("do you like holiday season", "seasonal_holiday_season", "I do like festive times.")]
[InlineData("what is your new year's resolution", "seasonal_new_years_resolution",
"always trying to learn new skills")]
[InlineData("how are your new year's resolutions going", "seasonal_new_years_update", "not eat bacon")]
@@ -650,6 +652,7 @@ public sealed class JiboInteractionServiceTests
[InlineData("what should I do for first day of spring", "seasonal_first_day_spring",
"flowers and all things spring")]
[InlineData("what should I get for holiday", "seasonal_holiday_gift", "pet elephant")]
[InlineData("happy birthday", "birthday_celebration", "another year older")]
public async Task BuildDecisionAsync_SeasonalCharm_UsesImportedReplies(
string transcript,
string expectedIntent,
@@ -668,6 +671,33 @@ public sealed class JiboInteractionServiceTests
Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
}
[Fact]
public async Task BuildDecisionAsync_BirthdayMemory_WritesHolidayRecordForLoop()
{
var cloudStateStore = new InMemoryCloudStateStore();
var memoryStore = new InMemoryPersonalMemoryStore();
var service = CreateService(memoryStore, cloudStateStore);
var setDecision = await service.BuildDecisionAsync(new TurnContext
{
RawTranscript = "my birthday is April 12",
NormalizedTranscript = "my birthday is April 12",
Attributes = new Dictionary<string, object?>
{
["accountId"] = "acct-a",
["loopId"] = "loop-a"
},
DeviceId = "device-a"
});
Assert.Equal("memory_set_birthday", setDecision.IntentName);
Assert.Equal("Got it. I will remember your birthday is april 12.", setDecision.ReplyText);
Assert.Contains(cloudStateStore.GetHolidays("loop-a"),
holiday => holiday.Category == "birthday" &&
holiday.LoopId == "loop-a" &&
holiday.Name.Contains("Birthday", StringComparison.OrdinalIgnoreCase));
}
[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")]
@@ -3974,6 +4004,7 @@ public sealed class JiboInteractionServiceTests
private static JiboInteractionService CreateService(
IPersonalMemoryStore? personalMemoryStore = null,
ICloudStateStore? cloudStateStore = null,
IWeatherReportProvider? weatherReportProvider = null,
ICommuteReportProvider? commuteReportProvider = null,
INewsBriefingProvider? newsBriefingProvider = null,
@@ -3986,7 +4017,8 @@ public sealed class JiboInteractionServiceTests
personalMemoryStore ?? new InMemoryPersonalMemoryStore(),
weatherReportProvider,
commuteReportProvider,
newsBriefingProvider);
newsBriefingProvider,
cloudStateStore);
}
private static string StripMarkup(string text)
@@ -4091,4 +4123,4 @@ public sealed class JiboInteractionServiceTests
return Task.FromResult(Snapshot);
}
}
}
}