.env.example 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # Ambiente. Só "development" expõe a mensagem de erros 500 (mysql2, Ollama...) na resposta
  2. # HTTP; qualquer outro valor (ou vazio) responde "internal_error". "production" também
  3. # bloqueia o WHATSAPP_WEBHOOK_SKIP_SIGNATURE.
  4. NODE_ENV=development
  5. # Servidor (valores abaixo já são o padrão do código — só setar para sobrescrever)
  6. # PORT=3001
  7. # CORS_ORIGIN=http://localhost:5173
  8. # Atrás de proxy reverso (nginx, etc.): número de saltos confiáveis (ex.: 1). Sem isso o
  9. # rate limit e o bloqueio de login veem o IP do proxy para todo mundo. Padrão: desligado.
  10. # TRUST_PROXY=1
  11. # Timeout padrão (ms) de chamadas HTTP de saída (WhatsApp, download de áudio do ifbot...)
  12. # HTTP_DEFAULT_TIMEOUT_MS=15000
  13. # Autenticação. AUTH_MODE=jwt precisa ficar explícito: o padrão do código é "none"
  14. # (sem autenticação nenhuma) — não deixar essa linha comentada em produção.
  15. AUTH_MODE=jwt
  16. JWT_SECRET=coloque-um-segredo-longo-e-aleatorio-aqui
  17. # JWT_ISSUER=oraculo-api
  18. # JWT_ACCESS_TTL_SECONDS=900
  19. # JWT_REFRESH_TTL_SECONDS=2592000
  20. # TTL do refresh token quando rememberMe=false/ausente no login (default 1 dia, já é o padrão do código).
  21. # JWT_REFRESH_TTL_SHORT_SECONDS=86400
  22. # API Key alternativa (opcional, deixar vazio/comentado para usar só JWT)
  23. # API_KEY=
  24. # Banco de dados MySQL
  25. DB_HOST=localhost
  26. DB_PORT=3306
  27. DB_USER=usuario
  28. DB_PASS=senha
  29. DB_SCHEMA=oraculo
  30. # SSL para conexão MySQL (recomendado em produção). Deixe ambos vazios para desativar
  31. # SSL (comportamento padrão em dev local). DB_SSL_REJECT_UNAUTHORIZED=true valida o
  32. # certificado do servidor; DB_SSL_CA aponta para um arquivo de certificado CA (ex.:
  33. # ./certs/rds-ca.pem) se o servidor usar um certificado não confiável publicamente.
  34. DB_SSL_REJECT_UNAUTHORIZED=true
  35. DB_SSL_CA=
  36. # Qdrant (vector DB) — valores abaixo já são o padrão do código
  37. # QDRANT_URL=http://localhost:6333
  38. # QDRANT_COLLECTION=oraculo_docs
  39. # QDRANT_TIMEOUT_MS=120000
  40. QDRANT_API_KEY=
  41. # Ollama — valores abaixo já são o padrão do código
  42. # OLLAMA_URL=http://localhost:11434
  43. # OLLAMA_EMBEDDINGS_MODEL=nomic-embed-text
  44. # OLLAMA_CHAT_MODEL=llama3.1
  45. # OLLAMA_VISION_MODEL=llava:latest
  46. # Modelo usado na sugestão de resposta ao atendente (ConversasWhatsapp). Default
  47. # já é "star-atendente" no código mesmo sem essa variável — só setar se publicar
  48. # o modelo fine-tuned com outro nome no Ollama.
  49. # OLLAMA_ATENDENTE_MODEL=star-atendente
  50. # Modelo usado como juiz na avaliação de atendimentos; vazio = OLLAMA_CHAT_MODEL.
  51. # OLLAMA_JUDGE_MODEL=
  52. # Timeout (ms) para chamadas não-streaming ao Ollama (chat/embeddings) — já é o padrão do
  53. # código. Sem esse limite, uma chamada travada (modelo sobrecarregado, processo do Ollama
  54. # pendurado) nunca resolve nem rejeita — trava indefinidamente locks como o de avaliação
  55. # em lote de atendimentos. Só sobrescrever se precisar de um valor diferente.
  56. # OLLAMA_TIMEOUT_MS=180000
  57. # Timeout de inatividade (ms) para o streaming do chat (chatCompletionStream) — já é o
  58. # padrão do código. Diferente do OLLAMA_TIMEOUT_MS (que limita o total de uma chamada
  59. # não-streaming), este reinicia a cada chunk recebido — só dispara se o Ollama parar de
  60. # mandar bytes no meio de uma resposta, o que antes deixava a UI presa em "Gerando
  61. # resposta..." para sempre.
  62. # OLLAMA_STREAM_IDLE_TIMEOUT_MS=60000
  63. # Prefixos opcionais prependados ao texto antes de gerar embedding (útil para modelos
  64. # assimétricos que recomendam prefixo diferente para query de busca e passagem indexada,
  65. # ex.: "search_query: "/"search_document: " no nomic-embed-text, "query: "/"passage: " em
  66. # modelos da família e5). Vazio (padrão) = modelo não recebe prefixo. Validar empiricamente
  67. # com backend/scripts/evalRetrieval.mjs antes de habilitar em produção.
  68. # OLLAMA_EMBED_QUERY_PREFIX=
  69. # OLLAMA_EMBED_PASSAGE_PREFIX=
  70. # RAG — valores abaixo já são o padrão do código
  71. # RAG_TOP_K=8
  72. # RAG_CHUNK_SIZE=900
  73. # RAG_CHUNK_OVERLAP=150
  74. # Quantidade de mensagens recentes do histórico incluídas no prompt de rewrite/chat (já é o padrão do código).
  75. # RAG_HISTORY_LIMIT=6
  76. # Rate limiting por IP (0 = desativado). Recomendado manter >0 em produção — sem isso
  77. # o middleware de rate limit vira um no-op e o /api fica sem proteção contra abuso.
  78. RATE_LIMIT_PER_MINUTE=60
  79. # Ajuste fino das respostas do LLM — valores abaixo já são o padrão do código, exceto
  80. # LLM_NUM_PREDICT (padrão real: 4096; aqui reduzido para respostas mais curtas/rápidas).
  81. # LLM_TEMPERATURE=0.2
  82. # LLM_TOP_P=0.9
  83. LLM_NUM_PREDICT=2048
  84. # LLM_REPEAT_PENALTY=1.1
  85. # Janela de contexto (tokens) do chat e do modo atendimentos (prompts bem maiores)
  86. # LLM_NUM_CTX=8192
  87. # LLM_ATENDIMENTOS_NUM_CTX=32768
  88. # Limite de tokens das chamadas auxiliares (rewrite, HyDE, rerank, roteamento)
  89. # LLM_AUX_NUM_PREDICT=400
  90. # RAG avançado — valores abaixo já são o padrão do código (tudo desligado)
  91. # RAG_QUERY_REWRITE=false
  92. # RAG_MIN_SCORE=0.40
  93. # RAG_RERANK=false
  94. # RAG_RERANK_TOP_N=8
  95. # HyDE (Hypothetical Document Embeddings): gera um trecho hipotético de resposta via LLM
  96. # e usa ele (em vez da query crua) para o embedding de busca, o que tende a elevar o score
  97. # de similaridade porque vira matching passagem-passagem. Custa uma chamada LLM extra por
  98. # pergunta. Desligado por padrão no código. Validar com backend/scripts/evalRetrieval.mjs
  99. # antes de habilitar em produção.
  100. # RAG_HYDE=false
  101. # Chatbot ifbot (sincronização de atendimentos) — URL e intervalo abaixo já são o padrão do código
  102. # IFBOT_BASE_URL=https://star.ifbot.com.br/api
  103. IFBOT_TOKEN=
  104. # IFBOT_AUTH_HEADER=Authorization
  105. # base pública dos arquivos de mídia (/data/img, /data/aud); padrão: IFBOT_BASE_URL sem o sufixo /api
  106. # IFBOT_MEDIA_BASE_URL=https://star.ifbot.com.br
  107. # ATENDIMENTOS_SYNC_INTERVAL_MINUTES=30
  108. # RAG de atendimentos (ingestão de conversas no Qdrant, coleção separada da de documentos)
  109. # ATENDIMENTOS_RAG_COLLECTION=atendimentos_rag
  110. # ATENDIMENTOS_RAG_INTERVAL_MINUTES=60
  111. # ATENDIMENTOS_RAG_BATCH=10
  112. # ATENDIMENTOS_RAG_CHUNK_SIZE=1800
  113. # ATENDIMENTOS_RAG_CHUNK_OVERLAP=200
  114. # ATENDIMENTOS_RAG_TOP_K=20
  115. # ATENDIMENTOS_RAG_MIN_SCORE=0.5
  116. # habilita a busca vetorial no modo "atendimentos" do chat — deixar false até calibrar
  117. # ATENDIMENTOS_RAG_MIN_SCORE com perguntas reais após o backfill inicial
  118. # ATENDIMENTOS_RAG_SEARCH_ENABLED=false
  119. # HyDE e rerank na busca do modo atendimentos (rerank ligado por padrão)
  120. # ATENDIMENTOS_RAG_HYDE=false
  121. # ATENDIMENTOS_RAG_RERANK=true
  122. # ATENDIMENTOS_RAG_RERANK_TOP_N=10
  123. # Sugestão de resposta ao atendente (ConversasWhatsapp) — valores abaixo já são o padrão do código
  124. # ATENDENTE_SUGESTAO_HISTORY_LIMIT=20
  125. # ATENDENTE_SUGESTAO_MAX_CHARS=8000
  126. # ATENDENTE_SUGESTAO_GUARDRAIL=true
  127. # ATENDENTE_SUGESTAO_RAG_ENABLED=true
  128. # "nenhum" (padrão), "avaliacao" (resumos de avaliações) ou "conversa" (trechos anonimizados)
  129. # ATENDENTE_SUGESTAO_RAG_TIPO=nenhum
  130. # ATENDENTE_SUGESTAO_RAG_TOP_K=3
  131. # ATENDENTE_SUGESTAO_RAG_MIN_SCORE=0.5
  132. # ATENDENTE_SUGESTAO_RAG_MAX_CHARS_POR_HIT=600
  133. # ATENDENTE_SUGESTAO_RAG_MAX_CHARS_POR_HIT_CONVERSA=900
  134. # WhatsApp Cloud API (Meta) — usada pelo chat de Atendimentos (/api/conversas) e pelo
  135. # webhook em /webhooks/whatsapp (fora de /api, sem JWT — protegido por hub.verify_token
  136. # na verificação e, opcionalmente, assinatura HMAC no recebimento).
  137. #
  138. # Valores vêm do painel da Meta (developers.facebook.com/apps/<seu-app>/whatsapp-business/wa-dev-console/):
  139. # - WHATSAPP_PHONE_NUMBER_ID e WHATSAPP_TOKEN: aba "API Setup" (o token temporário expira
  140. # em 24h; gere um token permanente em System Users antes de ir pra produção)
  141. # - WHATSAPP_VERIFY_TOKEN: valor arbitrário definido por você — cole o mesmo valor no
  142. # painel da Meta em WhatsApp → Configuration → Webhook → "Verify token"
  143. # - WHATSAPP_APP_SECRET: aba "App settings → Basic", campo "App Secret" — valida a
  144. # assinatura X-Hub-Signature-256 dos eventos recebidos. Vazio = o webhook RECUSA todos os
  145. # eventos (401), a menos que WHATSAPP_WEBHOOK_SKIP_SIGNATURE=true e NODE_ENV != production
  146. # (só para testar localmente sem o App Secret)
  147. # - WHATSAPP_BUSINESS_ACCOUNT_ID (opcional, não usado ainda): mesma tela do API Setup,
  148. # reservado para gestão de templates/perfil de negócio no futuro
  149. # WHATSAPP_API_VERSION já é o padrão do código
  150. # WHATSAPP_API_VERSION=v21.0
  151. WHATSAPP_PHONE_NUMBER_ID=
  152. WHATSAPP_TOKEN=
  153. WHATSAPP_VERIFY_TOKEN=
  154. WHATSAPP_APP_SECRET=
  155. # WHATSAPP_WEBHOOK_SKIP_SIGNATURE=false
  156. # WHATSAPP_BUSINESS_ACCOUNT_ID=
  157. # Integrador IXC (Alfred) — usadas só pelo seed (npm run seed:run), que provisiona a
  158. # linha na tabela "integracao". Em runtime o service lê Url/Login/Senha/Token do banco,
  159. # não daqui (token sobrevive a restart; ver src/functions/atualizaTokenIxcIntegradorERetorna.js).
  160. # Rodar o seed de novo com Login/Senha diferentes força um novo login (invalida o token cacheado).
  161. IXC_INTEGRADOR_BASE_URL=http://localhost:4001/
  162. IXC_INTEGRADOR_LOGIN=
  163. IXC_INTEGRADOR_SENHA=
  164. # ACS Space (TR-069) — API pública /api/v1. Criar a chave no painel do ACS em "Chaves de API" com
  165. # escopos "leitura" + "diagnostico" (sem "escrita": o Oráculo nunca reinicia nem altera a CPE).
  166. # Como o IXC, Url/chave vão para a tabela integracao (Tipo 2) via `npm run seed:run`.
  167. ACS_URL=https://acs.star.psi.br/api/v1/
  168. ACS_API_KEY=
  169. # ACS_TIMEOUT_MS=15000
  170. # ACS_DIAGNOSTICO_PRAZO_MS=30000 # quanto o /acs ping espera antes de responder "pendente" (< 45s do stream no front)
  171. # ACS_DIAGNOSTICO_INTERVALO_MS=10000
  172. # ACS_CONTEXTO_JANELA_HORAS=6 # avaliação só usa o estado da CPE em atendimentos recentes
  173. # Transcrição de áudio via Whisper local (whisper.cpp), usada como fallback quando o
  174. # ifbot não traz Transcricao — requer `brew install whisper-cpp ffmpeg` e o modelo
  175. # baixado em WHISPER_MODEL_PATH. Desligado por padrão no código (false); setar aqui
  176. # como lembrete de que a feature existe e precisa desses binários/modelo instalados.
  177. WHISPER_TRANSCRICAO_ENABLED=false
  178. # WHISPER_BINARY_PATH=whisper-cli
  179. # WHISPER_FFMPEG_PATH=ffmpeg
  180. # WHISPER_MODEL_PATH=whisper_models/ggml-small.bin
  181. # WHISPER_VAD_MODEL_PATH=whisper_models/ggml-silero-vad.bin
  182. # WHISPER_TIMEOUT_MS=60000
  183. # WHISPER_THREADS=4
  184. # Jobs pesados em background (avaliação de atendimentos e ingest RAG de atendimentos).
  185. # Lotes grandes com intervalo curto deixam o Ollama (llama-server) a 100% de GPU por horas
  186. # e travam um Mac de 16GB — prefira lotes pequenos e espaçados para deixar o backend ligado.
  187. # ATENDIMENTOS_AVALIACAO_BATCH=20
  188. # ATENDIMENTOS_AVALIACAO_INTERVAL_MINUTES=30
  189. # Máximo de caracteres da conversa enviados ao juiz
  190. # ATENDIMENTOS_AVALIACAO_MAX_CHARS=12000
  191. # Janela "HH-HH" (fuso de São Paulo) em que esses jobs podem rodar; vazio = sempre.
  192. # Ex.: 19-07 só roda à noite. Disparos manuais pela UI/API ignoram a janela, mas recebem
  193. # 409 se outro job pesado estiver rodando naquele momento.
  194. # JOBS_PESADOS_JANELA=
  195. # Pausa (ms) entre itens do lote, para a máquina e o chat interativo respirarem.
  196. # JOBS_PESADOS_PAUSA_MS=3000
  197. # Descarrega o modelo do Ollama (keep_alive 0) ao fim de cada lote.
  198. # JOBS_PESADOS_DESCARREGAR_AO_FIM=true