O Escalia agrupa automaticamente scripts de criadores de conteúdo por similaridade semântica, detecta duplicatas antes de aprovação e entrega decisões auditáveis — em escala.
Da submissão bruta até a decisão final — tudo rastreável, auditável e reversível.
O criador envia o roteiro via API. O sistema registra no banco e dispara o pipeline de processamento de forma assíncrona.
O texto é limpo, dividido em blocos semânticos e filtrado para remover spam. Blocos de cena, gancho e CTA são identificados separadamente.
Cada bloco e o roteiro completo são transformados em vetores de 1536 dimensões via OpenAI text-embedding-3-small. Resultado armazenado com pgvector.
ANN busca os 20 vizinhos mais próximos. Com similaridade ≥ 82%, o roteiro entra no cluster existente ou cria um novo. Conflitos são sinalizados para revisão.
Identifica scripts semanticamente similares mesmo quando escritos com palavras diferentes. Vai além da comparação textual simples.
Toda decisão — aprovação, rejeição ou revisão — é registrada com evidências de similaridade e usuário responsável.
Métricas por campanha, distribuição de similaridade e pares mais próximos. Visibilidade total sobre o corpus de roteiros.
Compara gancho, desenvolvimento e CTA separadamente. Identifica onde dois roteiros são similares, mesmo que o conjunto seja diferente.
Pipeline via Celery + Redis. A submissão retorna instantaneamente; o processamento acontece em background sem bloquear a requisição.
Controle de acesso por papel: admin, analyst e viewer. Autenticação JWT com expiração configurável.
Cada componente escolhido pela razão certa.
Endpoints limpos, autenticação JWT, respostas paginadas.
# POST /api/v1/submissions
curl -X POST https://escalia.shinp.ai/api/v1/submissions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"campaign_id": "uuid-da-campanha",
"creator_id": "criador-123",
"title": "Roteiro do produto X",
"raw_text": "Você já sentiu que..."
}'
# Resposta 202 — processamento assíncrono
{
"id": "sub_abc123",
"status": "received",
"message": "Script received and queued for processing"
}