Voltar ao Portfolio
Optimus PlatformUser Interface

Frontend Apps

Duas aplicações Vue.js 3 especializadas: Admin Dashboard para operadores de cada tenant e SuperAdmin Panel para gestão global da plataforma. WebSocket real-time, gestão de handover, e interfaces responsivas.

Vue.js 3Tailwind CSSWebSocketReal-timeMulti-tenantRBAC

Arquitetura: 2 Apps, 2 Propósitos

┌─────────────────────────────────────────────────────────────────────────┐
│                      Frontend Architecture                               │
└─────────────────────────────────────────────────────────────────────────┘

                    ┌─────────────────────────────────────┐
                    │          Docker Container           │
                    │         (frontend service)          │
                    └─────────────────────────────────────┘
                                    │
                    ┌───────────────┴───────────────┐
                    │                               │
            ┌───────▼───────┐               ┌──────▼───────┐
            │  Admin App    │               │ SuperAdmin   │
            │  Port 3000    │               │  Port 3001   │
            └───────────────┘               └──────────────┘
                    │                               │
    ┌───────────────┼───────────────┐              │
    │               │               │              │
┌───▼───┐     ┌─────▼─────┐  ┌──────▼──────┐  ┌───▼────────────┐
│ Chat  │     │ Handover  │  │  Analytics  │  │  Tenant Mgmt   │
│ UI    │     │ Manager   │  │  Dashboard  │  │  Global Config │
└───────┘     └───────────┘  └─────────────┘  └────────────────┘

┌─────────────────────────────────────────────────────────────────────────┐
│  RBAC (Role-Based Access Control)                                       │
├─────────────────────────────────────────────────────────────────────────┤
│  admin → Acesso ao Admin App (3000) do seu tenant                  │
│  superadmin → Acesso ao SuperAdmin (3001) + todos os tenants            │
└─────────────────────────────────────────────────────────────────────────┘
🖥️

Admin Dashboard

Port 3000

Interface para operadores e administradores de cada tenant. Foco em atendimento ao cliente e gestão do dia-a-dia.

Features:

  • 💬Chat em tempo real com clientes (WebSocket)
  • Gestão de handover (timer auto-return 30min)
  • 📊Dashboard de métricas do tenant
  • 👥Lista de conversas ativas
  • 📋Histórico de atendimentos
  • 🔔Notificações de novas mensagens
👑

SuperAdmin Panel

Port 3001

Interface para gestão global da plataforma. Configuração, provisionamento de tenants, e monitoramento.

Features:

  • 🏢Gerenciamento de tenants (CRUD)
  • Provisionamento de novos tenants
  • 📝Configuração de prompts por tenant
  • 🔑LLM Pools & Key Groups management
  • 🚦Preflight panel (health checks)
  • ⚙️System defaults (global configs)

💬 Chat Real-time com WebSocket

A interface de chat usa WebSocket para atualizações em tempo real. Quando uma nova mensagem chega (WhatsApp, web, etc.), o operador vê instantaneamente sem refresh.

Fluxo WebSocket

// Frontend connects to WebSocket
const ws = new WebSocket(
  'wss://api.webotify.io/api/conversations/ws'
);

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  
  switch(data.type) {
    case 'new_message':
      // Add message to conversation
      conversations.addMessage(data.payload);
      break;
      
    case 'conversation_updated':
      // Update conversation status
      conversations.update(data.payload);
      break;
      
    case 'handover_started':
      // Show handover timer
      handover.start(data.payload);
      break;
  }
};

Eventos Suportados

new_message
Nova mensagem na conversa
conversation_updated
Status ou metadata alterados
handover_started
Operador assumiu conversa
handover_ended
Conversa retornou para IA
typing
Cliente está digitando

⏰ Handover Management

Quando um operador assume uma conversa (handover), a UI mostra um timer de 30 minutos. Se não houver interação, a conversa retorna automaticamente para a IA.

🤖

1. IA Atendendo

Estado normal. IA responde automaticamente. Operador pode visualizar mas não intervém.

👤

2. Handover Ativo

Operador assumiu. Timer de 30 min visível. IA pausa, mensagens vão direto pro operador.

3. Timer Expira

Sem ação em 30min → auto-return para IA. Operador é notificado antes (warning em 5min).

Timer UI Component

<template>
  <div class="handover-timer" :class="timerClass">
    <div class="timer-display">
      {{ formattedTime }}
    </div>
    <div class="timer-label">
      {{ isWarning ? 'Retorno em breve!' : 'Tempo restante' }}
    </div>
    <button @click="extendHandover" v-if="canExtend">
      Estender +15min
    </button>
  </div>
</template>

<script setup>
const props = defineProps(['handoverStartedAt', 'durationMinutes']);

const remainingSeconds = computed(() => {
  const elapsed = Date.now() - props.handoverStartedAt;
  return Math.max(0, props.durationMinutes * 60 - elapsed / 1000);
});

const isWarning = computed(() => remainingSeconds.value < 300); // 5min
const timerClass = computed(() => isWarning.value ? 'warning' : 'normal');
</script>

👑 SuperAdmin: Gestão Global

🏢 Gestão de Tenants

  • Lista de tenants com status, vertical, e última atividade
  • Criar tenant via wizard (escolhe vertical, configura identity)
  • Editar tenant (nome, timezone, locale, features)
  • Desativar/Deletar com confirmação e soft-delete

📝 Configuração de Prompts

  • System prompt customizado por tenant
  • Greeting message (primeira mensagem da IA)
  • Intent classification prompt
  • Handover context (resumo para operador)
  • Variables override (assistant_name, rules, etc.)

🔑 LLM Pools & Keys

  • Pools globais (chat, tools, embeddings)
  • Key Groups com múltiplas API keys
  • Reveal protegido (só superadmin vê keys)
  • Health status de cada key/pool

🚦 Preflight Panel

  • OK - Todas configs válidas
  • Warning - Usando defaults genéricos
  • Critical - Falta assistant_name ou template vazio
  • Source badges - Seeded vs Override vs Default

📊 Dashboard Multi-tenant

O Admin Dashboard mostra métricas específicas do tenant logado. Conversas ativas, tempo médio de resposta, handovers, e mais.

247
Conversas Hoje
12
Ativas Agora
3
Em Handover
1.2s
Tempo Resposta

Lista de Conversas

JM
João Maria
+55 11 99999-9999
Última msg: 2min
IA Respondendo
AS
Ana Silva
+55 21 88888-8888
Handover: 12min
Operador: Carlos

Stack Técnico

Framework

Vue.js 3 (Composition API)

Styling

Tailwind CSS

State

Pinia (Vue Store)

Real-time

WebSocket

Router

Vue Router 4

HTTP

Axios / Fetch API

Build

Vite

Container

Docker (2 ports)

Integração com Backend

REST APIs
GET /api/conversations
POST /api/chat
GET /api/tenant-configs/{id}
PUT /api/prompts/override/{tenant}/{prompt}
WebSocket
wss://api.webotify.io/api/conversations/ws
Events: new_message, handover_*, typing
Auth: JWT token in connection params

Resultados

<100ms
Latência WebSocket
Mensagens em tempo real
2
Apps Especializadas
Admin + SuperAdmin
RBAC
Controle de Acesso
admin vs superadmin
30min
Auto-return Handover
Timer configurável

Explore Outros Case Studies

Veja como outros componentes do Optimus foram construídos