alexp97 commited on
Commit
8f7750d
·
1 Parent(s): 92cbcc6

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 CHANGED
@@ -1,67 +1,83 @@
1
- # AgroVisión — MVP (Conteo por Dron)
2
 
3
- MVP de [AgroVisión](docs/reference/description_proyecto_agrovision_mvp.md): UI en **Shiny for Python** + backend **FastAPI** para el conteo de plantas a partir de ortomosaicos de dron.
4
 
5
- > **Estado actual STANDBY.** El módulo de conteo arranca **deshabilitado** (`COUNTING_ENABLED=false`) hasta que el [repo del modelo](docs/reference/description_proyecto_modelo_conteo_plantas.md) publique el artefacto `agrovision-plantcount` en Hugging Face Hub. Mientras tanto, la UI muestra el aviso *"Módulo en preparación"* y el endpoint `/api/count` responde `503`.
6
  >
7
- > **Modelo agnóstico.** La app consume el artefacto por **contrato** vía un adaptador de inferencia (onnxruntime o `ultralytics` según la arquitectura: YOLO26/RF-DETR). **Licencia: AGPL-3.0** (app open-source).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  ## Estructura
10
 
11
  ```
12
- backend/ # FastAPI: config, schemas, core (detection, metrics, inference), api/count, main
13
- frontend/ # Shiny for Python: app.py (Conteo en standby + Credenciales efímeras)
14
- tests/ # unit · integration · e2e (Playwright, skip por defecto)
15
- models/ # artefacto .onnx (no versionado; se descarga de HF Hub)
16
- sample_data/# ortomosaicos de ejemplo (no versionados)
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á fijado en `pyproject.toml`.)
27
 
28
- ```bash
29
- # 1) Dependencias (uv)
30
  uv sync
31
 
32
- # 2) Backend (FastAPI) en :8000 — o usa scripts/run_backend.ps1
33
- uv run python -m uvicorn backend.main:app --reload --port 8000
34
 
35
- # 3) UI (Shiny, ASGI) en :8001 (otra terminal) — o usa scripts/run_ui.ps1
36
- uv run python -m uvicorn frontend.app:app --reload --port 8001
37
- ```
38
 
39
- > En Windows/OneDrive se usa `python -m uvicorn` en vez de los shims `uvicorn.exe`/`shiny.exe` (que la sincronización en la nube bloquea). La app Shiny es ASGI, así que `uvicorn frontend.app:app` equivale a `shiny run frontend/app.py`.
 
 
 
 
40
 
41
- ```bash
42
- # Atajo: levantar backend + UI en ventanas separadas
43
- ./scripts/dev.ps1
44
 
45
- # 4) Calidad y pruebas
46
- uv run ruff check .
47
- uv run ruff format --check .
48
- uv run pytest
49
- ```
50
 
51
- Con Docker:
 
 
 
 
 
52
 
53
- ```bash
54
- docker compose up --build # api en :8000, ui en :8001
55
- ```
56
 
57
- ## Activar el conteo (cuando el modelo esté publicado)
58
 
59
- 1. Publicar `agrovision-plantcount-vX.Y.Z.onnx` en Hugging Face Hub (repo del modelo).
60
- 2. Descomentar el bloque `hf_hub_download` en [`backend/Dockerfile`](backend/Dockerfile).
61
- 3. Poner `COUNTING_ENABLED=true` y `MODEL_ARCHITECTURE` (`yolo26n`/`rfdetr_nano`).
62
- 4. Implementar el decode correspondiente en [`backend/core/inference.py`](backend/core/inference.py).
 
63
 
64
  ## Documentación
65
 
66
- - Spec funcional: [`docs/reference/description_proyecto_agrovision_mvp.md`](docs/reference/description_proyecto_agrovision_mvp.md)
67
- - Arquitectura: [`docs/architect/architecture_agrovision_mvp.md`](docs/architect/architecture_agrovision_mvp.md)
 
 
 
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. |