feat(ai): scorecards de QA, avaliacao automatica, dashboard (fase 21)
CRUD de QualityScorecard/Item (criterios por tenant, sem lista fixa hardcoded), novo AIJobType.SCORECARD_EVALUATION encadeado junto com ANALYSIS a partir da transcricao (mesma decisao de privacidade + exige scorecard habilitado). apps/ai-worker avalia contra todos os scorecards habilitados do tenant, prompt montado dinamicamente a partir dos itens de cada um, nunca guarda chain-of-thought do modelo (so' o resultado final validado). GET /reports/ai-dashboard agrega CallAIAnalysis+QualityEvaluation do periodo (score medio, sentimento, assuntos/objecoes, compliance alerts, ranking de agentes). Testado ponta a ponta contra o ai-worker real e Postgres real com RLS (scorecard real via API, prompt montado a partir dos itens reais, job real reservado via SKIP LOCKED, retry+dead-letter corretos) — chamada de rede real contra OpenAI/Anthropic continua nunca exercitada. Detalhes em docs/QUALITY_SCORECARDS.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X1HxY46WGU4G1zmVDNKcWw
This commit is contained in:
48
TODO.md
48
TODO.md
@@ -546,11 +546,51 @@
|
||||
manualmente, já que nenhuma chamada real completa sem rede);
|
||||
convenção de canal 0=cliente/1=agente contra áudio real
|
||||
distinguível (só tons sintéticos)
|
||||
- [ ] Scorecards/QA (secao 117-118) e Usage Metering completo/reports de
|
||||
custo (secao 124) — PHASE 21
|
||||
- [x] Scorecards/QA (secao 117-118) e Dashboard IA (secao 119) — PHASE 21
|
||||
(Usage Metering completo/reports de custo, secao 124, fica pra
|
||||
quando a fase Billing começar — os `AIUsageRecord` já são gravados
|
||||
desde a PHASE 20, só falta o relatório em cima deles)
|
||||
|
||||
## PHASE 21+ — ver `agente.md` seções 117 em diante (Scorecards, Usage
|
||||
Metering, Billing, Frontend, Security, Tests)
|
||||
## PHASE 21 — IA: Scorecards/QA/Dashboard (agente.md secao 117-119) — ver
|
||||
docs/QUALITY_SCORECARDS.md
|
||||
- [x] `QualityScorecard`/`QualityScorecardItem`/`QualityEvaluation` já
|
||||
existiam desde a migration `ai_module` (PHASE 19) — só faltava
|
||||
código; sem lista fixa de critérios hardcoded (secao 117), cada
|
||||
tenant define os seus (`weight`/`description`/`evaluation_prompt`)
|
||||
- [x] Novo `AIJobType.SCORECARD_EVALUATION` (migration
|
||||
`20260828194146_ai_job_scorecard_evaluation`, só `ALTER TYPE ...
|
||||
ADD VALUE`, sem RLS pra mexer)
|
||||
- [x] `apps/api/src/quality/quality-scorecards.controller.ts`: CRUD
|
||||
(create com items aninhados numa tacada só, list, soft delete)
|
||||
- [x] `apps/ai-worker/src/process-scorecard.ts`: avalia contra TODOS os
|
||||
scorecards habilitados do tenant (uma `QualityEvaluation` por
|
||||
scorecard, não só o primeiro), prompt montado dinamicamente a
|
||||
partir dos itens de cada um, JSON Schema
|
||||
(`QUALITY_EVALUATION_JSON_SCHEMA`) só define a FORMA da resposta
|
||||
(score + mapa de criterionScores) já que as chaves variam por
|
||||
scorecard; nunca guarda chain-of-thought (secao 118, explícito),
|
||||
redige dados sensíveis sempre antes de sair pro provider
|
||||
- [x] Encadeado a partir de `process-transcription.ts`, junto com
|
||||
ANALYSIS: mesma decisão de privacidade + exige pelo menos 1
|
||||
scorecard habilitado (senão nem cria o job)
|
||||
- [x] `GET /reports/ai-dashboard` (secao 119): chamadas analisadas, score
|
||||
médio (2 conceitos diferentes — `avgQualityScore` de
|
||||
`CallAIAnalysis` e `avgScorecardScore` de `QualityEvaluation`, a
|
||||
especificação não distingue os dois), sentimento, principais
|
||||
assuntos/objeções, compliance alerts, ranking de agentes
|
||||
- [x] Testado ponta a ponta contra o `b2bcall-ai-worker` real e Postgres
|
||||
real com RLS: scorecard real com 2 critérios criado via API,
|
||||
`processScorecardJob` montou o prompt a partir dos itens reais,
|
||||
resolveu provider, redigiu o texto, tentou rede real (loopback
|
||||
fechado), falhou como esperado; job `SCORECARD_EVALUATION` real
|
||||
reservado via SKIP LOCKED, retry+dead-letter corretos; endpoints
|
||||
novos confirmados no ar (401 sem token, não 404)
|
||||
- [ ] **Nunca exercitado**: chamada de rede real contra OpenAI/Anthropic
|
||||
(mesma restrição de todo o módulo de IA); uma `QualityEvaluation`
|
||||
completando de verdade (só via dead-letter, sem rede real)
|
||||
|
||||
## PHASE 22+ — ver `agente.md` seções 120 em diante (Usage Metering
|
||||
completo, Billing, Frontend, Security, Tests)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user