feat: add learner memory ingestion

This commit is contained in:
user
2026-04-26 16:34:52 +09:00
parent 4a4240fea2
commit 600acf7303
23 changed files with 931 additions and 24 deletions

View File

@@ -8,6 +8,7 @@ import (
"sync/atomic"
"time"
"tutor/internal/learnermemory"
"tutor/internal/workflows"
)
@@ -16,11 +17,12 @@ var ErrQuestionNotFound = errors.New("diagnostic question not found")
type Service struct {
store Store
runner workflows.Runner
memory *learnermemory.Service
ids atomic.Uint64
}
func NewService(store Store, runner workflows.Runner) *Service {
return &Service{store: store, runner: runner}
func NewService(store Store, runner workflows.Runner, memory *learnermemory.Service) *Service {
return &Service{store: store, runner: runner, memory: memory}
}
func (s *Service) CreateSession(_ context.Context, input CreateSessionInput) (Session, error) {
@@ -45,6 +47,16 @@ func (s *Service) CreateSession(_ context.Context, input CreateSessionInput) (Se
Questions: BackendDeveloperQuestions(),
CreatedAt: time.Now().UTC(),
}
if s.memory != nil {
if _, err := s.memory.EnsureProfile(learnermemory.ProfileInput{
UserID: session.UserID,
TargetRole: session.TargetRole,
Stack: session.Stack,
InterviewTimeline: session.InterviewTimeline,
}); err != nil {
return Session{}, err
}
}
return s.store.Create(session)
}
@@ -84,6 +96,15 @@ func (s *Service) SubmitAnswer(ctx context.Context, input SubmitAnswerInput) (An
return Answer{}, err
}
answer.Grade = grade
if s.memory != nil {
candidate, err := s.runner.ExtractLearningMemory(ctx, grade)
if err != nil {
return Answer{}, err
}
if err := s.memory.ApplyCandidate(candidate); err != nil {
return Answer{}, err
}
}
session.Answers = append(session.Answers, answer)
if answeredQuestionCount(session.Answers) >= len(session.Questions) {