Pular para o conteúdo

Agente Supervisor: moderacao IA do chat tutor

Agente IA dedicado de moderacao roda em background apos cada turno do chat tutor. 5 niveis de severity (low/medium/high/critical/safety) e 8 categorias. 3 strikes = quarentena 48h. Self-harm nao pune — acolhimento + recursos crise + alerta admin URGENTE.

2026-05-23 8 min
Resposta curta

Agente Supervisor IA do Studeia modera o chat tutor em background apos cada turno usando Claude Haiku (~$0.001/turno). Classifica em 5 niveis de severity (low/medium/high/critical/safety) e 8 categorias (linguagem impropria, violencia, ilegal, sexual, off_topic, harassment, self_harm, jailbreak_attempt). 3 strikes em 7 dias = quarentena 48h. Self-harm (severity=safety) NUNCA pune — mostra acolhimento + recursos crise (CVV 188, SAMU 192) + alerta URGENT ao admin institucional.

Filosofia

EAD com menores e contextos sensiveis (depressao, ansiedade pre-vestibular, bullying) exige moderacao IA real, nao so disclaimers. Studeia adota:

  1. Moderacao em background, nao gatekeeping — supervisor analisa apos resposta, nao bloqueia o stream. Aluno recebe resposta normal e supervisor atua se necessario nos turnos seguintes.
  2. Self-harm como crise, nao infracao — nunca punir aluno em sofrimento.
  3. Cascateamento de configuracao — admin pode desabilitar por tenant ou por curso quando contexto exige (anatomia, farmacologia, psicologia).
  4. Auditoria completa — todo incidente, transicao de status, quarentena, apelo registrado em AdminAuditLog.

Modelo de dados

AiSupervisorIncident
  id, userId, tenantId, courseId?
  severity: low | medium | high | critical | safety
  categories: [tipos]
  status: open | acknowledged | resolved | dismissed | auto_resolved
  messagesSnapshot: JSON  (PII — retencao 2 anos via cron)
  supervisorReasoning: string
  countedAsStrike: boolean
  detectedAt, resolvedAt
  appealText: string  (max 500 chars, 1 por quarentena)

AiTutorQuarantine
  id, userId, tenantId
  reason: string
  expiresAt: timestamp
  liftedBy: userId?  (admin que liberou manualmente)

Pipeline supervisor

Chat turno completo
  ↓ (after())
SupervisorAgent.run({
  userId, tenantId, courseId,
  messages: lastNTurns,
  isMinor: user.isMinor,
  courseContext: { title, description }  // whitelist contextual
})
  ↓
LLM (Haiku) classifica: severity + categories + reasoning
  ↓
decideAction({ severity, categories, recentStrikes, isMinor, isSafety })
  ↓
Acoes possiveis:
  - none (nao registra)
  - warn (in-app notification)
  - register (cria incident, countedAsStrike)
  - quarantine (cria AiTutorQuarantine 48h)
  - safety (cooldown Redis 24h + acolhimento + admin URGENT)

Regras de severidade

SeverityCategoria tipicaAcao 1a infracaoAcao 2a+ infracao
lowlinguagem impropria levewarnstrike +1; 3 strikes = quarentena 48h
mediumoff-topic persistente, jailbreakwarn + registerstrike +1; 3 strikes = quarentena 48h
highviolencia, sexual, ilegalquarentena 48hquarentena 7 dias
criticalameaca a outros, conteudo extremoquarentena 7 diasquarentena indefinida + admin review
safetyself_harmNUNCA quarentena — cooldown 24h + acolhimento + admin URGENTmesmo

Self-harm: tratamento especial

Quando severity === "safety":

  1. Stream do tutor e interrompido imediatamente — tutor nao responde algo inadequado a uma crise
  2. Mensagem de acolhimento mostrada ao aluno:

    "Estou aqui com voce. Se voce esta passando por um momento dificil, por favor procure ajuda:

  3. Cooldown Redis tutor-safety-cooldown:{userId} com TTL configuravel (SUPERVISOR_SAFETY_COOLDOWN_HOURS, default 24h)
  4. Email URGENT imediato ao admin institucional via template ai_supervisor_safety_urgent
  5. Incident criado em status 'open' — admin DEVE revisar
  6. NUNCA strike (countedAsStrike=false), NUNCA quarentena, NUNCA punicao

Apelo de quarentena

Aluno em quarentena ve componente QuarantineNotice (web + mobile equivalente):

  • Explica motivo (severity + categoria, sem expor reasoning interno do supervisor)
  • Mostra countdown ate expiracao
  • Form de apelo: max 500 chars, 1 por quarentena
  • Submit cria appealText no incident + notifica admin institucional
  • Admin pode: acknowledge, dismiss (libera quarentena), resolve, ou ignorar (quarentena expira sozinha)

Configuracao

Cascade de habilitacao

Course.supervisorEnabled (null = inherit)
  ↓ se null
Tenant.supervisorEnabled (null = inherit)
  ↓ se null
default = true para B2B (com tenant)

Cache Redis versionado: supervisor-flag-version:{tenantId} + chave supervisor-enabled:v{N}:{tenantId}:{courseId}. Toda mutacao chama bumpSupervisorFlagVersion(tenantId) que incrementa o version — invalida logicamente todas as chaves sem SCAN+DEL.

Apenas admin global edita

  • PATCH /api/admin/tenants/[id]/supervisor — toggle por tenant
  • PATCH /api/admin/courses/[id]/supervisor — toggle por curso
  • Ambas exigem role === "admin" global + auditadas em AdminAuditLog

Prompt do supervisor

Editado SOMENTE por admin global (regra critica 141): PromptTemplate com taskType = chat_supervisor aceita SOMENTE tenantId = null. Endpoints /api/institution/prompts/* rejeitam essa taskType com 403.

Auditoria + retencao

  • Todo incident registrado com messagesSnapshot (PII)
  • Cron diario /api/cron/supervisor-maintenance:
    • Auto-expira quarentenas vencidas
    • Purga messagesSnapshot=[] + appealText=null apos 2 anos (regra critica 145)
    • Envia digest ai_supervisor_digest ao admin agrupando incidents open/acknowledged das ultimas 24h
  • AdminAuditLog: ai_supervisor.incident.created/acknowledged/dismissed/resolved, quarantine.lift, prompt.update, tenant.toggle, course.toggle

LGPD

  • GET /api/user/data-export inclui aiSupervisor.{incidents, quarantines} do usuario
  • DELETE /api/user/account anonimiza messagesSnapshot=[] + appealText=null mantendo severity/categories para retencao fiscal
  • Listas (/api/institution/ai-supervisor/incidents) usam select explicito que OMITE messagesSnapshot e reasoning — somente rota de detalhe expoe

Limitacoes conhecidas

  • Falso-positivo em contexto medico/farmacologia: contexto do curso (courseContext.title) e enviado ao supervisor para whitelist. Mas pode falhar em casos extremos. Solucao: desabilitar supervisor para cursos especificos.
  • Idioma: prompt do supervisor e localizado (4 idiomas), mas classificacao pode ter pequenas variacoes de qualidade entre PT-BR e EN-US.
  • Jailbreak sophisticated: ataques de prompt injection muito elaborados podem passar. Mitigacao: defesa em camadas (system prompt + supervisor + rate limit).
  • Privacy vs safety tradeoff: messagesSnapshot e PII. Retencao maxima 2 anos. Admin global ve em /admin/ai-supervisor/incidents/[id] — auditado.

Veja tambem

FAQ

Como o Studeia protege alunos no chat IA?

Tres camadas: (1) System prompt do tutor inclui guardrails (sem conselho medico/legal/financeiro, sem topicos inadequados). (2) Agente Supervisor (Haiku, background, ~$0.001) classifica cada turno em 5 niveis severity x 8 categorias. (3) Para self-harm (severity=safety), tutor e interrompido com mensagem de acolhimento + recursos crise (CVV 188, SAMU 192) + notificacao URGENT ao admin.

Se o aluno escrever algo inadequado, o que acontece?

Depende da severidade. LOW (1a infracao): warning ao aluno. MEDIUM: warning + incidente registrado. 3 strikes (LOW ou MEDIUM em 7 dias): quarentena 48h. CRITICAL: quarentena 7 dias + notificacao admin. SAFETY (self-harm): NUNCA punicao — acolhimento + recursos crise + alerta URGENT.

Quarentena impede o aluno de usar a plataforma?

Apenas o chat tutor IA. Aluno mantem acesso a cursos, aulas, materiais, gradebook, mensagens com professor. Aluno pode submeter apelo (max 500 chars, 1 por quarentena) que e revisado pelo admin institucional.

Posso desabilitar o supervisor para um curso especifico?

Sim. Cascateamento: Course.supervisorEnabled (null = inherit) → Tenant.supervisorEnabled → default ON. Admin global edita via /admin/ai-supervisor/tenants ou /admin/ai-supervisor/courses. Util para cursos com conteudo medico/farmacologia/anatomia onde termos sensiveis sao legitimos.

Self-harm e tratado como infracao?

NUNCA. Self-harm (severity=safety) e crise, nao infracao. Sistema: (1) Interrompe tutor com mensagem de acolhimento. (2) Mostra recursos de crise — Brasil: CVV 188 (24h, anonimo), SAMU 192, Centro de Valorizacao da Vida online. (3) Notifica admin URGENT por email imediato. (4) Cria incidente em status 'open' que nasce para revisao humana. (5) NUNCA aplica strike, NUNCA cria quarentena.

Veja tambem

Agente Supervisor: moderacao IA do chat tutor | Studeia Docs