Spaces:
Running
Running
File size: 6,426 Bytes
70e641d 61cd0db 1339cdc 61cd0db b90d0d2 70e641d 1e215c9 70e641d 6ab7946 1e215c9 70e641d 1e215c9 bf9f7d1 1e215c9 70e641d bf9f7d1 70e641d bf9f7d1 70e641d 61cd0db 1339cdc 61cd0db 1339cdc 61cd0db 5118fc3 70e641d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | # Copia a backend/.env y rellena. NUNCA lo comitees (ver .gitignore).
# En HF Spaces usa los "Secrets" del Space en vez de un archivo.
# --- Entorno ---
MORPHOS_ENTORNO=dev # dev | prod
# --- Orígenes CORS permitidos (lista separada por comas vía JSON en prod) ---
# MORPHOS_ORIGENES_PERMITIDOS=["https://tu-espacio.hf.space"]
# --- Sesión (OBLIGATORIO en prod: >=32 chars) ---
MORPHOS_SESSION_SECRET=
MORPHOS_COOKIE_SECURE=false # true en prod (HTTPS)
# --- Alta de cuentas (CERRADA por defecto) ---
# Una cuenta alcanza /api/interpret, que gasta cuota de ZeroGPU compartida y, por la ruta
# Claude, dinero real: el alta abierta era una autorización de gasto para cualquiera.
#
# IMPORTANTE en un despliegue: si dejas las dos vacías, NADIE puede darse de alta. Con
# `instance/` efímero (HF Spaces) las cuentas desaparecen en cada reinicio, así que sin
# allowlist la instancia se queda sin acceso posible. Pon aquí los emails aprobados.
# Formato: `email` o `email=clinica`. La clínica (tenant) decide qué resultados de analizador
# ve esa cuenta; sin sufijo, la de por defecto ("principal").
# MORPHOS_REGISTRO_ALLOWLIST=vet1@clinica.com,vet2@otra.com=clinica-b
MORPHOS_REGISTRO_ABIERTO=false # true SÓLO en desarrollo local
# --- Base de datos de usuarios (SQLite fuera del webroot) ---
# Por defecto se usa /data/morphos.db si existe un volumen PERSISTENTE ahí (es donde HF Spaces
# monta el almacenamiento contratado); si no, instance/morphos.db, que es EFÍMERO: cada
# reinicio borra cuentas, contraseñas e historial de intentos y todo el mundo se vuelve a
# registrar. Se avisa al arrancar. NO hay soporte de MySQL pese a lo que decía la config vieja.
# MORPHOS_DB_PATH=/data/morphos.db
# --- Ruta IA por defecto ---
MORPHOS_IA_BACKEND_DEFECTO=medgemma # medgemma | claude
# Dentro de la ruta 'medgemma': con MORPHOS_HF_SPACE_URL definida se usa el HF Space (Gradio,
# devuelve PROSA); vaciándola se cae a Ollama, que da salida estructurada y no consume cuota
# de ZeroGPU. Ver "Ruta auto-alojada con Ollama" en el README.
# MORPHOS_HF_SPACE_URL=
MORPHOS_MEDGEMMA_BASE_URL=http://localhost:11434
MORPHOS_MEDGEMMA_MODEL=medgemma:latest
# Modelos locales que el usuario puede ELEGIR en la UI (lista blanca; vacía = selector oculto).
# Formato `nombre[=prosa|=estructurado]`; sin sufijo se asume estructurado. Ponle `=prosa` al
# modelo que acepta el `format` de Ollama pero devuelve los campos estructurados en hueco.
# El modelo elegido recibe el mismo RAG, prompt y suelos de seguridad que el HF Space, y manda
# sobre él. NO hay variable de URL por petición a propósito: la base_url es la de arriba, del
# lado servidor (aceptar una del cliente convertiría /api/interpret en un SSRF). Déjala vacía
# donde no haya un Ollama alcanzable desde el servidor, como el HF Space.
# MORPHOS_MODELOS_LOCALES=medgemma1.5:latest,qwen2.5:7b=prosa
# Claude (ruta híbrida opcional). NO usar claude-fable-5: cuesta el doble, exige retención de
# datos de 30 días y sus clasificadores pueden rechazar trabajo clínico legítimo. Ver el
# comentario en app/config.py.
MORPHOS_ANTHROPIC_API_KEY=
MORPHOS_CLAUDE_MODEL=claude-opus-5
# --- Juez de evals (sin clave de API; sólo lo lee evals/, no el servicio) ---
# Por defecto usa el CLI de Claude Code si está instalado, y si no un modelo local en Ollama.
# MORPHOS_JUEZ_CLI_MODELO=sonnet # modelo del juez CLI (opus para auditorías)
# MORPHOS_JUEZ_MODELO=qwen2.5:7b # modelo del juez local
# MORPHOS_JUEZ_BASE_URL=http://localhost:11434
# Si cada hallazgo lleva su etiqueta de gravedad (leve/moderado/grave) en el prompt. La gravedad
# es un juicio del motor, no un dato de laboratorio, y el modelo es muy sensible a ella. Medido el
# 2026-07-31: quitarla EMPEORA (recall 1.00->0.80; anemia-ferropenica pierde el diagnostico).
MORPHOS_PROMPT_INCLUIR_GRAVEDAD=true
# --- RAG ---
MORPHOS_RAG_HABILITADO=true
MORPHOS_RAG_EMBED_MODEL=BAAI/bge-m3
MORPHOS_RAG_TOP_K=6
# Una consulta de recuperación por patrón, fusionadas con RRF, en vez de una sola cadena
# concatenada. OFF: el A/B del 2026-07-31 con juez heurístico la puntúa peor (ver
# evals/resultados/2026-07-31/). Repetir con juez LLM antes de activarla.
MORPHOS_RAG_MULTICONSULTA=false
# Preferencia (no límite duro) de fragmentos por libro, para no gastar el presupuesto del
# prompt en varias páginas del mismo capítulo. 0 la desactiva.
MORPHOS_RAG_MAX_POR_LIBRO=2
# Suelo de relevancia del cross-encoder: por debajo se descarta el fragmento en vez de
# rellenar TOP_K. Vacío = desactivado (los logits del reranker no están calibrados: fijar el
# umbral a ojo puede vaciar la recuperación). Calibrar con evals/run_retrieval_eval.py.
# MORPHOS_RAG_SCORE_MINIMO=
# --- Integración de analizadores de laboratorio ---
# Formato: `clave` o `clinica:clave`. La clínica es la DUEÑA de lo que ingiera ese dispositivo,
# y sólo las sesiones de esa misma clínica pueden leerlo. Sin prefijo, la de por defecto
# ("principal"), que es lo que quiere un despliegue de una sola clínica.
# El puente NO puede declarar su clínica en el cuerpo: sale de la clave, en el servidor.
# Revocar un dispositivo = quitar su clave de aquí y reiniciar.
# MORPHOS_LAB_API_KEYS=clinica-a:clave-del-puente-1,clinica-b:clave-del-puente-2
# Cola de muestras recibidas (GET /api/lab/pendientes) y el botón "Resultados pendientes" de la
# UI. Desde el filtrado por clínica sólo enumera las muestras de la clínica de la sesión, así
# que ya no es un volcado global. Sigue DESACTIVADA por defecto porque dentro de una misma
# clínica lista todas las muestras de todos sus pacientes, que es más de lo que necesita la
# mayoría de flujos; enciéndela si quieres el botón.
MORPHOS_LAB_PENDIENTES_HABILITADO=false
# --- Proxy inverso ---
# Saltos de proxy DE CONFIANZA delante de la app. 0 = no confiar en X-Forwarded-For.
# Detrás de un proxy, `request.client.host` es el PROXY, así que los límites por IP pasan a ser
# GLOBALES: fuerza bruta desde muchas IPs no se limita, y un cliente ruidoso agota el login de
# todos. La cabecera no se lee a ciegas porque la manda el cliente: se toma el elemento -N, el
# último que escribió infraestructura de confianza.
# En HF Spaces (hay un router delante): 1.
MORPHOS_PROXY_SALTOS_CONFIABLES=0
# --- Rate limiting ---
MORPHOS_LIMITE_INTERPRET=10/minute
MORPHOS_LIMITE_LOGIN=5/minute
MORPHOS_LIMITE_PAPERS=30/minute
|