Spaces:
Runtime error
Runtime error
docs(fase8): plan/arquitectura/README para migración de UI a Astro (Agro-Stack)
Browse files- Plan y tareas: nueva Fase 8 (Astro+Tailwind SPA consumiendo /api; Leaflet-draw,
Chart.js; responsive + sidebar/footer plegables; Regla de Oro de plan_replication).
- Arquitectura: nota de frontend Astro + ADR (revisa 'Shiny sobre Astro'; Shiny -> legacy).
- README: reescrito a plataforma (6 módulos, FastAPI + Supabase BYOK, UI migrando a Astro).
- README.md +55 -39
- docs/architect/architecture_agrovision.md +3 -0
README.md
CHANGED
|
@@ -1,67 +1,83 @@
|
|
| 1 |
-
# AgroVisión —
|
| 2 |
|
| 3 |
-
|
| 4 |
|
| 5 |
-
> **
|
| 6 |
>
|
| 7 |
-
> **
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
## Estructura
|
| 10 |
|
| 11 |
```
|
| 12 |
-
backend/ # FastAPI:
|
| 13 |
-
frontend/ # Shiny
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
docs/ # documentación (reference/architect/db versionados; plan/task/investigation no)
|
| 18 |
```
|
| 19 |
|
| 20 |
-
## Arranque rápido (local)
|
| 21 |
|
| 22 |
> **Windows + OneDrive:** la carpeta está sincronizada por la nube, lo que rompe los *hardlinks* y bloquea el `.venv`. Crea el entorno **fuera** de OneDrive:
|
| 23 |
> ```powershell
|
| 24 |
> $env:UV_PROJECT_ENVIRONMENT = "$env:LOCALAPPDATA\agrovision-venv"
|
| 25 |
> ```
|
| 26 |
-
> (El `link-mode = "copy"` ya está
|
| 27 |
|
| 28 |
-
```
|
| 29 |
-
# 1) Dependencias
|
| 30 |
uv sync
|
| 31 |
|
| 32 |
-
# 2)
|
| 33 |
-
uv run python -m
|
| 34 |
|
| 35 |
-
# 3)
|
| 36 |
-
uv run python -m uvicorn
|
| 37 |
-
```
|
| 38 |
|
| 39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
|
| 41 |
-
``
|
| 42 |
-
# Atajo: levantar backend + UI en ventanas separadas
|
| 43 |
-
./scripts/dev.ps1
|
| 44 |
|
| 45 |
-
#
|
| 46 |
-
uv run ruff check .
|
| 47 |
-
uv run ruff format --check .
|
| 48 |
-
uv run pytest
|
| 49 |
-
```
|
| 50 |
|
| 51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
|
| 53 |
-
``
|
| 54 |
-
docker compose up --build # api en :8000, ui en :8001
|
| 55 |
-
```
|
| 56 |
|
| 57 |
-
##
|
| 58 |
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
|
|
|
| 63 |
|
| 64 |
## Documentación
|
| 65 |
|
| 66 |
-
-
|
| 67 |
-
- Arquitectura: [`docs/architect/
|
|
|
|
|
|
|
|
|
| 1 |
+
# AgroVisión — Plataforma de Monitoreo Agronómico
|
| 2 |
|
| 3 |
+
Plataforma de [AgroVisión](docs/reference/description_proyecto_agrovision.md) para monitoreo agronómico de precisión: **gestión de parcelas**, **teledetección NDVI** (Sentinel-2, 5 años), **agente conversacional (RAG)** y **conteo de plantas por dron** (este último **en desarrollo**). Backend **FastAPI** (monolito modular), persistencia **Supabase (PostGIS) BYOK**, y UI en **migración de Shiny → Astro + Tailwind** (Agro-Stack).
|
| 4 |
|
| 5 |
+
> **Modelo BYOK, credenciales efímeras.** Las llaves del usuario (Supabase, Copernicus, Groq) viven **solo en memoria de sesión** y se envían por cabeceras `X-User-*`; nunca se persisten. Refrescar borra todo.
|
| 6 |
>
|
| 7 |
+
> **Conteo por dron — EN DESARROLLO.** Arranca deshabilitado (`COUNTING_ENABLED=false`); la cola/worker/tabla existen pero inactivos hasta que el [repo del modelo](docs/reference/description_proyecto_modelo_conteo_plantas.md) publique el artefacto `agrovision-plantcount` en Hugging Face Hub. **Licencia: AGPL-3.0.**
|
| 8 |
+
|
| 9 |
+
## Módulos (6)
|
| 10 |
+
|
| 11 |
+
Resumen de Campo · Creación de Parcelas · Teledetección · Conteo por Dron (en desarrollo) · Asistente Agéntico · Credenciales.
|
| 12 |
+
|
| 13 |
+
## Arquitectura
|
| 14 |
+
|
| 15 |
+
```
|
| 16 |
+
Astro + Tailwind (UI, Fase 8) ──HTTP /api──► FastAPI (monolito modular) ──► Supabase (PostGIS) [BYOK]
|
| 17 |
+
(Shiny = legacy en /shiny) ├─ /api/fields (parcelas) ├─ Sentinel Hub / Copernicus (NDVI)
|
| 18 |
+
├─ /api/ndvi(+raster), /api/weather ├─ Open-Meteo (clima, sin llave)
|
| 19 |
+
├─ /api/chat (agente RAG) └─ Groq / Llama 3 (LLM)
|
| 20 |
+
└─ /api/count (conteo, en desarrollo)
|
| 21 |
+
```
|
| 22 |
|
| 23 |
## Estructura
|
| 24 |
|
| 25 |
```
|
| 26 |
+
backend/ # FastAPI: api/ (routers por dominio) · services/ (negocio) · core/ (dominio puro) · db/ (PostGIS) · main
|
| 27 |
+
frontend/ # UI Shiny (legacy) → migrando a Astro + Tailwind (Fase 8)
|
| 28 |
+
supabase/ # migraciones SQL (PostGIS, índices, RLS, PGMQ)
|
| 29 |
+
tests/ # unit · integration (Supabase/Copernicus/Groq, skip sin llaves) · e2e
|
| 30 |
+
docs/ # reference/architect/db versionados; plan/task/investigation/doc_guia no
|
|
|
|
| 31 |
```
|
| 32 |
|
| 33 |
+
## Arranque rápido (local, sin Docker)
|
| 34 |
|
| 35 |
> **Windows + OneDrive:** la carpeta está sincronizada por la nube, lo que rompe los *hardlinks* y bloquea el `.venv`. Crea el entorno **fuera** de OneDrive:
|
| 36 |
> ```powershell
|
| 37 |
> $env:UV_PROJECT_ENVIRONMENT = "$env:LOCALAPPDATA\agrovision-venv"
|
| 38 |
> ```
|
| 39 |
+
> (El `link-mode = "copy"` ya está en `pyproject.toml`.)
|
| 40 |
|
| 41 |
+
```powershell
|
| 42 |
+
# 1) Dependencias
|
| 43 |
uv sync
|
| 44 |
|
| 45 |
+
# 2) (una vez, si usarás parcelas) configurar DATABASE_URL en .env y aplicar migraciones
|
| 46 |
+
uv run python -m backend.db.migrate
|
| 47 |
|
| 48 |
+
# 3) Backend (FastAPI) en :8000 — o scripts/run_backend.ps1
|
| 49 |
+
uv run python -u -m uvicorn backend.main:app --reload --port 8000 --log-level info
|
|
|
|
| 50 |
|
| 51 |
+
# 4) UI en :8001 (otra terminal) — o scripts/run_ui.ps1
|
| 52 |
+
uv run python -u -m uvicorn frontend.app:app --reload --port 8001
|
| 53 |
+
# Atajo: ambos en ventanas separadas
|
| 54 |
+
.\scripts\dev.ps1
|
| 55 |
+
```
|
| 56 |
|
| 57 |
+
Detalle completo (credenciales por módulo, migraciones, troubleshooting): **[`docs/ejecucion.md`](docs/ejecucion.md)**.
|
|
|
|
|
|
|
| 58 |
|
| 59 |
+
## Credenciales BYOK (capa gratuita)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
+
| Servicio | Habilita | Variable(s) en `.env` |
|
| 62 |
+
|----------|----------|------------------------|
|
| 63 |
+
| **Supabase** (PostGIS) | Parcelas, Teledetección, Resumen | `DATABASE_URL`, `SUPABASE_URL`, `SUPABASE_ANON_KEY` |
|
| 64 |
+
| **Copernicus CDSE** | NDVI satelital + heatmap | `DEV_COPERNICUS_CLIENT_ID`, `DEV_COPERNICUS_CLIENT_SECRET` |
|
| 65 |
+
| **Groq** | Asistente RAG | `DEV_GROQ_API_KEY` |
|
| 66 |
+
| Open-Meteo | Clima | — (sin llave) |
|
| 67 |
|
| 68 |
+
La app abre **sin** credenciales; cada módulo se activa al poner su llave (en `.env` local o en la pestaña *Credenciales*).
|
|
|
|
|
|
|
| 69 |
|
| 70 |
+
## Calidad y pruebas
|
| 71 |
|
| 72 |
+
```powershell
|
| 73 |
+
uv run ruff check .
|
| 74 |
+
uv run python -m pytest # unit + integración (skip sin llaves)
|
| 75 |
+
uv run python -m pytest tests/unit -q # solo unitarias (rápidas)
|
| 76 |
+
```
|
| 77 |
|
| 78 |
## Documentación
|
| 79 |
|
| 80 |
+
- Definición: [`docs/reference/description_proyecto_agrovision.md`](docs/reference/description_proyecto_agrovision.md)
|
| 81 |
+
- Arquitectura: [`docs/architect/architecture_agrovision.md`](docs/architect/architecture_agrovision.md)
|
| 82 |
+
- Diseño de BD: [`docs/db/diseno_db.md`](docs/db/diseno_db.md)
|
| 83 |
+
- Ejecución (runbook): [`docs/ejecucion.md`](docs/ejecucion.md)
|
docs/architect/architecture_agrovision.md
CHANGED
|
@@ -7,6 +7,8 @@
|
|
| 7 |
>
|
| 8 |
> **Módulos de UI (6):** Resumen de Campo · **Creación de Parcelas** (nuevo: dibujo del polígono) · Teledetección (solo gráficos + heatmap NDVI) · Conteo por Dron (**en desarrollo / standby**) · Asistente Agéntico · Credenciales.
|
| 9 |
>
|
|
|
|
|
|
|
| 10 |
> **Estado del Conteo:** el módulo de visión arranca **en desarrollo** (`COUNTING_ENABLED=false`); se construye **todo lo demás** ahora. La tabla `plant_counts`, la cola PGMQ y el worker se crean pero quedan inactivos hasta publicar el modelo.
|
| 11 |
|
| 12 |
---
|
|
@@ -261,3 +263,4 @@ flowchart LR
|
|
| 261 |
| **NDVI por defecto a 5 años con agregación mensual** | Rango corto fijo / sin agregación (todas las escenas) | Da histórico útil para "Resumen de campo" y el agente, y mantiene el volumen bajo el límite de Supabase Free; el backfill incremental evita recalcular. |
|
| 262 |
| **Heatmap NDVI satelital (~10 m/px) on-demand, sin persistir** | Persistir rásters NDVI / heatmap cm/px desde RGB | El ráster es pesado y efímero (se regenera); cm/px exige dron multiespectral (NIR), no disponible con RGB → se difiere con el módulo de Conteo. |
|
| 263 |
| **Conteo por dron arranca EN DESARROLLO (toda la infra creada, inactiva)** | Bloquear la plataforma hasta tener el modelo | Permite entregar parcelas/teledetección/agente ya; la cola/worker/tabla existen para activarse con solo `COUNTING_ENABLED=true` cuando el repo del modelo publique el artefacto. |
|
|
|
|
|
|
| 7 |
>
|
| 8 |
> **Módulos de UI (6):** Resumen de Campo · **Creación de Parcelas** (nuevo: dibujo del polígono) · Teledetección (solo gráficos + heatmap NDVI) · Conteo por Dron (**en desarrollo / standby**) · Asistente Agéntico · Credenciales.
|
| 9 |
>
|
| 10 |
+
> **Frontend (Fase 8 — Agro-Stack):** la UI migra de **Shiny** a **Astro + Tailwind** (SPA estática, hash-routing, responsive, sidebar/footer plegables) que replica el [mockup](../investigation/agrovisi_n_spa_prototype.html) y consume `/api/*` directo (Leaflet-draw para el mapa, Chart.js para NDVI/clima). El gateway **FastAPI sirve el build estático en `/`** y mantiene `/api`. **Shiny queda como _legacy_** (opcional en `/shiny`). Sigue la "Regla de Oro" de [`plan_replication.md`](../doc_guia/plan_replication.md) (una página, hash, rutas relativas, CSS inline).
|
| 11 |
+
>
|
| 12 |
> **Estado del Conteo:** el módulo de visión arranca **en desarrollo** (`COUNTING_ENABLED=false`); se construye **todo lo demás** ahora. La tabla `plant_counts`, la cola PGMQ y el worker se crean pero quedan inactivos hasta publicar el modelo.
|
| 13 |
|
| 14 |
---
|
|
|
|
| 263 |
| **NDVI por defecto a 5 años con agregación mensual** | Rango corto fijo / sin agregación (todas las escenas) | Da histórico útil para "Resumen de campo" y el agente, y mantiene el volumen bajo el límite de Supabase Free; el backfill incremental evita recalcular. |
|
| 264 |
| **Heatmap NDVI satelital (~10 m/px) on-demand, sin persistir** | Persistir rásters NDVI / heatmap cm/px desde RGB | El ráster es pesado y efímero (se regenera); cm/px exige dron multiespectral (NIR), no disponible con RGB → se difiere con el módulo de Conteo. |
|
| 265 |
| **Conteo por dron arranca EN DESARROLLO (toda la infra creada, inactiva)** | Bloquear la plataforma hasta tener el modelo | Permite entregar parcelas/teledetección/agente ya; la cola/worker/tabla existen para activarse con solo `COUNTING_ENABLED=true` cuando el repo del modelo publique el artefacto. |
|
| 266 |
+
| **(Fase 8) UI migra a Astro + Tailwind (Agro-Stack); Shiny → legacy** | Mantener Shiny como UI principal / shell híbrido con iframe | La UI Shiny por defecto se ve básica; el objetivo es replicar el mockup (estética, **responsive**, plegables). Astro+Tailwind+JS (Leaflet/Chart.js) consumiendo `/api` da control total del look y deploy estático. **Revisa el ADR previo** ("Shiny sobre Astro"): el problema de enrutamiento SPA se mitiga con la **Regla de Oro** (una página, hash-routing, rutas relativas, CSS inline). Shiny se conserva como *legacy* (`/shiny`) por si se requiere reactividad Python. |
|