josesalazar2025 commited on
Commit
06f94a3
·
1 Parent(s): 0431806

Add Docker usage section to README and include index.html updates

Browse files
Files changed (2) hide show
  1. README.md +41 -8
  2. index.html +2 -3
README.md CHANGED
@@ -6,15 +6,15 @@ colorTo: green
6
  sdk: docker
7
  pinned: false
8
  ---
9
-
10
  # Morphos — Intérprete de analíticas veterinarias asistido por I.A
 
11
  ## Proyecto final — Curso de Desarrollo Web 2026
12
 
13
  ---
14
 
15
  ## Descripción
16
 
17
- Morphos es una aplicación web de apoyo al diagnóstico veterinario. Detecta patrones clínicos en tiempo real a partir de valores de laboratorio usando un motor propio de JS puro con la opción de interpretarlos mediante un modelo de inteligencia artificial especializado en medicina (medGemma 1.5 4B it multimodal de Google Deep Mind).
18
 
19
  Está orientada a caninos y felinos, con ajuste automático de rangos de referencia por especie, edad, raza y sexo.
20
  Ataca una necesidad real del sector veterinario que actualmente no dispone de herramientas de este tipo que sean gratuitas y de fácil uso y que permitan obtener información complementaria relevante sobre sus pacientes en muy poco tiempo y sin exponer la data sensible a los LLM.
@@ -164,16 +164,46 @@ O bien con el servidor integrado de PHP desde la raiz del proyecto:
164
  php -S localhost:8000
165
  ```
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  ---
168
 
169
  ## Backend de IA
170
 
171
  El modelo de IA se configura desde la propia interfaz. La seleccion se guarda en `localStorage`.
172
 
173
- | Opcion | Descripcion |
174
- |---|---|
175
- | HuggingFace (por defecto) | Llama al Space `blackmistcode-morphos-medgemma` a traves del proxy PHP |
176
- | Local (Ollama) | Llama directamente a `http://localhost:11434` con `medgemma1.5:latest` |
177
 
178
  Para usar Ollama, debe estar ejecutandose con `ollama serve` y el modelo descargado.
179
 
@@ -205,7 +235,7 @@ La gravedad se calcula como la desviacion relativa al ancho del rango de referen
205
 
206
  ## Conceptos del curso aplicados
207
 
208
- * HTML5 semantico
209
  * CSS personalizado: variables, fuentes fluidas, grid, flexbox, media queries, temas claro/oscuro
210
  * JavaScript: ES Modules, `fetch`, `async/await`, eventos, DOM API
211
  * PHP: sesiones, PDO, proxy HTTP con cURL, lectura de `.env`, caché en disco
@@ -214,6 +244,7 @@ La gravedad se calcula como la desviacion relativa al ancho del rango de referen
214
  ---
215
 
216
  ## Mejoras futuras
 
217
  * Implementación de dashboard de administrador
218
  * Desarrollo de extensión de navegador para captar datos del DOM de PIMS y obtener los datos de los analisis de los pacientes con intervención mínima del usuario
219
  * Desarrollo de mobile app dedicada
@@ -221,11 +252,12 @@ La gravedad se calcula como la desviacion relativa al ancho del rango de referen
221
  * Rankeo de papers basado en confiabilidad y relevancia
222
  * Creación de Dataset específico para citologías de animales
223
  * Hosting del modelo en VPS serverless para finetuning y menor latencia
224
- * Ampliación de la base de alteraciones
225
  * Parseo con OCR de fotografías de analíticas
226
  * Incluir resultados de gasometría, coprologías, informes de histopatologías y tiempos de coagulación
227
 
228
  ## Retos
 
229
  * Por la diversidad de unidades de medición que utilizan los diferentes fabricantes de equipos de laboratorio se incorporó una detección de unidades para su conversión y normalización
230
  * El modelado del output de la I.A requirió muchísimas iteraciones de formateo del prompt y harness
231
  * Inicialmente quería usar proveedores de inferencia gratuita de medGemma (como featherless AI) pero fallaban continuamente, por eso decidí optar por hostear al modelo en Zero GPU de HF con la subscripción pro para la prueba de concepto
@@ -234,6 +266,7 @@ La gravedad se calcula como la desviacion relativa al ancho del rango de referen
234
  * La API de PubMed sólo admite input en inglés, así que implementó un objeto con traducciones de los patrones clínicos más comúnes para poder realizar las peticiones
235
 
236
  ## Notas
 
237
  * `api/setup.php` puede eliminarse una vez creada la base de datos
238
  * El parser de PDF funciona completamente en el navegador (sin subida al servidor) para evitar enviar información privada al modelo de IA.
239
  * La busqueda de literatura filtra los patrones detectados, los traduce al ingles y consulta PubMed via `esearch` + `esummary`
 
6
  sdk: docker
7
  pinned: false
8
  ---
 
9
  # Morphos — Intérprete de analíticas veterinarias asistido por I.A
10
+
11
  ## Proyecto final — Curso de Desarrollo Web 2026
12
 
13
  ---
14
 
15
  ## Descripción
16
 
17
+ Morphos es una aplicación web de apoyo al diagnóstico veterinario. Detecta patrones clínicos en tiempo real a partir de valores de laboratorio usando un motor propio de JS puro con la opción de interpretarlos mediante un modelo de inteligencia artificial especializado en medicina (medGemma 1.5 4B it multimodal de Google Deep Mind), incluye una sección de búsqueda de artículos cientíticos en PubMed relacionados con los diagnósticos diferenciales del paciente.
18
 
19
  Está orientada a caninos y felinos, con ajuste automático de rangos de referencia por especie, edad, raza y sexo.
20
  Ataca una necesidad real del sector veterinario que actualmente no dispone de herramientas de este tipo que sean gratuitas y de fácil uso y que permitan obtener información complementaria relevante sobre sus pacientes en muy poco tiempo y sin exponer la data sensible a los LLM.
 
164
  php -S localhost:8000
165
  ```
166
 
167
+ ### 5. Despliegue con Docker (HuggingFace Spaces)
168
+
169
+ El proyecto incluye un `Dockerfile` basado en `php:8.2-apache` configurado para ejecutarse en HuggingFace Spaces en el puerto `7860`.
170
+
171
+ **Construir y ejecutar localmente:**
172
+
173
+ ```bash
174
+ docker build -t morphos .
175
+ docker run -p 7860:7860 morphos
176
+ ```
177
+
178
+ Abrir en el navegador: `http://localhost:7860`
179
+
180
+ **Variables de entorno en Docker:**
181
+
182
+ La API key de HuggingFace debe estar en `api/.env` antes de construir la imagen:
183
+
184
+ ```text
185
+ HF_API_KEY=tu_clave_de_huggingface
186
+ ```
187
+
188
+ > En HuggingFace Spaces también puede configurarse como secreto desde *Settings → Repository secrets* para no exponerla en el repositorio.
189
+
190
+ **Notas del entorno Docker:**
191
+
192
+ * Apache escucha en el puerto `7860` (configurado vía `sed` sobre `ports.conf` y `000-default.conf`)
193
+ * El script `docker-entrypoint.sh` inicializa la base de datos SQLite en `/var/www/html/data/morphos.db` al arrancar el contenedor
194
+ * Los datos escritos en SQLite durante la ejecución **no persisten** entre reinicios del contenedor a menos que se monte un volumen externo
195
+ * Si el Space queda en estado de error por un proceso Apache colgado, usar **Factory reboot** desde el menú del Space en HuggingFace
196
+
197
  ---
198
 
199
  ## Backend de IA
200
 
201
  El modelo de IA se configura desde la propia interfaz. La seleccion se guarda en `localStorage`.
202
 
203
+ | Opcion | Descripcion |
204
+ | ------------------------- | -------------------------------------------------------------------------- |
205
+ | HuggingFace (por defecto) | Llama al Space `blackmistcode-morphos-medgemma` a traves del proxy PHP |
206
+ | Local (Ollama) | Llama directamente a `http://localhost:11434` con `medgemma1.5:latest` |
207
 
208
  Para usar Ollama, debe estar ejecutandose con `ollama serve` y el modelo descargado.
209
 
 
235
 
236
  ## Conceptos del curso aplicados
237
 
238
+ * HTML5 semantico
239
  * CSS personalizado: variables, fuentes fluidas, grid, flexbox, media queries, temas claro/oscuro
240
  * JavaScript: ES Modules, `fetch`, `async/await`, eventos, DOM API
241
  * PHP: sesiones, PDO, proxy HTTP con cURL, lectura de `.env`, caché en disco
 
244
  ---
245
 
246
  ## Mejoras futuras
247
+
248
  * Implementación de dashboard de administrador
249
  * Desarrollo de extensión de navegador para captar datos del DOM de PIMS y obtener los datos de los analisis de los pacientes con intervención mínima del usuario
250
  * Desarrollo de mobile app dedicada
 
252
  * Rankeo de papers basado en confiabilidad y relevancia
253
  * Creación de Dataset específico para citologías de animales
254
  * Hosting del modelo en VPS serverless para finetuning y menor latencia
255
+ * Ampliación de la base de alteraciones
256
  * Parseo con OCR de fotografías de analíticas
257
  * Incluir resultados de gasometría, coprologías, informes de histopatologías y tiempos de coagulación
258
 
259
  ## Retos
260
+
261
  * Por la diversidad de unidades de medición que utilizan los diferentes fabricantes de equipos de laboratorio se incorporó una detección de unidades para su conversión y normalización
262
  * El modelado del output de la I.A requirió muchísimas iteraciones de formateo del prompt y harness
263
  * Inicialmente quería usar proveedores de inferencia gratuita de medGemma (como featherless AI) pero fallaban continuamente, por eso decidí optar por hostear al modelo en Zero GPU de HF con la subscripción pro para la prueba de concepto
 
266
  * La API de PubMed sólo admite input en inglés, así que implementó un objeto con traducciones de los patrones clínicos más comúnes para poder realizar las peticiones
267
 
268
  ## Notas
269
+
270
  * `api/setup.php` puede eliminarse una vez creada la base de datos
271
  * El parser de PDF funciona completamente en el navegador (sin subida al servidor) para evitar enviar información privada al modelo de IA.
272
  * La busqueda de literatura filtra los patrones detectados, los traduce al ingles y consulta PubMed via `esearch` + `esummary`
index.html CHANGED
@@ -17,7 +17,7 @@
17
  <link rel="preload" href="assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf" as="font" type="font/ttf" crossorigin>
18
 
19
  <link rel="icon" href="assets/icons/favicon.ico">
20
- <link rel="stylesheet" href="css/styles.css?v=4">
21
  </head>
22
  <body>
23
 
@@ -614,10 +614,9 @@
614
  <div class="col3-wrapper">
615
 
616
  <section class="panel" id="panel-imagenes">
617
-
618
  <!-- IMÁGENES / CITOLOGÍA -->
619
  <div class="subpanel" id="subpanel-citologia">
620
- <h2 class="panel-titulo">Citologías</h2>
621
  <div class="panel-cabecera">Citologías</div>
622
  <div class="subpanel-anim"><div class="subpanel-cuerpo" id="cuerpo-citologia">
623
  <div class="zonas-imagen">
 
17
  <link rel="preload" href="assets/fonts/JetBrains_Mono/JetBrainsMono-VariableFont_wght.ttf" as="font" type="font/ttf" crossorigin>
18
 
19
  <link rel="icon" href="assets/icons/favicon.ico">
20
+ <link rel="stylesheet" href="css/styles.css?v=5">
21
  </head>
22
  <body>
23
 
 
614
  <div class="col3-wrapper">
615
 
616
  <section class="panel" id="panel-imagenes">
617
+ <h2 class="panel-titulo">Citologías</h2>
618
  <!-- IMÁGENES / CITOLOGÍA -->
619
  <div class="subpanel" id="subpanel-citologia">
 
620
  <div class="panel-cabecera">Citologías</div>
621
  <div class="subpanel-anim"><div class="subpanel-cuerpo" id="cuerpo-citologia">
622
  <div class="zonas-imagen">