Pipeline detalhado
Pre-LLM (sincrono, zero custo LLM)
-
StudentModelService.getSnapshot(userId, courseId)
- Carrega ConceptMastery (Beta distribution per concept)
- Carrega misconceptions ativas/resolving (com evidence trail)
- Carrega EpisodicMemory (o que funcionou antes)
- Carrega quizContext (avgScore, passRate, totalAttempts, weakAreas)
- Carrega ChatSession history (sliding window 10 msgs)
-
RetrievalAgent.retrieve(query, studentModel)
- Reformula query usando contexto (substitui "isso", "aquilo" por conceitos atuais)
- Busca pgvector com filtros (tenantId, courseId)
- Boost por areas fracas em quizzes (
quizWeakAreasdo studentModel) - Top-K com reranking semantico
-
PedagogicalAgent.select(studentModel, query)
- Avalia mastery medio + dominio especifico da query
- Aplica ajustes (chat-quiz divergence, age, learning style)
- Retorna estrategia + system prompt addition
-
buildEnrichedPrompt(query, studentModel, ragChunks, strategy, misconceptions)
- Monta system prompt com:
- Estrategia pedagogica selecionada
- RAG context (top-5 chunks com source attribution)
- Misconceptions ativas (com instrucoes para abordar)
- Recent quiz attempts (memoria inter-turno)
- inline quiz trigger context (se houve quiz recente)
- Monta system prompt com:
LLM principal (streaming, SSE)
router.stream(taskType: "chat_tutor", messages, options) resolve provider via TenantTaskModelConfig:
- Claude (primary) → OpenAI → xAI Grok → Google Gemini (fallback chain)
- Circuit breaker per provider (Redis state)
- Metering middleware: rate limit + credit check + cost calculator
- Streaming via Server-Sent Events para cliente
LLM pode emitir tool calls especiais:
[INLINE_QUIZ]{...}[/INLINE_QUIZ]— quiz interativo renderizado no chatpresent_quiztool call — formato Vercel AI SDK
Post-LLM (background via after(), fire-and-forget)
-
EvaluationAgent.evaluate(turn, studentModel) — Haiku, ~$0.001
- Classifica understanding: correct | partial | incorrect | unclear
- Detecta StudentMisconception com:
- source: "chat"
- sourceSessionId
- contextSnippet (max 500 chars)
- concepts[] (mapped to ConceptMastery)
- Atualiza ConceptMastery (Bayesian update via beta(alpha+success, beta+failure))
- Chama MisconceptionResolutionService.checkAndTransition (state machine)
-
ContentAgent.preGenerate(studentModel, conceptId) — Haiku, ~$0.001
- Gera exercicio follow-up baseado em weak concepts
- Armazena em Redis (TTL 30min) para servir no proximo turno
- Reduz latencia percebida pelo aluno
-
SessionSummarizer (a cada 10 turnos) — Haiku, ~$0.001
- Resume historico longo
- Substitui mensagens antigas no sliding window
- Preserva insights pedagogicos relevantes
-
SupervisorAgent.run(turn, courseContext) — Haiku, ~$0.001
- Classifica severity (5 niveis) + category (8 tipos)
- Cria AiSupervisorIncident se severity != "none"
- Aplica strikes / quarantine / safety cooldown conforme regras
Configuracao por admin
TenantTaskModelConfig
Admin escolhe provider+model por tipo de tarefa:
chat_tutor → Claude Sonnet 4.6 (ou GPT-4o, ou Grok-3, etc)
chat_evaluation → Claude Haiku
chat_summarization → Claude Haiku
chat_supervisor → Claude Haiku
content_generation → Claude Haiku
course_review → Claude Sonnet
gamification_agent → Claude Sonnet
course_agent → Claude Sonnet
PedagogicalConfig
Configurabilidade pedagogica por tenant:
- masteryThresholds: thresholds para mudar estrategia (default 0.3, 0.5, 0.7, 0.9)
- domainOverrides: ajuste por dominio (ex: matematica usa scaffolding mais agressivo)
- ageOverrides: ajuste por faixa etaria (crianca = direct_instruction mais frequente)
- learningStyleOverrides: visual, auditivo, kinestesico
Prompt template customization
Admin institucional pode editar system prompt do tutor via PromptTemplate (no banco):
- Por taskType (chat_tutor)
- Por provider (Anthropic, OpenAI, Google, xAI — variantes otimizadas)
- Por locale (pt-BR, en-US, es-ES, fr-FR)
- Por tenant (ou null = global)
- Por curso (override per-course)
Limitacoes tecnicas
- Latencia first-token: 800-1500ms (incluindo pre-LLM pipeline)
- Latencia total turno: 2-8s para resposta media (~300 palavras)
- Context window: limitado pelo provider (Claude Sonnet 4.6 = 200K, GPT-4o = 128K)
- Idiomas: tutor responde no idioma do aluno mas internamente o pipeline e bilingue (en/pt)
- Imagens: tutor aceita imagens no input (multimodal Claude/GPT/Gemini) mas RAG e text-only
- Voz: nao implementado (roadmap)