# Servidor PORT=3001 CORS_ORIGIN=http://localhost:5173 # Autenticação (jwt ou none) AUTH_MODE=jwt JWT_SECRET=coloque-um-segredo-longo-e-aleatorio-aqui JWT_ISSUER=oraculo-api JWT_ACCESS_TTL_SECONDS=900 JWT_REFRESH_TTL_SECONDS=2592000 # TTL do refresh token quando rememberMe=false/ausente no login (default 1 dia). JWT_REFRESH_TTL_SHORT_SECONDS=86400 # API Key alternativa (opcional, deixar vazio para usar só JWT) API_KEY= # Banco de dados MySQL DB_HOST=localhost DB_PORT=3306 DB_USER=usuario DB_PASS=senha DB_SCHEMA=oraculo # SSL para conexão MySQL (recomendado em produção). Deixe ambos vazios para desativar # SSL (comportamento padrão em dev local). DB_SSL_REJECT_UNAUTHORIZED=true valida o # certificado do servidor; DB_SSL_CA aponta para um arquivo de certificado CA (ex.: # ./certs/rds-ca.pem) se o servidor usar um certificado não confiável publicamente. DB_SSL_REJECT_UNAUTHORIZED=true DB_SSL_CA= # Qdrant (vector DB) QDRANT_URL=http://localhost:6333 QDRANT_COLLECTION=oraculo_docs QDRANT_API_KEY= # Ollama OLLAMA_URL=http://localhost:11434 OLLAMA_EMBEDDINGS_MODEL=nomic-embed-text OLLAMA_CHAT_MODEL=llama3 OLLAMA_VISION_MODEL=llava # Timeout (ms) para chamadas não-streaming ao Ollama (chat/embeddings). Sem isso, uma # chamada travada (modelo sobrecarregado, processo do Ollama pendurado) nunca resolve # nem rejeita — trava indefinidamente locks como o de avaliação em lote de atendimentos. OLLAMA_TIMEOUT_MS=180000 # Prefixos opcionais prependados ao texto antes de gerar embedding (útil para modelos # assimétricos que recomendam prefixo diferente para query de busca e passagem indexada, # ex.: "search_query: "/"search_document: " no nomic-embed-text, "query: "/"passage: " em # modelos da família e5). Deixe vazio se o modelo não precisar. Validar empiricamente com # backend/scripts/evalRetrieval.mjs antes de habilitar em produção. OLLAMA_EMBED_QUERY_PREFIX= OLLAMA_EMBED_PASSAGE_PREFIX= # RAG (valores padrão se não definidos) RAG_TOP_K=8 RAG_CHUNK_SIZE=900 RAG_CHUNK_OVERLAP=150 # Quantidade de mensagens recentes do histórico incluídas no prompt de rewrite/chat. RAG_HISTORY_LIMIT=6 # Rate limiting por IP (0 = desativado). Recomendado manter >0 em produção — sem isso # o middleware de rate limit vira um no-op e o /api fica sem proteção contra abuso. RATE_LIMIT_PER_MINUTE=60 # Ajuste fino das respostas do LLM LLM_TEMPERATURE=0.2 LLM_TOP_P=0.9 LLM_NUM_PREDICT=2048 LLM_REPEAT_PENALTY=1.1 # RAG avançado RAG_QUERY_REWRITE=false RAG_MIN_SCORE=0.40 RAG_RERANK=false RAG_RERANK_TOP_N=8 # HyDE (Hypothetical Document Embeddings): gera um trecho hipotético de resposta via LLM # e usa ele (em vez da query crua) para o embedding de busca, o que tende a elevar o score # de similaridade porque vira matching passagem-passagem. Custa uma chamada LLM extra por # pergunta. Validar com backend/scripts/evalRetrieval.mjs antes de habilitar em produção. RAG_HYDE=false # Chatbot ifbot (sincronização de atendimentos) IFBOT_BASE_URL=https://star.ifbot.com.br/api IFBOT_TOKEN= # IFBOT_AUTH_HEADER=Authorization # base pública dos arquivos de mídia (/data/img, /data/aud); padrão: IFBOT_BASE_URL sem o sufixo /api # IFBOT_MEDIA_BASE_URL=https://star.ifbot.com.br ATENDIMENTOS_SYNC_INTERVAL_MINUTES=30 # RAG de atendimentos (ingestão de conversas no Qdrant, coleção separada da de documentos) # ATENDIMENTOS_RAG_COLLECTION=atendimentos_rag # ATENDIMENTOS_RAG_INTERVAL_MINUTES=60 # ATENDIMENTOS_RAG_BATCH=10 # ATENDIMENTOS_RAG_CHUNK_SIZE=1800 # ATENDIMENTOS_RAG_CHUNK_OVERLAP=200 # ATENDIMENTOS_RAG_TOP_K=20 # ATENDIMENTOS_RAG_MIN_SCORE=0.5 # habilita a busca vetorial no modo "atendimentos" do chat — deixar false até calibrar # ATENDIMENTOS_RAG_MIN_SCORE com perguntas reais após o backfill inicial # ATENDIMENTOS_RAG_SEARCH_ENABLED=false # WhatsApp (Baileys — conexão via QR code, sem token/segredo nenhum). O estado da sessão # fica em backend/data/baileys-session/ (não versionado). Conectar/desconectar pelo painel # admin em /api/whatsapp (status, conectar, desconectar).