APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=error DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=redis FILESYSTEM_DRIVER=local # Recupero file mancanti dagli altri nodi cloud (acceso nodo per nodo; rifare config:cache) FILE_REPLICA_ENABLED=false QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 # Produzione SPA: SESSION_DOMAIN VUOTO (cookie host-only). NON usare .bia-dex.it (ADR-0001). SESSION_DOMAIN= SESSION_SECURE_COOKIE=false # Sanctum SPA stateful domains (comma-separated hosts, no scheme) SANCTUM_STATEFUL_DOMAINS=localhost,localhost:3000,localhost:5173,127.0.0.1,127.0.0.1:8000,test.bia-dex.it,app.bia-dex.it,cloud.bia-dex.it,cloud1.bia-dex.it,cloud2.bia-dex.it,cloud3.bia-dex.it # CORS for first-party SPA (credentials require explicit origins, never *) CORS_ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://localhost:5173,https://test.bia-dex.it,https://app.bia-dex.it CORS_SUPPORTS_CREDENTIALS=true CORS_PATHS=api/*,sanctum/csrf-cookie,login,logout,two-factor-challenge,user/two-factor-challenge,auth/google/callback CORS_ALLOWED_HEADERS=Authorization,Content-Type,Accept,X-Requested-With,X-CSRF-TOKEN,X-XSRF-TOKEN,X-HTTP-Method-Override,Origin,X-BiaOnline-Api-Key MEMCACHED_HOST=127.0.0.1 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" # Casella unica staff assistenza per le email dei ticket (vuota = nessun invio) SUPPORT_EMAIL= AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" # Piani No-BIA e flessibili *-job eseguiti dal worker esterno via /api/ext/worker-diete DIETE_WORKER_ENABLED=false GEMINI_API_KEY= OPENAI_API_KEY= OPENAI_ORGANIZATION= N8N_WEBHOOK_USER= N8N_WEBHOOK_PASS= # Blocchi linee guida per tipo dieta nel prompt AI (true/false) PIANO_LINEE_GUIDA_TIPO_DIETA=false # Catalogo linee guida patologie nel prompt AI (true/false). Richiede anche permesso Spatie patologie-dieta. PIANO_LINEE_GUIDA_PATOLOGIE=false # Abilita RAG su tutta la knowledge admin (piani alimentari + File Search Gemini). Richiede store is_active. GEMINI_KNOWLEDGE_BASE_ENABLED=false # Vincola la generazione diete alla whitelist dei cataloghi in knowledge base (richiede GEMINI_KNOWLEDGE_BASE_ENABLED=true) GEMINI_CATALOGO_ALIMENTI_BLOCCO_ABILITATO=false # GEMINI_CATALOGO_ALIMENTI_RAG_ID=knowledge_catalogo_alimenti_ammessi # Elenco aggiuntivo rag_id catalogo (virgola), unito al RAG_ID legacy sopra # GEMINI_CATALOGO_ALIMENTI_RAG_IDS=knowledge_catalogo_crea,knowledge_catalogo_bda # Riconoscimento automatico cataloghi caricati con document_type catalogo_alimenti # GEMINI_CATALOGO_ALIMENTI_DOCUMENT_TYPE=catalogo_alimenti # Knowledge LARN IV porzioni (forzata con switch Quantità SINU casalinghe su DietaAI) # GEMINI_LARN_PORZIONI_RAG_ID=knowledge_larn_iv_porzioni_standard # GEMINI_LARN_PORZIONI_PATH= # Modello Gemini per File Search + Structured Output GEMINI_FILE_SEARCH_TEST_MODEL=gemini-3.6-flash GEMINI_FILE_SEARCH_EMBEDDING=models/gemini-embedding-001 GEMINI_FILE_SEARCH_CHUNK_TOKENS=450 GEMINI_FILE_SEARCH_CHUNK_OVERLAP=80 GEMINI_FILE_SEARCH_TOP_K=12 # Allega i vault ristretti (cataloghi privati, es. NALKEIN) alla generazione piani. # Default false: gli alimenti scelti entrano nel prompt come schede nutrizionali dal DB. GEMINI_VAULT_RISTRETTI_PIANI=false # Timeout indicizzazione documenti knowledge base (minuti) GEMINI_FILE_SEARCH_INDEX_TIMEOUT=20 # ACube Sistema Tessera Sanitaria # Preferire login JWT (scade ogni 24h): https://docs.acubeapi.com/documentation/common/authentication ACUBE_BASE_URL=https://api-sandbox.acubeapi.com ACUBE_ENVIRONMENT=sandbox ACUBE_LOGIN_URL=https://common.api.acubeapi.com ACUBE_EMAIL= ACUBE_PASSWORD= # Override opzionale (test/emergenza). Se EMAIL+PASSWORD sono settati, vince il login. ACUBE_TOKEN= ACUBE_TIMEOUT=30 ACUBE_CONNECT_TIMEOUT=10 ACUBE_NATURA_IVA_ESENTE=N4 ACUBE_DISPOSITIVO=1 # Webhook inbound (dashboard A-Cube: authentication_type=header) ACUBE_WEBHOOK_TOKEN= ACUBE_WEBHOOK_AUTH_HEADER=Authorization ACUBE_WEBHOOK_AUTH_SCHEME=Bearer # Banche dati da cui pescare i sostituti automatici (ID separati da virgola, vuoto = tutte) PIANO_SOSTITUTI_BANCHE_DATI_IDS= # Metodo sostituti automatici: ai | ai_db | db PIANO_SOSTITUTI_METODO=ai_db # Professionisti minimi che devono aver scelto una sostituzione (le proprie scelte valgono sempre) PIANO_SOSTITUTI_MIN_PROFESSIONISTI=1 # Fonte candidati sostituti: entrambi | professionisti | famiglia PIANO_SOSTITUTI_FONTE=entrambi # Calcolo di default dei sostituti: iso_macro | iso_calorica PIANO_SOSTITUTI_CALCOLO=iso_macro