feat: LLM-based schedule generation

This commit is contained in:
2026-05-17 15:40:13 +09:00
parent 864f118a9b
commit 90214cec5c
6 changed files with 433 additions and 120 deletions

View File

@@ -1,9 +1,11 @@
import { InMemoryMemoryStore } from './memory';
import {
addUtcDays,
blocksToDailySchedule,
blocksToMonthlySchedule,
buildAvailabilitySnapshot,
createMonthlyScheduleEntries,
createTenMinuteDailySchedule,
daysInMonth,
scheduleInstruction,
scheduleTargetDay,
startOfUtcDay,
toIso,
@@ -84,8 +86,17 @@ export class Persona {
async createDailySchedule(datetime: DateTimeInput, message: string): Promise<ScheduleEntry[]> {
const persona = await this.ready();
if (!this.options.models?.schedule) {
throw new Error('createDailySchedule requires options.models.schedule.');
}
const targetDay = scheduleTargetDay(datetime);
const entries = createTenMinuteDailySchedule({ persona, targetDay, message });
const blocks = await this.options.models.schedule.generateDailySchedule({
persona,
targetDay,
message,
instruction: scheduleInstruction(),
});
const entries = blocksToDailySchedule({ persona, targetDay, message, blocks });
await this.emit('persona.schedule.daily.generated', { targetDay: targetDay.toISOString(), count: entries.length, message });
await this.memory.saveScheduleEntries(persona.id, entries);
await this.refreshAvailability(datetime);
@@ -94,7 +105,19 @@ export class Persona {
async createMonthlySchedule(datetime: DateTimeInput, message: string): Promise<ScheduleEntry[]> {
const persona = await this.ready();
const entries = createMonthlyScheduleEntries({ persona, fromDay: datetime, message });
if (!this.options.models?.schedule) {
throw new Error('createMonthlySchedule requires options.models.schedule.');
}
const fromDay = scheduleTargetDay(datetime);
const days = daysInMonth(fromDay);
const blocks = await this.options.models.schedule.generateMonthlySchedule({
persona,
fromDay,
message,
days,
instruction: scheduleInstruction(),
});
const entries = blocksToMonthlySchedule({ persona, fromDay, message, blocks });
await this.emit('persona.schedule.monthly.generated', { count: entries.length, message });
await this.memory.saveScheduleEntries(persona.id, entries);
await this.refreshAvailability(datetime);