# Setup — Backend ## Pré-requisitos - Node.js 18+ (ver `engines.node` no `package.json`) - MySQL 8+ acessível na rede - Qdrant rodando (padrão: `http://localhost:6333`) - Ollama rodando com os modelos necessários: ```bash ollama pull nomic-embed-text ollama pull llama3.1 ``` ## Instalação ```bash cd backend npm install ``` ## 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` | ### 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` | ### RAG | Variável | Descrição | Exemplo | |---|---|---| | `RAG_QUERY_REWRITE` | Reescrever query antes da busca | `true` | | `RAG_HISTORY_TOKEN_BUDGET` | Tokens de histórico enviados ao LLM | `1500` | | `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` | ### 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) | 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) | > **Atenção:** `AUTH_MODE=none` desativa a autenticação completamente. Nunca usar em produção. ## Rodando localmente ```bash # 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 |