fix: conectar el Streamlit del backend con el motor real + README honesto#5
Merged
Merged
Conversation
Tres archivos legacy que ningún módulo importa ni usa, removidos para
evitar confusión al jurado y a contribuyentes nuevos:
- optimizar_rutas.py (raíz): implementación inicial standalone de
OR-Tools del primer commit, sustituida en su día por src/optimizer.py
(motor dual heurística + OR-Tools con patrón Strategy). No estaba
importado desde ningún sitio.
- data/pedidos.csv: dataset antiguo con separador ';', columna 'peso'
en lugar de 'peso_kg', prioridades como strings ("Media"/"Alta"/"Baja").
Incompatible con DataProcessor que espera coma y enteros. Sustituido
por data/pedidos_ejemplo.csv (mismo número de filas, esquema correcto,
direcciones reales de Elche y Alicante).
Tras este commit, hay un único dataset oficial (pedidos_ejemplo.csv)
y un único motor oficial (src/optimizer.py).
El script tenía hardcoded una ruta absoluta al Mac del autor original
("/Users/samuelparraechague/Developer/3_Workspace_Cloudecode") que
hacía que el test end-to-end solo funcionara en su máquina.
Ahora se calcula la raíz del repositorio a partir de __file__ del
propio script, por lo que `python src/test_run.py` funciona en
cualquier sistema (Linux, macOS, Windows) y desde cualquier directorio
de trabajo siempre que el árbol del repo esté intacto.
El app/main.py anterior era un mock del primer commit con DEMO_DATA
hardcoded (5 pedidos ficticios) y un comentario "se eliminan cuando
Samuel entregue el CSV" que nunca se cumplió. NO importaba nada de
src/, no optimizaba nada, no llamaba a OR-Tools ni al asistente IA.
Si el jurado seguía el README al pie de la letra, ejecutaba ese mock
y se iba pensando que el backend "no hace nada".
Este commit lo reemplaza por un panel Streamlit completo que SÍ conecta
con el motor de Samuel y demuestra el valor real del producto.
QUÉ HACE EL NUEVO app/main.py
1. Carga data/pedidos_ejemplo.csv y data/vehiculos_config.json mediante
src.data_processor.DataProcessor (con @st.cache_data para evitar
recargas innecesarias en rerun).
2. Construye matrices de distancia/tiempo Haversine ajustadas.
3. Permite al gestor elegir motor en el sidebar:
- Google OR-Tools (CVRPTW industrial), por defecto.
- Heurística propia (K-Means + VMC ponderado por prioridad).
4. Ejecuta automáticamente el baseline manual (3 heurísticas humanas)
y el optimizador elegido, y compara con MetricsEngine.compare_plans.
5. Muestra un cuadro de impacto en 4 columnas (km, €, CO₂, retrasos)
con deltas frente al baseline.
6. Renderiza un mapa Folium interactivo con:
- Depósito como icono industrial negro.
- Paradas coloreadas por vehículo asignado, con popup detallado
(cliente, hora, ventana, peso, prioridad).
- Polyline coloreada conectando depósito → paradas → depósito.
7. Tabla compacta de pedidos a la derecha del mapa.
8. Botón "Generar informe" que invoca AIAssistant.generate_explanation
(Ollama local, con fallback a plantillas heurísticas dinámicas)
y renderiza el resultado en markdown.
9. Manejo de errores: si los CSV/JSON faltan o están corruptos,
muestra un mensaje claro en lugar de petar con stack trace.
Acompaña este cambio una sección reescrita del README en "Guía de
Instalación y Uso" que:
- Aclara que Ollama es opcional (con fallback de plantillas).
- Documenta lo que el usuario verá al abrir la URL.
- Añade instrucciones para correr los tests (unittest + test_run.py).
- Sustituye el bloque "OpenRoute combina dos piezas que pueden usarse
de forma independiente o integrada" por una descripción HONESTA del
estado actual: dos componentes que se ejecutan por separado, con la
integración HTTP marcada como siguiente iteración del roadmap.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Por qué este PR existe
Tras los merges de
feat/llm-chatbot-frontend(#3) yfeat/backend-optimization(#4), una auditoría del estado demainreveló tres problemas que el README escondía:app/main.pyera un mock obsoleto del primer commit, conDEMO_DATAhardcoded de 5 pedidos y sin un soloimportdesrc/. El comentario "se eliminan cuando Samuel entregue el CSV" no se había cumplido. Si el jurado seguía las instrucciones del README al pie de la letra, ejecutaba este mock y se llevaba la impresión de que el backend no hacía nada.optimizar_rutas.py(raíz) era código huérfano del primer commit, no importado por nada.data/pedidos.csvtenía esquema incompatible conDataProcessor(separador;, columnapesoen lugar depeso_kg, prioridades como strings).src/test_run.pytenía hardcoded la ruta absoluta del Mac del autor original (/Users/samuelparraechague/...), por lo que solo funcionaba en su máquina.Este PR resuelve los cinco puntos en tres commits.
Cambios
chore: eliminar código huérfano del primer commit(b62dce5)Borrados
optimizar_rutas.pyydata/pedidos.csv. Tras esto hay un único dataset oficial (data/pedidos_ejemplo.csv) y un único motor oficial (src/optimizer.py).fix(backend): usar paths relativos en test_run.py(142f3d7)workspace_dir = "/Users/samuelparraechague/..."reemplazado por cálculo relativo a__file__.python src/test_run.pyahora funciona en Linux, macOS y Windows desde cualquier directorio de trabajo.feat(app): reescribir Streamlit para usar el motor real de optimización(407ac89)Nuevo
app/main.pyque sí conecta consrc/. Lo que ve el jurado al abrir la URL:AIAssistant.generate_explanation(Ollama local con fallback de plantillas dinámicas) y renderiza en markdown.@st.cache_datapara que cambios de motor no recarguen los datos.Acompaña el código una sección reescrita del README:
python -m unittest src/test_optimizer.py -vypython src/test_run.py.Cómo probarlo
git checkout fix/backend-streamlit-integration pip install -r requirements.txt ollama pull llama3.1:8b # opcional, para el informe AI streamlit run app/main.pyEn la URL que muestra Streamlit, juega con el sidebar (cambia motor), expande el "Detalle por vehículo", abre popups del mapa y pulsa "Generar informe".
cc: @echeguate @giulianpeter