A Hyre é um monorepo com API Python, aplicação web Next.js e aplicativo Expo, implantado com Docker Compose. A versão 1 recebe mensagens do WhatsApp pela Evolution API e as processa no motor de agentes. A versão 2 mantém a mesma base técnica e substitui o motor de agentes por um chat com roteamento entre modelos, ledger de crédito, cofre de credenciais e um executor de tarefas separado da API.
- Frontend
- Next.js 16 com React 19, TypeScript, TanStack Query, Axios e next-intl, com painéis separados para o operador da plataforma (owner) e para o cliente (tenant). Na versão 2, a renovação de sessão compara sessão, usuário, empresa e versão de autenticação antes de reaproveitar uma resposta, e o chat consome eventos SSE (meta, delta, escalate, usage, done). Aplicativo Expo com token em SecureStore e bibliotecas de sessão compartilhadas com a web.
- API
- FastAPI com SQLAlchemy 2 assíncrono e asyncpg, migrations Alembic, autenticação JWT com PyJWT (identificador por token e revogação no Redis), hash bcrypt na autenticação, limitação de taxa com slowapi, middleware de auditoria e Sentry. Na versão 1, o motor de agentes aplica limites do plano, horário de atendimento, temas bloqueados, detecção de irritação com transferência para humano e uma hierarquia de prioridade entre agentes para o mesmo contato.
- Isolamento por cliente
- Row Level Security no PostgreSQL com o cliente (tenant) fixado no contexto de cada transação, para não vazar contexto entre requisições que reutilizam a conexão do pool. Na versão 1 a proteção era incremental (a sessão nascia com bypass ligado e só os endpoints de tenant o desligavam). Na versão 2 o bypass nasce desligado em toda transação, as tabelas novas usam FORCE ROW LEVEL SECURITY e a travessia entre tenants exige chamada explícita após autorizar o operador.
- Credenciais
- Versão 1: chaves de provedores, WhatsApp e pagamentos cifradas em repouso com Fernet na fronteira do ORM, com chave mestra separada do banco. Versão 2: cofre com AES-GCM, chaves versionadas por identificador e dados associados que amarram cada segredo a tenant, usuário, registro e versão; sem fallback para texto puro. Um filtro de redação remove credenciais conhecidas e padrões comuns de chaves de entradas, saídas de modelo e logs.
- Processamento assíncrono
- Na versão 1, as rotinas periódicas (atualização de CRM, follow-up, alertas e mensagens agendadas) rodam como tarefas assíncronas dentro do processo da API, e a memória do contato é atualizada em background. Na versão 2, tarefas longas vão para uma fila no PostgreSQL consumida por um executor separado com SELECT FOR UPDATE SKIP LOCKED, uma tarefa por vez por usuário, cotas por hora e por dia e sem nova tentativa automática após o despacho.
- Modelos de IA
- Versão 1: modelo configurável por agente e por tarefa, com cadeia de fallback e provedores OpenAI, Anthropic, Google e Groq, transcrição de áudio e repetição com backoff exponencial para 429 e 5xx. Versão 2: cliente de streaming próprio, sem SDK, com três dialetos (compatível com OpenAI, Anthropic e Google) cobrindo OpenAI, xAI, Anthropic, Gemini e modelos próprios hospedados em endpoint compatível; roteamento híbrido decide o modelo antes da resposta quando a confiança é alta e reavalia depois quando é média.
- Cobrança
- Stripe com verificação de assinatura dos webhooks e idempotência por INSERT com chave única. Na versão 2, crédito pré-pago em centavos inteiros, ledger append-only protegido por trigger, conferência do saldo a cada lançamento, reserva do pior caso antes de chamar o provedor e liquidação pelo preço cotado na reserva.
- Infraestrutura e qualidade
- Docker Compose com PostgreSQL 16, Redis 7 com persistência, API e web publicadas apenas no loopback atrás do Nginx; Evolution API em compose próprio na versão 1. CI em GitHub Actions com testes offline Python, testes Node de web e mobile, upgrade completo de migrations em banco vazio, testes de RLS e triggers com papel sem superusuário, lint, build e auditoria de dependências.