Setup — Backend
Pré-requisitos
Variáveis de ambiente
Crie o arquivo backend/.env com base nas variáveis abaixo:
Servidor
| Variável |
Descrição |
Exemplo |
PORT |
Porta HTTP da API |
3001 |
CORS_ORIGIN |
Origem permitida pelo CORS |
http://localhost:5173 |
API_KEY |
Chave de API opcional |
— |
RATE_LIMIT_PER_MINUTE |
Limite de requisições por minuto (0 desativa) |
0 |
Banco de dados (MySQL)
| Variável |
Descrição |
Exemplo |
DB_HOST |
Host do MySQL |
localhost |
DB_PORT |
Porta do MySQL |
3306 |
DB_USER |
Usuário do banco |
root |
DB_PASS |
Senha do banco |
senha |
DB_SCHEMA |
Nome do schema/database |
oracle |
DB_SSL_REJECT_UNAUTHORIZED |
Ativa SSL na conexão MySQL e valida o certificado do servidor (setar sozinho já liga SSL, mesmo sem DB_SSL_CA) |
— |
DB_SSL_CA |
Caminho de um certificado CA para validar o servidor MySQL (se ele não usar CA público) |
./certs/rds-ca.pem |
Qdrant (busca vetorial)
| Variável |
Descrição |
Exemplo |
QDRANT_URL |
URL do Qdrant |
http://localhost:6333 |
QDRANT_COLLECTION |
Nome da collection (default no código: oraculo_docs) |
empresa_docs |
QDRANT_API_KEY |
Chave de API do Qdrant (opcional) |
— |
Ollama (LLM local)
| Variável |
Descrição |
Exemplo |
OLLAMA_URL |
URL do Ollama |
http://localhost:11434 |
OLLAMA_EMBEDDINGS_MODEL |
Modelo para embeddings |
nomic-embed-text |
OLLAMA_CHAT_MODEL |
Modelo para chat |
llama3.1 |
OLLAMA_VISION_MODEL |
Modelo de visão (default llava:latest) |
llava:latest |
OLLAMA_ATENDENTE_MODEL |
Modelo usado na sugestão de resposta ao atendente (default star-atendente) |
llama3.1 |
OLLAMA_TIMEOUT_MS |
Timeout (ms) para chamadas não-streaming ao Ollama (default 180000) |
180000 |
OLLAMA_STREAM_IDLE_TIMEOUT_MS |
Timeout (ms) de inatividade no streaming do chat — reinicia a cada chunk recebido (default 60000) |
60000 |
OLLAMA_EMBED_QUERY_PREFIX |
Prefixo prependado à query antes de gerar embedding (modelos assimétricos, ex.: e5) |
— |
OLLAMA_EMBED_PASSAGE_PREFIX |
Prefixo prependado à passagem indexada antes de gerar embedding |
— |
RAG
Contexto do pipeline (rewrite, HyDE, rerank) em architecture.md.
| Variável |
Descrição |
Exemplo |
RAG_QUERY_REWRITE |
Reescrever query antes da busca, considerando o histórico da conversa (resolve follow-ups tipo "e o segundo caso?") |
true |
RAG_HISTORY_LIMIT |
Quantidade de mensagens recentes do histórico incluídas no prompt de rewrite/chat (default 6) |
6 |
RAG_TOP_K |
Número de chunks recuperados (default 8) |
8 |
RAG_MIN_SCORE |
Score mínimo de similaridade (default 0.40) |
0.40 |
RAG_CHUNK_SIZE |
Tamanho de cada chunk (caracteres) |
900 |
RAG_CHUNK_OVERLAP |
Sobreposição entre chunks |
150 |
RAG_RERANK |
Reordenar os chunks recuperados por relevância via LLM antes de montar o contexto |
true |
RAG_RERANK_TOP_N |
Quantos chunks manter após o reranking (default = RAG_TOP_K) |
8 |
RAG_HYDE |
HyDE: gera um trecho hipotético de resposta via LLM e usa ele para o embedding de busca (custa uma chamada LLM extra por pergunta) |
false |
LLM (parâmetros de geração)
| Variável |
Descrição |
Exemplo |
LLM_TEMPERATURE |
Criatividade das respostas (0–1); baixo = mais fiel à fonte (default 0.2) |
0.2 |
LLM_TOP_P |
Nucleus sampling |
0.9 |
LLM_NUM_PREDICT |
Máximo de tokens gerados |
2048 |
LLM_REPEAT_PENALTY |
Penalidade de repetição |
1.1 |
Autenticação (JWT)
Fluxo completo e níveis de acesso em auth.md.
| Variável |
Descrição |
Exemplo |
AUTH_MODE |
Modo de auth (jwt ou none) |
jwt |
JWT_SECRET |
Chave secreta para assinar tokens |
trocar-em-producao |
JWT_ISSUER |
Issuer do token |
oraculo-api |
JWT_ACCESS_TTL_SECONDS |
Duração do access token em segundos |
900 (15 min) |
JWT_REFRESH_TTL_SECONDS |
Duração do refresh token em segundos |
2592000 (30 dias) |
JWT_REFRESH_TTL_SHORT_SECONDS |
Duração do refresh token quando rememberMe=false/ausente no login |
86400 (1 dia) |
Atenção: AUTH_MODE=none desativa a autenticação completamente. Nunca usar em produção.
Ifbot (sincronização de atendimentos)
| Variável |
Descrição |
Exemplo |
IFBOT_BASE_URL |
URL base da API do ifbot (default https://star.ifbot.com.br/api) |
https://star.ifbot.com.br/api |
IFBOT_TOKEN |
Token de autenticação da API do ifbot |
— |
IFBOT_AUTH_HEADER |
Nome do header de autenticação (default Authorization) |
Authorization |
IFBOT_MEDIA_BASE_URL |
Base pública dos arquivos de mídia (/data/img, /data/aud); default é IFBOT_BASE_URL sem o sufixo /api |
https://star.ifbot.com.br |
ATENDIMENTOS_SYNC_INTERVAL_MINUTES |
Intervalo (min) do job de sincronização de atendimentos (0 desativa) |
30 |
RAG de atendimentos
Ingestão de conversas no Qdrant, em uma collection separada da de documentos.
| Variável |
Descrição |
Exemplo |
ATENDIMENTOS_RAG_SEARCH_ENABLED |
Habilita a busca vetorial no modo "atendimentos" do chat |
false |
ATENDIMENTOS_RAG_COLLECTION |
Nome da collection no Qdrant |
atendimentos_rag |
ATENDIMENTOS_RAG_INTERVAL_MINUTES |
Intervalo (min) do job de ingestão |
60 |
ATENDIMENTOS_RAG_BATCH |
Tamanho do lote por execução |
10 |
ATENDIMENTOS_RAG_CHUNK_SIZE |
Tamanho de cada chunk (caracteres) |
1800 |
ATENDIMENTOS_RAG_CHUNK_OVERLAP |
Sobreposição entre chunks |
200 |
ATENDIMENTOS_RAG_TOP_K |
Número de chunks recuperados |
20 |
ATENDIMENTOS_RAG_MIN_SCORE |
Score mínimo de similaridade |
0.5 |
ATENDIMENTOS_RAG_HYDE |
HyDE aplicado à busca de atendimentos |
false |
WhatsApp Cloud API (Meta)
Usada pelo chat de Atendimentos (/api/conversas) e pelo webhook em /webhooks/whatsapp (fora de /api, sem JWT — protegido por hub.verify_token na verificação e, opcionalmente, assinatura HMAC no recebimento). Valores vêm do painel da Meta (developers.facebook.com/apps/<seu-app>/whatsapp-business/wa-dev-console/).
| Variável |
Descrição |
Exemplo |
WHATSAPP_API_VERSION |
Versão da API (default v21.0) |
v25.0 |
WHATSAPP_PHONE_NUMBER_ID |
ID do número, aba "API Setup" |
— |
WHATSAPP_TOKEN |
Token de acesso, aba "API Setup" (o temporário expira em 24h; gerar um permanente em System Users antes de produção) |
— |
WHATSAPP_VERIFY_TOKEN |
Valor arbitrário definido por você; colar o mesmo valor no painel da Meta em Webhook → "Verify token" |
— |
WHATSAPP_APP_SECRET |
Aba "App settings → Basic", campo "App Secret"; valida a assinatura X-Hub-Signature-256 (vazio desativa a validação) |
— |
WHATSAPP_BUSINESS_ACCOUNT_ID |
Opcional, não usado ainda; reservado para gestão de templates/perfil de negócio |
— |
Integrador IXC (Alfred)
Usadas só pelo seed (npm run seed:run), que provisiona a linha na tabela integracao. Em runtime o service lê Url/Login/Senha/Token do banco, não do .env (o token sobrevive a restart). Rodar o seed de novo com Login/Senha diferentes força um novo login e invalida o token cacheado.
| Variável |
Descrição |
Exemplo |
IXC_INTEGRADOR_BASE_URL |
URL base do integrador |
http://localhost:4001/ |
IXC_INTEGRADOR_LOGIN |
Login do integrador |
— |
IXC_INTEGRADOR_SENHA |
Senha do integrador |
— |
Whisper (transcrição de áudio local)
Fallback usado quando o ifbot não traz a transcrição do áudio. Requer brew install whisper-cpp ffmpeg e o modelo baixado em WHISPER_MODEL_PATH.
| Variável |
Descrição |
Exemplo |
WHISPER_TRANSCRICAO_ENABLED |
Liga a feature (default false) |
true |
WHISPER_BINARY_PATH |
Caminho do binário whisper-cli (default whisper-cli) |
whisper-cli |
WHISPER_FFMPEG_PATH |
Caminho do binário ffmpeg (default ffmpeg) |
ffmpeg |
WHISPER_MODEL_PATH |
Caminho do modelo Whisper |
whisper_models/ggml-small.bin |
WHISPER_VAD_MODEL_PATH |
Caminho do modelo VAD (detecção de voz) |
whisper_models/ggml-silero-vad.bin |
WHISPER_TIMEOUT_MS |
Timeout (ms) da transcrição (default 60000) |
60000 |
Rodando localmente
# Criar as tabelas no banco (rodar uma vez ou após novas migrations)
npm run migrate:latest
# Modo desenvolvimento (hot reload)
npm run dev
# Modo produção
npm start
A API estará disponível em http://localhost:3001.
Para verificar o status dos serviços:
GET http://localhost:3001/health
Comandos disponíveis
| Comando |
Descrição |
npm run dev |
Inicia com hot reload (node --watch) |
npm start |
Inicia sem hot reload |
npm run migrate:latest |
Aplica todas as migrations pendentes |
npm run migrate:rollback |
Reverte a última migration |
npm run seed:run |
Executa os seeds do banco |