Проекты

API Artefacto 360 DAGMA

Бэкенд для полевого сбора данных DAGMA-360: сервис на FastAPI с Firestore в реальном времени, фотографии разведки, хранящиеся в Amazon S3, захват GPS-координат и метрики, доступные через Prometheus.

  • Python
  • FastAPI
  • Firebase
  • AWS S3
Показать оригинальный README репозитория

API Artefacto 360 DAGMA

API para gestión de artefacto de captura DAGMA (Departamento Administrativo de Gestión del Medio Ambiente) basada en la arquitectura de gestor_proyecto_api.

🚀 Características

  • FastAPI: Framework moderno y de alto rendimiento
  • Firebase/Firestore: Base de datos en tiempo real
  • Amazon S3: Almacenamiento de fotos de reconocimientos
  • Captura GPS: Registro de coordenadas geoespaciales
  • Soporte UTF-8: Caracteres especiales en español
  • Monitoreo: Métricas de Prometheus
  • Documentación: Swagger UI automática

📋 Endpoints Principales

Default

  • GET / - Endpoint raíz con información básica

General

  • GET /ping - Health check simple
  • GET /health - Health check completo
  • GET /cors-test - Prueba de CORS
  • GET /test/utf8 - Prueba de caracteres UTF-8
  • GET /debug/railway - Debug para Railway
  • GET /centros-gestores/nombres-unicos - Listado de centros gestores

Monitoring

  • GET /metrics - Métricas de Prometheus

Firebase

  • GET /firebase/status - Estado de conexión Firebase
  • GET /firebase/collections - Información de colecciones
  • GET /firebase/collections/summary - Resumen de colecciones

Artefacto de Captura DAGMA

  • GET /init/parques - Inicialización de parques para DAGMA
  • POST /grupo-operativo/reconocimiento - Registrar reconocimiento del grupo operativo
  • GET /grupo-operativo/reportes - Obtener reportes del grupo operativo
  • GET /lideres_grupo - Obtener líderes de grupo (todos o filtrado por grupo)
  • DELETE /grupo-operativo/eliminar-reporte - Eliminar reporte del grupo operativo

Administración y Control de Accesos

  • POST /auth/validate-session - Validar sesión
  • POST /auth/login - Login de usuario
  • POST /auth/register - Registro de usuario (acepta grupo y rol como texto)
  • POST /auth/change-password - Cambiar contraseña
  • POST /auth/google - Autenticación con Google
  • DELETE /auth/user/{uid} - Eliminar usuario
  • GET /admin/users - Listar usuarios desde Firestore (con filtros por query params)
  • GET /auth/config - Configuración de Firebase

🛠️ Instalación

  1. Clonar el repositorio

  2. Crear entorno virtual:

    python -m venv venv
    venv\Scripts\activate  # Windows
  3. Instalar dependencias:

    pip install -r requirements.txt
  4. Configurar variables de entorno:

    cp .env.example .env
    # Editar .env con tus credenciales
  5. Ejecutar la aplicación:

    uvicorn app.main:app --reload

📚 Documentación

Una vez iniciada la aplicación, accede a:

  • Swagger UI: http://localhost:8000/docs
  • ReDoc: http://localhost:8000/redoc

🔧 Configuración de Firebase

  1. Crear proyecto en Firebase Console
  2. Descargar archivo de credenciales (serviceAccountKey.json)
  3. Configurar ruta en .env:
    FIREBASE_CREDENTIALS_PATH=path/to/serviceAccountKey.json

☁️ Configuración de AWS S3 (para fotos)

  1. Crear bucket S3 llamado 360-dagma-photos
  2. Configurar credenciales AWS en .env:
    AWS_ACCESS_KEY_ID=tu_access_key
    AWS_SECRET_ACCESS_KEY=tu_secret_key
    AWS_REGION=us-east-1
    S3_BUCKET_NAME=360-dagma-photos

🔐 Autenticación en desarrollo local (Firebase Auth Emulator)

La API siempre verifica la firma de los Firebase ID tokens. No existe ningún modo que acepte tokens sin verificar (el antiguo “fallback” inseguro fue eliminado por motivos de seguridad).

Si tu entorno local no tiene salida al endpoint de certificados de Google (puerto 443 bloqueado), usá el Firebase Auth Emulator en lugar de saltarte la verificación:

  1. Instalá las Firebase CLI tools y arrancá el emulador de Auth:

    npm install -g firebase-tools
    firebase emulators:start --only auth

    Por defecto queda escuchando en localhost:9099.

  2. Exportá la variable de entorno antes de levantar la API (el Admin SDK la detecta automáticamente y valida los tokens emitidos por el emulador):

    export FIREBASE_AUTH_EMULATOR_HOST=localhost:9099   # PowerShell: $env:FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"
    uvicorn app.main:app --reload
  3. En el frontend, apuntá el SDK de Firebase al emulador con connectAuthEmulator(auth, "http://localhost:9099") (bajo un flag de entorno).

Con esto los tokens locales se validan de verdad contra el emulador, sin aceptar firmas sin verificar. En Railway/producción no se define FIREBASE_AUTH_EMULATOR_HOST y la verificación se hace contra Google.

📝 Próximos Pasos (TODO)

  • Implementar conexión con Firebase (colección: reconocimientos_dagma)
  • Implementar subida de fotos a Amazon S3
  • Implementar eliminación de fotos en S3
  • Implementar consulta de parques desde Firebase
  • Implementar autenticación completa
  • Implementar validaciones de datos geoespaciales
  • Agregar tests unitarios para endpoints DAGMA
  • Configurar CI/CD
  • Deploy en Railway o AWS

📄 Licencia

Apache License 2.0 (basado en gestor_proyecto_api)

SSJ Data Warehouse

Бэкенд хранилища данных Обсерватории безопасности (Секретариат безопасности и юстиции Кали): API на FastAPI поверх PostgreSQL с версионируемыми миграциями, Docker-контейнерами и развёртыванием на Railway.

  • Python
  • FastAPI
  • PostgreSQL
  • Docker

AutoML4RainEstimation

Оценка количества осадков с помощью AutoML и глубокого обучения на основе метеорологических данных и спутниковых снимков с автоматизацией выбора модели, настройки гиперпараметров и генерации признаков для климатического прогнозирования и управления рисками стихийных бедствий.

  • Python
  • AutoML
  • Deep Learning
  • Jupyter
Показать оригинальный README репозитория

AutoML4RainEstimation

A Deep Learning approach for accurate rainfall estimation using meteorological data. It optimizes model selection, hyperparameters, and feature engineering, supporting inputs like satellite imagery and sensor data. Ideal for weather forecasting, climate research, and disaster management.

AutoML4RainEstimation

Este proyecto utiliza técnicas de AutoML para la estimación de lluvia. El notebook AutoML4RainEstimation.ipynb incluye la instalación de dependencias necesarias y la implementación de modelos de aprendizaje automático para predecir la cantidad de lluvia.

Requisitos

  • Python 3.6 o superior
  • Jupyter Notebook

Instalación

Para instalar las dependencias necesarias, ejecute los siguientes comandos en una celda del notebook:

!pip install -q neuralprophet
!pip install autogluon
!pip uninstall torchvision torchaudio torchtext -y

git clone https://github.com/tu_usuario/AutoML4RainEstimation.git
cd AutoML4RainEstimation


Este archivo `README.md` proporciona una visión general del proyecto, instrucciones de instalación, uso y contribución.

SYJ WebScrapper

Многоисточниковый конвейер сбора данных для мониторинга восприятия безопасности гражданами в Кали: REST API на FastAPI, автоматическая расшифровка радиоэфира в реальном времени и сбор данных из социальных источников (YouTube, Instagram, Twitter/Nitter, Facebook).

  • Python
  • FastAPI
  • Web Scraping
Показать оригинальный README репозитория

SYJ WebScrapper

Pipeline de scraping multifuente para monitoreo de noticias y redes sociales de seguridad ciudadana en Cali. Incluye API REST (FastAPI), pipeline de radio en vivo con transcripción automática, y soporte para fuentes sociales (YouTube, Instagram, Twitter/Nitter, Facebook).


Tabla de contenidos


Arquitectura

SYJ_webScrapper/
├── api/                        # FastAPI REST
│   ├── main.py                 # App + endpoints sistema/fuentes/scraping/jobs/artículos
│   ├── models.py               # Pydantic request models
│   ├── jobs.py                 # Job store en memoria (UUID, estado, stats)
│   ├── pipeline.py             # Adapter entre API y orquestador
│   ├── radio.py                # Router /radio/* (SSE, control emisoras)
│   ├── transcribe.py           # Router /transcribe/youtube
│   └── auth.py                 # Router /auth/youtube/* (cookies, PO token)
├── src/
│   ├── pipeline/
│   │   └── orchestrator.py     # Orquestador principal (paralelismo, etapas)
│   ├── scrapers/               # Fetchers HTTP (requests, cloudscraper, selenium)
│   ├── parsers/                # Parsers por fuente
│   ├── social/                 # Conectores sociales (YouTube, Instagram, Nitter)
│   ├── radio/
│   │   ├── manager.py          # Manager de workers de radio
│   │   └── worker.py           # Worker por emisora (descarga + Whisper)
│   ├── auth/
│   │   ├── youtube_auth.py     # PO Token + cookies yt-dlp
│   │   └── browser_login.py    # Login OAuth via Chrome
│   └── nlp/                    # Enriquecimiento NLP (barrio, sentimiento, tipo incidente)
├── config/
│   ├── scraper_config.yaml     # Config global (scrapers, NLP, paths, paralelismo)
│   ├── sources/                # Un YAML por fuente de noticias
│   │   ├── el_pais_cali.yaml
│   │   ├── qhubo_cali.yaml
│   │   ├── diario_occidente_valle.yaml
│   │   ├── el_tiempo_nacional.yaml
│   │   └── blu_radio_cali.yaml
│   ├── social_sources.yaml     # Fuentes sociales (YouTube, Instagram, Nitter, Facebook)
│   └── radio_sources.yaml      # Emisoras de radio con URLs de YouTube
├── data/
│   ├── raw_html/               # HTML crudos descargados
│   ├── parsed_json/            # JSON parseados por fuente (<source_id>.json)
│   ├── radio/                  # Segmentos transcritos de radio
│   ├── failed/                 # Artículos que fallaron al parsear
│   └── checkpoints/            # Índices persistentes
├── main.py                     # Punto de entrada CLI
├── run_api.py                  # Punto de entrada API
├── run_scheduler.py            # Scheduler automático (APScheduler)
├── requirements.txt
└── docker-compose.yml

Fuentes configuradas

Noticias (GET /sources)

ID Nombre
el_pais_cali El País Cali
qhubo_cali Q’Hubo Cali
diario_occidente_valle Diario Occidente
el_tiempo_nacional El Tiempo
blu_radio_cali Blu Radio Cali

Sociales (GET /social-sources)

ID Plataforma
nitter_cali Twitter/Nitter
youtube_cali YouTube
facebook_publico_cali Facebook
instagram_cali Instagram

Radio (GET /radio/stations)

Configuradas en config/radio_sources.yaml. Cada emisora tiene una URL de stream de YouTube.


Instalación

# Clonar e instalar dependencias
pip install -r requirements.txt

# Node.js requerido para PO Token de YouTube
npm install -g youtube-po-token-generator

Opcionalmente instalar ChromeDriver para Selenium (fallback en sitios dinámicos) y para el login de YouTube via browser.


Levantar la API

python run_api.py --host 127.0.0.1 --port 8000 --reload

Una vez levantada:


API REST — Referencia completa

Todos los endpoints devuelven JSON. Los jobs de scraping son asíncronos: disparan el proceso en background y retornan un job_id para hacer polling.


Sistema

GET /

Health check. Retorna versión, conteo de fuentes y configuración activa.

No requiere parámetros.


GET /stats

Estadísticas de almacenamiento: artículos por fuente y conteo de jobs por estado.

No requiere parámetros.


Fuentes

GET /sources

Lista todas las fuentes de noticias configuradas. Usar para obtener source_id válidos.

No requiere parámetros.


GET /sources/{source_id}

Retorna la configuración completa de una fuente de noticias.

Parámetro Tipo Requerido Descripción
source_id path Sí ID de la fuente. Obtenerlo de GET /sources → campo id. Ej: el_pais_cali

GET /social-sources

Lista todas las fuentes sociales configuradas. Usar para obtener social_id válidos.

No requiere parámetros.


Scraping (jobs en background)

Los tres endpoints de scraping retornan inmediatamente con un job_id. El proceso corre en background. Consultar estado con GET /jobs/{job_id}.

POST /scrape/run

Ejecuta el pipeline completo.

Body JSON:

Campo Tipo Default Descripción
fecha_desde string|null null Fecha inicio, formato DD/MM/YYYY. Si se omite, usa la configurada en scraper_config.yaml. Ej: 01/03/2026
fecha_hasta string|null null Fecha fin, formato DD/MM/YYYY. Si se omite, usa fecha actual. Ej: 27/03/2026
fuentes list[string]|null null (todas) IDs de fuentes a incluir. Obtener de GET /sources. Ej: ["el_pais_cali", "qhubo_cali"]
force_reprocess bool false Re-descarga y re-parsea artículos ya existentes en disco
html_only bool false Solo descarga HTML sin parsear. Útil para depuración
include_social bool false Ejecuta también conectores sociales además de noticias
social_only bool false Ejecuta solo conectores sociales, omite fuentes de noticias
// Ejemplo mínimo
{}

// Ejemplo con filtros
{
  "fecha_desde": "01/03/2026",
  "fecha_hasta": "27/03/2026",
  "fuentes": ["el_pais_cali", "qhubo_cali"]
}

POST /scrape/source/{source_id}

Scraping de una sola fuente.

Parámetro Tipo Requerido Descripción
source_id path Sí ID de la fuente. Obtener de GET /sources. Ej: el_pais_cali

Body JSON:

Campo Tipo Default Descripción
fecha_desde string|null null Fecha inicio DD/MM/YYYY
fecha_hasta string|null null Fecha fin DD/MM/YYYY
force_reprocess bool false Reprocesar artículos existentes
html_only bool false Solo descargar HTML

POST /scrape/social

Scraping solo de fuentes sociales.

Body JSON:

Campo Tipo Default Descripción
fecha_desde string|null null Fecha inicio DD/MM/YYYY
fecha_hasta string|null null Fecha fin DD/MM/YYYY
social_ids list[string]|null null (todos) IDs de conectores. Obtener de GET /social-sources. Si se omite, ejecuta todos.
force_reprocess bool false Reprocesar entradas existentes

Jobs

GET /jobs

Lista todos los jobs registrados en memoria (se pierde al reiniciar la API).

Parámetro Tipo Requerido Descripción
status query No Filtrar por estado: pending, running, done, failed. Si se omite, retorna todos.

GET /jobs/{job_id}

Estado y estadísticas de un job específico.

Parámetro Tipo Requerido Descripción
job_id path Sí UUID del job, retornado al disparar el scraping. Ej: 3fa85f64-5717-4562-b3fc-2c963f66afa6

Artículos

GET /articles

Lista artículos almacenados en disco con filtros y paginación.

Parámetro Tipo Default Descripción
source query null ID de fuente. Si se omite, agrega todas las fuentes. Obtener de GET /sources.
fecha_desde query null Filtrar publicados desde esta fecha, formato DD/MM/YYYY. Ej: 01/03/2026
fecha_hasta query null Filtrar publicados hasta esta fecha, formato DD/MM/YYYY. Ej: 27/03/2026
limit query 50 Artículos por página. Rango: 1–500.
offset query 0 Artículos a saltar. Para página 2 con limit=50, usar offset=50.

GET /articles/{article_id}

Retorna un artículo específico por su número de ID y fuente.

Parámetro Tipo Requerido Descripción
article_id path Sí Número entero id_noticia del artículo. Obtener del campo id_noticia en GET /articles.
source query Sí ID de la fuente a la que pertenece el artículo. Requerido.

Radio

GET /radio/status

Estado de todos los workers de radio: offline, watching, transcribing, etc.

GET /radio/stations

Lista de emisoras configuradas en config/radio_sources.yaml. Usar para obtener station_id válidos.

GET /radio/stats

Conteo de segmentos transcritos por emisora.

POST /radio/start

Inicia todas las emisoras con enabled: true en la configuración.

POST /radio/stop

Detiene todos los workers activos.

POST /radio/stations/{station_id}/start

Parámetro Tipo Requerido Descripción
station_id path Sí ID de la emisora. Obtener de GET /radio/stations. Ej: tropicana_cali

POST /radio/stations/{station_id}/stop

Parámetro Tipo Requerido Descripción
station_id path Sí ID de la emisora. Obtener de GET /radio/stations.

GET /radio/stations/{station_id}/status

Parámetro Tipo Requerido Descripción
station_id path Sí ID de la emisora. Obtener de GET /radio/stations.

GET /radio/transcriptions

Transcripciones recientes de todas las emisoras.

Parámetro Tipo Default Descripción
limit query 50 Máximo de entradas. Rango: 1–500.
since query null Solo retornar entradas posteriores a este timestamp ISO 8601. Formato: YYYY-MM-DDTHH:MM:SS. Ej: 2026-03-27T10:00:00. Útil para polling incremental.

GET /radio/transcriptions/{station_id}

Parámetro Tipo Default Descripción
station_id path — ID de emisora. Obtener de GET /radio/stations.
limit query 50 Máximo de entradas. Rango: 1–500.
since query null Timestamp ISO 8601 mínimo. Ej: 2026-03-27T10:00:00

GET /radio/stream y GET /radio/stream/{station_id}

Server-Sent Events — stream de transcripciones en tiempo real. No usa polling; mantiene conexión HTTP abierta.

// Ejemplo de consumo en JavaScript
const es = new EventSource('http://localhost:8000/radio/stream');
es.onmessage = e => console.log(JSON.parse(e.data));
// Cada evento: { station_id, station_name, timestamp, chunk_start, chunk_end, text, confidence }

Transcripción YouTube

POST /transcribe/youtube

Descarga audio de cualquier URL de YouTube y transcribe con faster-whisper.

Body JSON:

Campo Tipo Default Descripción
url string — Requerido. URL completa del video. Acepta videos, Shorts y streams en vivo. Ej: https://www.youtube.com/watch?v=X54nbYSoH-A
model string "small" Modelo Whisper: tiny → base → small → medium → large-v3. Mayor = más preciso y más lento. En CPU usar tiny o base para velocidad.
language string "es" Código ISO 639-1 del idioma. Ej: es, en, pt. Mejora precisión vs auto-detección.
device string "cpu" cpu (siempre disponible), cuda (requiere GPU NVIDIA), auto (elige GPU si existe).
compute_type string "int8" Precisión: int8 (CPU, rápido), float16 (GPU, balance), float32 (máxima precisión).
vad_filter bool true Activa Voice Activity Detection. Filtra música y silencio. Recomendado true para radio.
beam_size int 2 Beam search size (1–10). 1 = greedy (más rápido). 2–5 = uso práctico.
force_refresh_token bool false Forzar regeneración del PO Token. Usar si la descarga falla por auth.

Retorna: transcripción completa, segmentos con timestamps, metadatos del video y métricas detalladas (tiempo por fase, memoria RSS, CPU).


Autenticación YouTube

GET /auth/youtube/status

Estado actual: si hay cookies cargadas y si el PO Token está activo.

POST /auth/youtube/cookies

Sube cookies.txt exportado del browser para autenticar yt-dlp.

Cómo exportar cookies:

  • Chrome/Edge: Instalar extensión “Get cookies.txt LOCALLY” → abrir youtube.com logueado → Export → subir aquí.
  • Firefox: Extensión “cookies.txt” → youtube.com → descargar → subir aquí.

El archivo debe estar en formato Netscape (primera línea: # Netscape HTTP Cookie File).

Parámetro Tipo Requerido Descripción
file form-data Sí Archivo cookies.txt en formato Netscape.

GET /auth/youtube/cookies

Info sobre las cookies actualmente cargadas.

DELETE /auth/youtube/cookies

Elimina el archivo de cookies guardado.

POST /auth/youtube/login

Abre Chrome para login OAuth de Google/YouTube. Las cookies se capturan automáticamente al completar el login.

Body JSON:

Campo Tipo Default Descripción
timeout_seconds int 300 Segundos máximos para completar el login (30–600).

Consultar estado con GET /auth/youtube/login/status.

GET /auth/youtube/login/status

Estados posibles: idle, waiting_login, capturing, done, error.

POST /auth/youtube/po-token

Genera un nuevo PO Token (Proof of Origin) usando Node.js. Se renueva automáticamente cada 5 minutos. Requiere npm install -g youtube-po-token-generator.


CLI — Ejecución directa

# Rango de fechas específico
python main.py --fecha-desde 01/01/2026 --fecha-hasta 10/03/2026

# Solo fuentes específicas
python main.py --fuentes el_pais_cali blu_radio_cali

# Solo redes sociales
python main.py --include-social --social-only

# Forzar reprocesamiento
python main.py --force-reprocess

Scheduler

# Corrida única y sale
python run_scheduler.py --once

# Modo programado (06:00 y 18:00 por defecto)
python run_scheduler.py

Docker

# Construir imagen
docker compose build scraper

# Corrida puntual
docker compose run --rm scraper python main.py --fuentes blu_radio_cali --force-reprocess

# Scheduler continuo
docker compose up -d scraper
docker compose logs -f scraper

# Ollama (NLP opcional)
docker compose --profile ollama up -d ollama
docker exec -it syj_ollama ollama pull llama3.1:8b

Ver guía completa en docs/docker_desktop_local.md.


Configuración

config/scraper_config.yaml

parallel_fetch: true              # Prueba scrapers HTTP en paralelo
parallel_fetch_timeout_seconds: 30
use_cloudflare_scraper: true      # Bypass Cloudflare con cloudscraper
use_selenium_scraper: false       # Selenium para JS pesado (más lento)
selenium_headless: true
selenium_timeout_seconds: 30
max_parallel_articles: 24         # Workers en thread pool
use_ollama_nlp: false             # NLP mejorado con Ollama local

config/sources/<source_id>.yaml

Un archivo por fuente. Contiene id, name, base_url, listing_urls, selectores CSS para parseo, etc.

config/social_sources.yaml

Configuración de conectores sociales: plataforma, handles/URLs, opciones de scraping.

config/radio_sources.yaml

Emisoras con URL de stream YouTube, idioma, y flag enabled.


Pipeline de datos

  1. Discovery — Google Discovery API + listing URLs para encontrar artículos del rango de fechas.
  2. Fetch — Descarga HTML en paralelo (requests → cloudscraper → selenium según config).
  3. Cache — HTML se guarda en data/raw_html/. Si ya existe, no se vuelve a descargar.
  4. Parse — Extrae título, cuerpo, fecha, autor con selectores CSS por fuente.
  5. NLP — Enriquece con barrio, comuna, sentimiento, tipo de incidente.
  6. Store — JSON por fuente en data/parsed_json/<source_id>.json.

Checkpoint incremental: data/checkpoints/article_index.json evita reprocesar artículos ya guardados.


NLP mínimo

El pipeline enriquece cada artículo/post con:

Campo Descripción
barrio_detectado Barrio de Cali mencionado en el texto
comuna_detectada Comuna correspondiente al barrio
lugares_mencionados Lista de lugares geográficos detectados
sentimiento_score Score numérico de sentimiento
sentimiento_label positivo, negativo, neutro
tipo_incidente Categoría del hecho (hurto, homicidio, etc.)

Con use_ollama_nlp: true usa Ollama local (modelo llama3.1:8b) para mejorar la extracción, con fallback automático a reglas si el modelo no responde.


Notas de desarrollo

  • Stack: Python 3.12, FastAPI 0.115+, Pydantic v2, faster-whisper 1.2, yt-dlp, APScheduler.
  • Jobs: En memoria (se pierden al reiniciar). Sin persistencia de jobs entre reinicios de la API.
  • Radio workers: Cada emisora corre en un hilo daemon. El manager controla inicio/stop.
  • PO Token: Se cachea y renueva cada 5 min automáticamente. Requiere Node.js + youtube-po-token-generator.
  • Cookies YouTube: Se guardan en disco en data/auth/youtube_cookies.txt.
  • Swagger UI: Para probar endpoints con body, usar el botón “Try it out” en /docs. Los ejemplos de cada campo aparecen precargados.
  • SSE (radio/stream): No soportado en Swagger UI. Usar curl o EventSource en JS.
# Probar SSE con curl
curl -N http://localhost:8000/radio/stream

DAGMA Emergencias Bot

Бэкенд для реагирования на экологические чрезвычайные ситуации через WhatsApp для DAGMA: транскрипция голоса с помощью Whisper, извлечение данных с LangChain и GPT-4o, автоматическая классификация степени тяжести и геолокация с PostGIS.

  • Python
  • LangChain
  • Groq
  • PostGIS
Показать оригинальный README репозитория

DAGMA Emergencias Bot 🌿

Backend inteligente para atención de emergencias ambientales vía WhatsApp, desarrollado para el DAGMA (Departamento Administrativo de Gestión del Medio Ambiente) de Cali, Colombia.

Características

  • Recepción de mensajes vía webhook de WhatsApp (Twilio)
  • Transcripción de voz con OpenAI Whisper
  • Extracción inteligente de datos con LangChain + GPT-4o
  • Clasificación automática de tipo de emergencia y nivel de gravedad
  • Geolocalización con PostGIS (coordenadas GPS o ubicación inferida)
  • Persistencia en PostgreSQL

Stack tecnológico

Componente Tecnología
Backend Python 3.11+ / FastAPI
Transcripción OpenAI Whisper
Extracción IA LangChain + GPT-4o
Base de datos PostgreSQL + PostGIS
ORM SQLAlchemy 2.0 (async)
Migraciones Alembic
Driver DB asyncpg

Estructura del proyecto

emergencias_dagma_chatbot/
├── app/
│   ├── main.py                 # Entry point FastAPI
│   ├── core/
│   │   ├── config.py           # Settings (pydantic-settings)
│   │   └── database.py         # Engine async PostgreSQL
│   ├── schemas/
│   │   └── emergencia.py       # Modelos Pydantic
│   ├── models/
│   │   └── emergencia.py       # ORM SQLAlchemy
│   ├── services/
│   │   ├── transcripcion.py    # Whisper: audio → texto
│   │   ├── extraccion.py       # LangChain: texto → datos estructurados
│   │   └── persistencia.py     # Guardar en PostgreSQL
│   └── routers/
│       └── whatsapp.py         # POST /webhook/whatsapp
├── alembic/                    # Migraciones de BD
├── tests/                      # Tests
├── .claude/                    # Config Claude Code
│   ├── rules/                  # Reglas por contexto
│   └── skills/                 # Skills especializados
├── CLAUDE.md                   # Instrucciones para Claude Code
├── TOOLS.md                    # Herramientas disponibles
├── SKILLS.md                   # Índice de skills
├── requirements.txt
└── .env.example

Instalación

1. Clonar y configurar entorno

git clone <repo-url>
cd emergencias_dagma_chatbot
python -m venv .venv

# Windows
.venv\Scripts\Activate.ps1
# Linux/Mac
source .venv/bin/activate

pip install -r requirements.txt

2. Configurar variables de entorno

cp .env.example .env
# Editar .env con tus API keys y conexión a PostgreSQL

3. Preparar PostgreSQL

CREATE DATABASE emergencias_dagma;
\c emergencias_dagma
CREATE EXTENSION IF NOT EXISTS postgis;

4. Ejecutar migraciones

alembic revision --autogenerate -m "initial"
alembic upgrade head

5. Iniciar servidor

uvicorn app.main:app --reload --port 8000

Uso

Health check

curl http://localhost:8000/health

Simular mensaje de texto

curl -X POST http://localhost:8000/webhook/whatsapp \
  -d "From=whatsapp:+573001234567" \
  -d "Body=Hay un incendio forestal en el cerro de las Tres Cruces, cerca del barrio San Antonio" \
  -d "NumMedia=0"

Simular mensaje con ubicación

curl -X POST http://localhost:8000/webhook/whatsapp \
  -d "From=whatsapp:+573001234567" \
  -d "Body=Están talando árboles ilegalmente" \
  -d "NumMedia=0" \
  -d "Latitude=3.4516" \
  -d "Longitude=-76.5320"

Datos extraídos automáticamente

El LLM analiza cada mensaje y extrae:

Campo Descripción
nombre_reportante Nombre de quien reporta
telefono Teléfono de contacto
email Correo electrónico
direccion_hechos Dirección del incidente
direccion_persona Dirección del reportante
tipo_de_emergencia Categoría (incendio, tala ilegal, contaminación, etc.)
descripcion_emergencia Descripción del incidente
descripcion_detallada Resumen ampliado con contexto inferido
ubicacion_inferida Barrio, comuna o punto de referencia
latitud / longitud Coordenadas GPS
nivel_de_gravedad alta / media / baja
requiere_atencion_inmediata true / false

Licencia

Uso interno DAGMA — Todos los derechos reservados.

PDF Presupuestos Civil

Инструмент извлечения данных из смет на гражданское строительство (анализ единичных расценок) из PDF в Excel, со скриптами проверки для консолидации анализа единичных расценок.

  • Python
  • PDF Parsing
  • Excel

CaliTrack 360

Progressive Web App для полевого учёта статуса городских инфраструктурных проектов: аутентификация через Firebase, фотофиксация и захват GPS-координат с мобильных устройств.

  • Svelte
  • Firebase
  • PWA
Показать оригинальный README репозитория

CaliTrack 360

PWA para captura de información de proyectos de infraestructura en campo.

Stack

  • Frontend: Svelte + TypeScript + Vite PWA
  • Backend: FastAPI + Python

Inicio Rápido

Frontend

cd frontend
npm install
npm run dev

Backend

cd backend
python -m venv venv
.\venv\Scripts\Activate.ps1  # Windows
pip install -r requirements.txt
uvicorn main:app --reload

Ver README.md para documentación completa.

Gestor de Proyectos

Интерактивная панель на Next.js для управления и визуализации проектов государственных инвестиций администрации Сантьяго-де-Кали с компактными метриками и едиными фильтрами.

  • TypeScript
  • Next.js
  • Vercel
Показать оригинальный README репозитория

Unidad de Cumplimiento

Un dashboard interactivo optimizado para la gestión y visualización de proyectos de inversión pública de la Alcaldía de Santiago de Cali.

🚀 Características Principales

📊 Dashboard General Optimizado

  • Layout de dos columnas: Diseño compacto que reduce 70% la altura vertical de componentes principales
  • Tarjetas de estadísticas: Métricas clave con formato ultra-compacto y texto completo visible
  • Gráficos optimizados: Visualizaciones de 120-160px de altura para máxima eficiencia espacial
  • Filtros unificados: Sistema integral sin espacios redundantes, optimizado para densidad de información

🎨 Interfaz Ultra-Compacta

  • Eliminación de espacios rojos: Reducción del 60% de áreas no utilizadas
  • Texto completo sin truncamiento: Sistema break-words que muestra información completa
  • Tablas optimizadas: Padding reducido (p-6→p-4) y eliminación de columnas redundantes
  • Distribución inteligente: Aprovechamiento máximo del espacio horizontal disponible

🗺️ Visualización Geoespacial

  • Sistema de mapas unificado: Arquitectura UniversalMapCore que soporta tanto mapas coropléticos como de puntos
  • Mapas coropléticos: Visualización de datos por comunas y barrios usando Leaflet
  • Mapas de unidades de proyecto: Visualización de equipamientos (CircleMarkers) e infraestructura vial (GeoJSON)
  • Controles de mapa avanzados:
    • Pantalla completa con manejo robusto de errores de permisos
    • Centro automático en capas visibles con animación suave
    • Iconos mejorados y estilos modernos con gradientes
  • Datos geográficos reales: Integración con archivos GeoJSON de Cali (comunas, barrios, corregimientos, veredas, equipamientos, infraestructura vial)
  • Mapas interactivos: Navegación y zoom dinámico con información contextual
  • Popups informativos: Detalles específicos al hacer clic en las áreas geográficas o unidades de proyecto
  • Carga optimizada: Sistema de cache inteligente y eliminación de duplicación de datos

📋 Gestión Optimizada de Proyectos

  • Tabla de proyectos compacta: Lista con espaciado optimizado, filtros y búsqueda sin redundancias
  • Tabla de unidades de proyecto eficiente: Gestión sin columna DETALLE, enfoque en información esencial
  • Modal de detalles streamlined: Vista completa optimizada para lectura rápida
  • Estados y progreso visuales: Seguimiento claro con gráficos compactos de alta densidad informativa

🔍 Sistema de Filtros Ultra-Eficiente

  • Búsqueda global compacta: Texto libre optimizado para respuesta rápida
  • Filtros geográficos densos: Comunas, barrios, corregimientos con máximo aprovechamiento de espacio
  • Filtros administrativos streamlined: Centro gestor, estado, fechas en formato compacto
  • Filtros personalizados optimizados: Categorías específicas con visualización eficiente
  • Gestión de filtros activos: Eliminación individual sin desperdicio de espacio

🎯 Sistema de Búsqueda Inteligente v2.1.0

  • Búsqueda Comprehensiva Multi-Categoría:

    • Búsqueda optimizada por BPIN (detección automática numérica)
    • Búsqueda en nombres completos de proyectos sin truncamiento
    • Búsqueda en centros gestores, comunas, barrios y fuentes de financiamiento
    • Búsqueda en actividades, productos y datos generales de proyectos
  • Sugerencias Inteligentes con Auto-Aplicación:

    • 16 sugerencias máximo con distribución balanceada por categoría
    • Aplicación automática de filtros: Seleccionar una comuna agrega automáticamente al filtro de comunas
    • Categorización visual: Tags de colores distintivos por tipo (BPIN: cyan, Proyecto: rosa, Comuna: azul, etc.)
    • Sistema robusto de ocultamiento: Múltiples estrategias para ocultar sugerencias (timer, mouse events, botones de emergencia)
  • Filtro Multi-Período Avanzado:

    • Selección múltiple de años específicos (2024, 2025, 2026, 2027)
    • Selección de períodos administrativos completos (2024-2027, 2020-2023, 2016-2019)
    • Validación inteligente usando rangos startDate-endDate de proyectos

🛠️ Tecnologías Utilizadas

Frontend Framework

  • Next.js 14: Framework React con App Router
  • React 18: Biblioteca de interfaz de usuario
  • TypeScript: Tipado estático para mayor robustez

Estilos y UI

  • Tailwind CSS: Framework de estilos utilitarios
  • Framer Motion: Animaciones fluidas y transiciones
  • Lucide React: Iconografía moderna y consistente
  • Radix UI: Componentes accesibles y personalizables

Mapas y Geolocalización

  • Leaflet: Biblioteca de mapas interactivos
  • React Leaflet: Integración de Leaflet con React con importación dinámica SSR-safe
  • UniversalMapCore: Arquitectura unificada para todos los tipos de mapas
  • Turf.js: Análisis y manipulación de datos geoespaciales
  • CircleMarkers: Representación optimizada de puntos de interés

Gráficos y Visualización

  • Recharts: Gráficos responsivos y personalizables
  • D3.js: Manipulación avanzada de datos para visualizaciones

Estado y Datos

  • Redux Toolkit: Gestión del estado global
  • React Hook Form: Manejo eficiente de formularios
  • Zod: Validación de esquemas de datos

Testing

  • Vitest: Framework de testing rápido
  • Testing Library: Utilities para testing de componentes React
  • JSDOM: Entorno DOM para testing

📁 Estructura del Proyecto

dashboard-alcaldia-cali/
├── src/
│   ├── app/                    # App Router (Next.js 14)
│   │   ├── layout.tsx         # Layout principal
│   │   ├── page.tsx           # Página principal del dashboard
│   │   └── globals.css        # Estilos globales
│   ├── components/            # Componentes reutilizables
│   │   ├── BudgetChart.tsx    # Gráfico de presupuesto
│   │   ├── ChoroplethMapInteractive.tsx  # Mapa coroplético con Leaflet
│   │   ├── Header.tsx         # Encabezado de navegación
│   │   ├── ProjectMapCore.tsx # Componente de mapas de proyectos
│   │   ├── ProjectMapUnified.tsx  # Contenedor unificado de mapas
│   │   ├── ProjectModal.tsx   # Modal de detalles de proyecto
│   │   ├── ProjectsChart.tsx  # Gráfico de proyectos
│   │   ├── ProjectsTable.tsx  # Tabla de proyectos
│   │   ├── ProjectsUnitsTable.tsx  # Tabla de unidades de proyecto
│   │   ├── StatsCards.tsx     # Tarjetas de estadísticas
│   │   ├── UnifiedFilters.tsx # Sistema unificado de filtros
│   │   ├── UniversalMapCore.tsx   # Componente base unificado para mapas
│   │   └── __tests__/         # Tests de componentes
│   ├── context/               # Contextos de React
│   │   ├── DashboardContext.tsx   # Estado global del dashboard
│   │   ├── DataContext.tsx    # Gestión de datos
│   │   └── ThemeContext.tsx   # Gestión de temas
│   ├── hooks/                 # Hooks personalizados
│   │   ├── useUnidadesProyecto.ts # Hook para unidades de proyecto
│   │   ├── useProjectData.ts  # Hook para datos de proyectos
│   │   └── [otros hooks...]   # Hooks adicionales para datos específicos
│   ├── lib/                   # Utilidades y configuraciones
│   │   └── leaflet-config.ts  # Configuración de Leaflet
│   ├── store/                 # Configuración de Redux
│   │   └── store.ts          # Store principal
│   ├── types/                 # Definiciones de tipos
│   │   └── kepler.d.ts       # Tipos para mapas
│   └── utils/                 # Funciones utilitarias
│       ├── coordinateUtils.ts # Utilidades para coordenadas
│       ├── geoJSONLoader.ts  # Carga optimizada de GeoJSON
│       └── keplerShims.ts    # Configuración de mapas
├── public/
│   ├── data/                 # Datos del dashboard
│   │   ├── contratos/        # Datos de contratos
│   │   ├── ejecucion_presupuestal/  # Datos presupuestales
│   │   ├── seguimiento_pa/   # Seguimiento de planes
│   │   └── unidades_proyecto/ # Datos de unidades de proyecto
│   │       ├── equipamientos.geojson     # Equipamientos urbanos
│   │       └── infraestructura_vial.geojson  # Infraestructura vial
│   └── geodata/              # Datos geográficos
│       ├── barrios.geojson   # Datos de barrios
│       ├── comunas.geojson   # Datos de comunas
│       ├── corregimientos.geojson  # Datos de corregimientos
│       └── veredas.geojson   # Datos de veredas
├── scripts/                  # Scripts de utilidad
│   ├── convert-shapefile.js  # Conversión de shapefiles a GeoJSON
│   ├── add-centro-gestor-equipamientos.js   # Scripts de datos
│   └── [otros scripts...]    # Scripts adicionales
└── [archivos de configuración]

🚦 Instalación y Configuración

Prerrequisitos

  • Node.js 18+
  • npm o yarn

Instalación

  1. Clonar el repositorio
git clone [url-del-repositorio]
cd dashboard-alcaldia-cali
  1. Instalar dependencias
npm install
# o
yarn install
  1. Configurar variables de entorno
# Crear archivo .env.local
cp .env.example .env.local
# Editar las variables según sea necesario

Variables recomendadas para caché de Unidades de Proyecto:

  • NEXT_PUBLIC_UNIDADES_CACHE_TTL_MS=3600000
  • NEXT_PUBLIC_INTERVENCIONES_CACHE_TTL_MS=3600000

Comandos Disponibles

# Desarrollo
npm run dev          # Inicia el servidor de desarrollo

# Producción
npm run build        # Construye la aplicación para producción
npm run start        # Inicia el servidor de producción

# Calidad de código
npm run lint         # Ejecuta linting
npm run test         # Ejecuta tests

📊 Funcionalidades Detalladas

Optimizaciones de Layout v1.3.0

El dashboard ha sido completamente optimizado para máxima eficiencia espacial:

  1. Vista General Ultra-Compacta: Dashboard con métricas en dos columnas, gráficos de 120px y máximo aprovechamiento del viewport
  2. Proyectos Optimizados: Tabla sin columnas redundantes, padding reducido y información densa
  3. Unidades de Proyecto Eficientes: Eliminación de columna DETALLE, redistribución de anchos optimizada
  4. Contratos Streamlined: (Preparado con diseño compacto para futuras implementaciones)
  5. Actividades Compactas: (Preparado con layout de alta densidad)
  6. Productos Optimizados: (Preparado con visualización eficiente)

Características de las Tablas Optimizadas

  • Paginación compacta: Navegación eficiente con controles de menor altura
  • Ordenamiento visual: Indicadores claros sin espacios excesivos
  • Búsqueda optimizada: Filtro de texto con diseño streamlined
  • Densidad de información: 40% más datos visibles por pantalla
  • Selección eficiente: Controles compactos para operaciones en lote

Mapas Interactivos

  • Sistema unificado: UniversalMapCore como base para todos los tipos de mapas
  • Capas intercambiables: Comunas, barrios, corregimientos, veredas y unidades de proyecto
  • Controles avanzados: Pantalla completa y centrado automático con manejo robusto de errores
  • Datos en tiempo real: Métricas actualizadas por área geográfica
  • Colores dinámicos: Visualización basada en diferentes indicadores
  • Zoom inteligente: Navegación fluida con controles intuitivos
  • CircleMarkers optimizados: Representación eficiente de equipamientos urbanos
  • GeoJSON nativo: Soporte completo para geometrías complejas

Filtros Inteligentes

  • Dependencias jerárquicas: Los barrios se filtran por comunas seleccionadas
  • Filtros múltiples: Selección de múltiples opciones por categoría
  • Búsqueda dentro de filtros: Localización rápida de opciones específicas
  • Persistencia: Los filtros se mantienen al cambiar de pestaña

🔧 Configuración Avanzada

Personalización de Temas

El proyecto incluye soporte para temas claro/oscuro:

// Uso del contexto de tema
const { theme, toggleTheme } = useTheme();

Configuración de Mapas

Los mapas utilizan configuración personalizada en src/lib/leaflet-config.ts:

// Configuración de tiles y estilos
// Bounds geográficos de Cali
// Configuración de popups y controles

Datos Mock vs Datos Reales

Actualmente el proyecto utiliza datos mock para demostración. Para integrar datos reales:

  1. Reemplazar arrays mock en src/app/page.tsx
  2. Implementar servicios API en src/services/
  3. Configurar endpoints en variables de entorno

🤝 Contribución

Estándares de Código

  • TypeScript: Tipado estricto obligatorio
  • ESLint: Configuración de Next.js
  • Prettier: Formateo automático
  • Convenciones: Nombres descriptivos y comentarios en español

Proceso de Desarrollo

  1. Crear rama feature desde main
  2. Implementar cambios con tests
  3. Verificar linting y tipos
  4. Crear Pull Request con descripción detallada

📝 Licencia

Proyecto desarrollado para la Alcaldía de Santiago de Cali.

📞 Soporte

Para reportar problemas o solicitar características:

  • Crear issue en el repositorio
  • Incluir pasos de reproducción
  • Adjuntar capturas de pantalla si es relevante

Versión: 2.1.0
Última actualización: Agosto 2025
Última corrección crítica: Filtro por nombre_proyecto - Sugerencias ya no se quedan fijas
Desarrollado con: ❤️ para la gestión pública eficiente y optimizada

Gestor de Proyectos API

REST API на FastAPI, обеспечивающий взаимодействие с инструментом отслеживания проектов, с Firebase/Firestore в качестве бэкенда данных в реальном времени.

  • Python
  • FastAPI
  • Firebase
  • Firestore
Показать оригинальный README репозитория

🚀 Gestor de Proyectos API

API REST para interoperabilidad con artefacto de seguimiento con Firebase/Firestore.

📚 Documentación Completa

🐍 Para Desarrollo Local

Guía Completa de Setup Virtual Environment

  • Configuración paso a paso con entornos virtuales
  • Configuración de Firebase y base de datos de prueba
  • Solución de problemas detallada

⚡ Para Desarrolladores Experimentados

Comandos Rápidos

  • Setup en 5 minutos
  • Comandos de desarrollo frecuentes
  • Troubleshooting rápido

⚡ Inicio Rápido

1. Configurar

git clone https://github.com/Juanpgm/gestor_proyecto_api.git
cd gestor_proyecto_api

2. Variables de Entorno

Edita .env:

FIREBASE_PROJECT_ID=tu-proyecto-id
GOOGLE_CLOUD_PROJECT=tu-proyecto-id
PORT=8000

3. Ejecutar

Con Python:

pip install -r requirements.txt
python main.py

Con Docker:

docker-compose up --build

La API estará en: http://localhost:8000

📋 Endpoints

Sistema

  • GET /health - Estado de salud de la API
  • GET /docs - Documentación Swagger interactiva
  • GET /redoc - Documentación ReDoc

Interoperabilidad con Artefacto de Seguimiento

  • GET /contratos/init_contratos_seguimiento - Datos de contratos
    • ?referencia_contrato=VALUE - Filtro por referencia
    • ?nombre_centro_gestor=VALUE - Filtro por centro gestor

Legacy (Unidades de Proyecto)

  • GET /unidades-proyecto - Todas las unidades de proyecto
  • GET /unidades-proyecto/summary - Resumen estadístico
  • GET /unidades-proyecto/calidad-datos - Métricas unificadas de calidad con historial diario

🌐 Despliegue

Railway.app (Recomendado)

  1. Conecta tu repo en railway.app
  2. Configura las variables de entorno
  3. ¡Listo!

Render.com

  1. Conecta tu repo en render.com
  2. Configura variables en el dashboard
  3. Despliega

Docker en cualquier plataforma

docker build -t gestor-proyecto-api .
docker run -p 8000:8000 --env-file .env gestor-proyecto-api

📁 Estructura

gestor_proyecto_api/
├── main.py                    # Aplicación FastAPI principal
├── database/
│   └── firebase_config.py     # Configuración Firebase/Firestore
├── api/scripts/               # Lógica de negocio
│   ├── contratos_operations.py
│   └── firebase_operations.py
├── docs/                      # 📚 Documentación completa
│   ├── README.md              # Índice de documentación
│   └── api_setup_docs/        # Guías de setup
├── .env.example              # Template de configuración
├── requirements.txt          # Dependencias Python
└── Dockerfile               # Para contenedorización

🔐 Configuración de Seguridad

  • ✅ Archivos .env excluidos del repositorio
  • ✅ Application Default Credentials para desarrollo local
  • ✅ Service Account Keys para producción
  • ✅ Variables de entorno para configuración sensible

📖 Ver documentación completa para configuración detallada.

¡Listo para usar! 🎉

DAGMA-360 Capture – снимок экрана

DAGMA-360 Capture

Развёртывание инструмента полевого сбора данных CaliTrack 360, адаптированного для DAGMA, для учёта мероприятий и технических выездов по экологическому менеджменту.

  • Svelte
  • Firebase
  • PWA
Task Tracker GobOps – снимок экрана

Task Tracker GobOps

Система отслеживания требований для администрации Сантьяго-де-Кали с фронтендом на Svelte/Vite, аутентификацией через Firebase и кроссплатформенным сквозным тестированием с Playwright.

  • Svelte
  • TypeScript
  • Firebase
  • Playwright
Показать оригинальный README репозитория

Task Tracker GobOps

Sistema de seguimiento de requerimientos para la Alcaldía de Santiago de Cali.

🚀 Inicio Rápido

1. Clonar el repositorio

git clone https://github.com/Juanpgm/task-tracker-gobops.git
cd task-tracker-gobops/frontend

2. Instalar dependencias

npm install

3. ⚠️ Configurar credenciales (IMPORTANTE - SEGURIDAD)

NUNCA subas archivos con credenciales reales al repositorio.

Configuración segura

# Copia el archivo de ejemplo
cp .env.local.example .env.local

# Edita .env.local con tus credenciales REALES
nano .env.local

Credenciales requeridas

  • Firebase Config: Obtén desde Firebase Console > Project Settings > General
  • Firebase Service Account: Descarga JSON desde Firebase Console > Service Accounts
  • URLs de API: Ya configuradas para producción

Archivos de configuración

  • ✅ .env.local → Tus credenciales reales (ignoradas por git)
  • ✅ .env.example → Template público con placeholders
  • ❌ .env → NUNCA uses este archivo (sería commiteado por error)

4. Ejecutar en desarrollo

npm run dev

5. Build para producción

npm run build

📋 Características

  • ✅ Autenticación y Control de Accesos
    • Login con Firebase Authentication
    • Sistema de roles múltiples por usuario
    • Permisos permanentes y temporales con expiración
    • Administración de usuarios y roles
    • Super admins y admins con diferentes niveles de acceso
  • ✅ Seguimiento de requerimientos con Kanban
  • ✅ Registro de visitas programadas
  • ✅ Gestión de evidencias fotográficas
  • ✅ PWA (Progressive Web App)
  • ✅ Responsive design

🔐 Sistema de Autenticación

El sistema implementa una arquitectura completa de Administración y Control de Accesos:

Características del Sistema de Auth

  1. Autenticación Firebase + Backend

    • Firebase maneja la autenticación del usuario
    • El backend valida el token y retorna información de roles/permisos
    • Sistema de doble validación para máxima seguridad
  2. Control de Accesos Granular

    • Roles múltiples: Un usuario puede tener varios roles (ej: admin_general, coordinador, operativo)
    • Permisos permanentes: Heredados de los roles asignados
    • Permisos temporales: Con fecha de expiración automática
    • Jerarquía de admins: Super Admin > Admin > Usuario
  3. Endpoints Disponibles

    • /auth/login - Login con Firebase token
    • /auth/validate-session - Validación de sesión activa
    • /auth/register - Registro de nuevos usuarios
    • /auth/google - Autenticación con Google
    • /auth/admin/users - Administración de usuarios
    • /auth/admin/roles - Administración de roles
    • Ver API_ENDPOINTS.md para la lista completa
  4. Manejo de Errores Mejorado

    • Mensajes de error específicos para cada tipo de fallo
    • Validación de formato de email y contraseña
    • Manejo de límite de intentos
    • Detección de cuentas deshabilitadas

🏗️ Arquitectura

  • Frontend: Svelte 4 + TypeScript + Vite
  • Backend APIs:
    • Auth API: https://web-production-79739.up.railway.app
    • Project API: https://gestorproyectoapi-production.up.railway.app
  • Base de datos: Firebase + APIs externas
  • PWA: Service Worker con Workbox

📡 APIs

Ver API_ENDPOINTS.md para documentación completa de endpoints.

APIs disponibles

  • Auth API (Control de Accesos):
    • Base: https://web-production-79739.up.railway.app
    • Incluye: Autenticación, administración de usuarios y roles, permisos
  • Project API (Catálogo de Proyectos):
    • Base: https://gestorproyectoapi-production.up.railway.app
    • Incluye: Unidades de proyecto, datos de seguimiento

🚀 Despliegue en Vercel

Ver DEPLOY_VERCEL.md para instrucciones completas de despliegue y configuración de variables de entorno.

Configuración rápida

# Instalar Vercel CLI
npm install -g vercel

# Configurar secretos de Firebase
vercel secrets add firebase_api_key "TU_API_KEY"
vercel secrets add firebase_auth_domain "tu-proyecto.firebaseapp.com"
vercel secrets add firebase_project_id "tu-proyecto-id"
# ... (ver DEPLOY_VERCEL.md para lista completa)

# Desplegar
vercel --prod

🔒 Seguridad

  • Credenciales sensibles excluidas del repositorio
  • Variables de entorno validadas con TypeScript
  • Autenticación JWT con Firebase
  • HTTPS obligatorio en producción
Sismo Cali Dashboard – снимок экрана

Sismo Cali Dashboard

Аварийный дашборд для инспекций пригодности зданий после землетрясения в августе 2026 года в Кали: статический фронтенд с картами Leaflet, питаемый Python-конвейером, который ежечасно очищает и публикует полевые данные.

  • Python
  • Leaflet
  • GeoJSON
  • Vercel
Показать оригинальный README репозитория

Sismo Cali — August 2026 · Building Damage Dashboard

Emergency dashboard for EDE (building habitability) inspections after the August 10, 2026 earthquake in Cali. Pure static frontend (no API/backend) deployed to Vercel, fed by a Python pipeline that reads the raw survey Excel from Google Drive.

Production URL: https://sismo-cali-dashboard.vercel.app

Layout

scripts/
  prepare_basemaps.py   One-time: simplifies basemaps/ geojsons (12MB -> <1MB),
                        repairs mojibake barrio names. Run BEFORE refresh_data.py.
  refresh_data.py       Downloads the xlsx from Drive, applies the exact cleaning
                        from data_cleaning.ipynb, spatial-joins comuna/barrio,
                        writes web/data/inspections.json + meta.json.
  basemap_utils.py      Shared name extraction + mojibake repair logic.
web/                    Static site (Leaflet, no build step). Deployed as-is.
  data/                 Generated JSON/geojson consumed by the frontend.
basemaps/               Raw source geojsons (comunas, barrios, road axes).
data_cleaning.ipynb     Source of truth for the column cleaning contract.

Refresh the data

# One-off refresh (uses Drive if reachable, falls back to the local xlsx):
python scripts/refresh_data.py

# Hourly refresh + automatic redeploy to Vercel production:
python scripts/refresh_data.py --loop 3600 --deploy

The “Actualizar datos” button in the web UI re-fetches the deployed JSON with cache-busting; new data appears there after each --deploy (or manual vercel deploy --prod from web/).

Google Drive access (required for automatic refresh)

The Drive file is currently not shared publicly, so the script falls back to the local xlsx. Enable one of:

  1. Public link — share the Drive folder/file as “Anyone with the link can view”. The script’s public download path will then work with no credentials.
  2. Service account — share the folder with sismo-cali-reader@pmegeocode-1555299726775.iam.gserviceaccount.com, download a JSON key for that service account, and set GOOGLE_APPLICATION_CREDENTIALS=<path-to-key.json> before running the script (requires pip install google-api-python-client google-auth).

Deploy

cd web
vercel deploy --prod --yes

Project: sismo-cali-dashboard (Vercel account juanpgzmz-8162).

Privacy

PII columns (email, telefono, nombre_contacto, cod_predial_catastral, matricula_profesional) are excluded from the published JSON by the pipeline.

Normalizador Sismo Cali

Интеграция двух источников данных о сейсмической чрезвычайной ситуации в Кали (оценки ущерба EDAN и полевые визиты) в единую нормализованную таблицу, ежечасно публикуемую в Google Sheets, с сопоставлением записей без общего ключа через каскад признаков с TF-IDF, нечётким сопоставлением и эмбеддингами.

  • Python
  • Pandas
  • Google Sheets API
Показать оригинальный README репозитория

Normalizador de datos — sismo Cali

Integra dos fuentes de la emergencia en una sola tabla normalizada y la publica cada hora en Google Sheets:

  • EDAN — evaluación de daños (hoja EDAN 100826 - Datos Madre)
  • Visitas — reportes de campo (respuestas de formulario)

Las dos fuentes se diligencian a mano, por personas distintas, y no comparten llave. El paquete integracion/ las cruza con una cascada de ocho niveles de evidencia (handshake de dirección, vector, puente espacial, TF-IDF, fuzzy, embeddings) y descarta todo par por debajo de un umbral de confianza.

El detalle del pipeline está en README_integracion.md; el análisis de por qué el 62% de match es el techo seguro, en INVESTIGACION_matching.md.

Qué se publica

El job escribe únicamente dos hojas del documento EDAN SISMO:

Hoja Contenido
tabla_integrada La tabla completa: todos los registros, con match y sin match. La columna fuente distingue edan+visita, solo_edan y solo_visita.
integracion_stats Todas las estadísticas de la corrida: matches por método, tasa, cobertura de coordenadas, distribución de confianza, todos los umbrales usados y la procedencia de la ejecución.

Ninguna otra hoja se toca. El publicador resuelve las hojas destino por título y verifica su sheetId contra el valor fijado en integracion/config.py: si alguien renombra o recrea una pestaña, la corrida aborta en vez de escribir en el lugar equivocado. Nunca crea, borra ni duplica hojas.

Uso local

python -m venv .venv
.venv\Scripts\activate          # Windows;  source .venv/bin/activate en Linux/macOS
pip install -r requirements.txt

Poné el key del service account en service_account.json en la raíz (está en .gitignore; nunca se commitea) o exportá GOOGLE_SERVICE_ACCOUNT_JSON con su contenido.

python run_integration.py                                  # corrida normal, Excel en output/
python run_integration.py --fresh                          # ignora el cache, relee las hojas
python run_integration.py --no-embedding                   # sin el nivel LM (más rápido)
python run_integration.py --fresh --no-export --to-sheets  # lo que corre el job por hora
pytest -q

--fresh no es opcional para publicar: sin ese flag el pipeline lee los pickles de output/cache/ y republicaría datos viejos.

Automatización — Railway

El job corre cada hora en Railway (proyecto normalizador-sismo-cali, servicio normalizador). La configuración está versionada en railway.json:

"deploy": { "cronSchedule": "0 * * * *", "restartPolicyType": "NEVER" }

Trampa importante. railway.json llega al manifest del deployment pero no configura el scheduler: Railway lee cronSchedule del service instance. Un servicio desplegado solo con railway.json construye la imagen y nunca la ejecuta — los síntomas son deployments con buildOnly: true, logs vacíos y serviceInstance.cronSchedule = null.

Después de crear el servicio o de cambiar el horario, aplicá los settings:

python scripts/railway_setup.py          # aplica y verifica
python scripts/railway_setup.py --show   # solo reporta

job.py es el entrypoint del scheduler: sin argumentos, siempre datos frescos, sin Excel, y sale con código distinto de cero si falla para que la corrida quede marcada como fallida. El contenedor debe terminar rápido — Railway saltea una ejecución si la anterior sigue corriendo.

railway logs                     # logs de la última ejecución
railway variable list            # variables del servicio
railway up                       # redesplegar tras un cambio

Secrets

GOOGLE_SERVICE_ACCOUNT_JSON está cargado como variable del servicio. Nunca entra a la imagen: .dockerignore excluye el archivo de credenciales de todas las capas.

railway variable set GOOGLE_SERVICE_ACCOUNT_JSON --stdin < service_account.json

Logs

Los logs de Railway tienen ventana de retención y no tienen estructura, así que el job guarda su propia copia en un volumen montado en /data:

Archivo Contenido
/data/logs/integracion.log Todo lo que imprimió la corrida, con timestamp por línea. Rota a los 5 MB, guarda 5 archivos.
/data/logs/runs.jsonl Una línea JSON por ejecución: estado, duración, registros publicados, matches, tasa.

Si el volumen no está montado, el job sigue corriendo con stdout solamente — loguear nunca es motivo para fallar una corrida.

GitHub Actions

.github/workflows/ci.yml corre los tests en cada push. .github/workflows/hourly.yml quedó solo como disparo manual: si tuviera cron, Railway y GitHub publicarían en las mismas dos hojas cada hora y se pisarían. Un solo scheduler a la vez.

Datos personales

Las fuentes contienen datos de personas afectadas. Este repositorio es público, así que:

  • service_account.json, output/, data/ y todo *.xlsx están en .gitignore;
  • los notebooks se commitean sin outputs (python scripts/strip_notebooks.py); CI lo verifica en cada push;
  • la tabla publicada no incluye nombres, correos ni teléfonos.

CashIn Backend

Бэкенд с приоритетом ИИ-агентов для автоматизации счетов подрядчиков в Колумбии (cuentas de cobro): FastAPI с собственным агентным движком на LiteLLM, PostgreSQL с pgvector, генерация документов PDF/DOCX, OCR и интеграция с SECOP II.

  • Python
  • FastAPI
  • PostgreSQL
  • LiteLLM
Показать оригинальный README репозитория

CashIn Backend

AI Agent-first backend for automating Colombian contractor billing (cuentas de cobro).

Cloud-agnostic — MVP deployed on Railway. No AWS/GCP/Azure dependency. Ports & Adapters architecture enables future cloud migration without touching core business logic.

Stack

⚠️ Historical/aspirational — the implemented architecture differs; see CLAUDE.md (custom CompiledGraph engine, no LangGraph/CrewAI). In particular: no LangGraph/CrewAI/langgraph-checkpoint dependency (a custom CompiledGraph engine in app/agent/engine.py is used instead), pgvector is used where available but SQLite dev/test runs fall back without it, and Langfuse is optional/inactive unless LANGFUSE_* keys are configured.

Layer Technology Purpose
Runtime Python 3.12 + FastAPI Async API framework
AI Engine Custom CompiledGraph + LiteLLM Agent workflows + LLM abstraction (100+ models)
Local LLM Ollama Zero-cost local models for dev/privacy
MCP mcp[cli] (Anthropic SDK) Agent tool servers (Gmail, Drive, Calendar)
Google APIs google-api-python-client Gmail, Drive, Calendar integration
Database PostgreSQL 16 + pgvector (optional) Primary data + semantic search on embeddings
Storage Cloudflare R2 / MinIO S3-compatible object storage
Document gen WeasyPrint + python-docx + Jinja2 PDF and DOCX generation from templates
OCR pytesseract + pdf2image Scanned document text extraction
SECOP Socrata API (data.gov.co) SECOP II public contracts (datasets jbjy-vk9h, p6dx-8zbt)
Observability Langfuse (self-hosted, optional) LLM trace logging, quality scores, cost tracking
Payments Wompi Colombian payment gateway
Deploy Railway Docker container (zero-config CI/CD)

Quick Start

# 1. Setup environment (uv + deps + pre-commit)
make setup

# 2. Start local services (PostgreSQL + MinIO + Redis)
make up

# 3. Run database migrations
make migrate

# 4. Start development server (hot-reload on :8000)
make dev

# Open http://localhost:8000/docs for API documentation

Commands

Command Description
make setup Install deps with uv + pre-commit hooks
make dev Dev server with hot-reload (:8000)
make up / make down Start/stop Docker services
make migrate Apply Alembic migrations
make migration msg="..." Generate new migration
make test Run pytest suite
make test-cov Tests + HTML coverage report (70% min)
make lint Ruff check + mypy strict
make format Auto-fix style with Ruff
make security Bandit + pip-audit
make e2e Playwright E2E tests (Phase 8)
make load-test Locust load tests

Architecture

HTTP Request → FastAPI (api/v1/) → Service Layer → Agent Engine (CompiledGraph) → LLM + DB + Storage

Ports & Adapters (cloud-agnostic)

app/adapters/
├── llm/
│   ├── port.py              # LLMPort Protocol
│   └── litellm_adapter.py   # Gemini → Groq → Ollama (fallback chain)
├── storage/
│   ├── port.py              # StoragePort Protocol
│   └── s3_adapter.py        # MinIO (dev) / R2 (prod) / any S3-compatible
├── email/
│   ├── port.py              # EmailPort Protocol
│   └── gmail_adapter.py     # Gmail API (OAuth 2.0 + Fernet-encrypted tokens)
├── drive/
│   ├── port.py              # DrivePort Protocol
│   └── drive_adapter.py     # Google Drive API
└── calendar/
    ├── port.py              # CalendarPort Protocol
    └── gcal_adapter.py      # Google Calendar API

The core (services/, agent/, models/) never imports cloud SDKs directly.

MCP Servers

mcp_servers/
├── gmail_server.py    # Tools: search_emails, get_email, send_email
├── drive_server.py    # Tools: upload_file, list_files, create_folder
└── calendar_server.py # Tools: list_events, get_event
# + filesystem_server.py (Phase 7)

Register in mcp_servers/mcp_config.json to use with Claude Code.

Project Structure

app/
├── api/        # FastAPI routes (/api/v1/)
├── agent/      # Custom CompiledGraph AI agent (nodes, prompts, tools)
├── models/     # SQLAlchemy models (18+ domain models)
├── schemas/    # Pydantic v2 schemas
├── services/   # Business logic layer
├── adapters/   # Ports & Adapters (storage, LLM, email, drive)
├── core/       # Config, DB, security, exceptions, middleware
└── main.py     # FastAPI app entry point

Environment

Copy .env.example → .env and configure:

  • DATABASE_URL — PostgreSQL connection string
  • JWT_SECRET_KEY — Min 32 chars (use scripts/generate_secrets.py)
  • S3_ENDPOINT_URL, S3_ACCESS_KEY, S3_SECRET_KEY — Storage
  • GEMINI_API_KEY / GROQ_API_KEY — LLM providers (primary: Gemini Flash, routing: Groq)
  • WOMPI_* keys — Payment gateway (optional for dev)
  • LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_HOST — Observability (optional for dev)

Deploy (Railway)

Push to GitHub → Railway auto-deploys via Dockerfile (railway.toml sets builder = "DOCKERFILE" — there is no separate Procfile; the Dockerfile CMD is the single source of truth for the start command).

  • Start: uvicorn app.main:app --host 0.0.0.0 --port $PORT --workers 1 (single worker is intentional — see below)
  • Health check: GET /health
  • PostgreSQL managed by Railway
  • Migrations/schema run in-process at startup, inside the FastAPI lifespan handler (app/main.py): Base.metadata.create_all builds the base schema (idempotent, source of truth), then Alembic is invoked as a subprocess to either stamp head (fresh create_all-built DB) or upgrade head (apply pending ALTER deltas on an already-versioned DB). There is no separate release/migration step in the deploy pipeline.
  • Single worker is intentional: with migrations running in-process at startup, multiple workers would race to run create_all/alembic stamp-or-upgrade concurrently on boot. Scale out via Railway replicas (separate instances, each running its own lifespan) rather than --workers N in-process, or extract the migration step into a dedicated release phase before increasing workers.

License

Proprietary — All rights reserved.

CashIn Frontend – снимок экрана

CashIn Frontend

Фронтенд CashIn — платформы управления счетами на оплату (cuentas de cobro) для подрядчиков: интерфейс на TypeScript для создания, проверки и отслеживания счетов, формируемых агентным бэкендом.

  • TypeScript
  • Vercel

API CataTrack

Бэкенд на FastAPI для инструмента сбора данных CataTrack DAGMA: Firestore в реальном времени, фотографии разведки в Amazon S3, захват GPS-координат и метрики через Prometheus.

  • Python
  • FastAPI
  • Firebase
  • AWS S3
Показать оригинальный README репозитория

API Artefacto 360 DAGMA

API para gestión de artefacto de captura DAGMA (Departamento Administrativo de Gestión del Medio Ambiente) basada en la arquitectura de gestor_proyecto_api.

🚀 Características

  • FastAPI: Framework moderno y de alto rendimiento
  • Firebase/Firestore: Base de datos en tiempo real
  • Amazon S3: Almacenamiento de fotos de reconocimientos
  • Captura GPS: Registro de coordenadas geoespaciales
  • Soporte UTF-8: Caracteres especiales en español
  • Monitoreo: Métricas de Prometheus
  • Documentación: Swagger UI automática

📋 Endpoints Principales

Default

  • GET / - Endpoint raíz con información básica

General

  • GET /ping - Health check simple
  • GET /health - Health check completo
  • GET /cors-test - Prueba de CORS
  • GET /test/utf8 - Prueba de caracteres UTF-8
  • GET /debug/railway - Debug para Railway
  • GET /centros-gestores/nombres-unicos - Listado de centros gestores

Monitoring

  • GET /metrics - Métricas de Prometheus

Firebase

  • GET /firebase/status - Estado de conexión Firebase
  • GET /firebase/collections - Información de colecciones
  • GET /firebase/collections/summary - Resumen de colecciones

Artefacto de Captura DAGMA

  • GET /init/parques - Inicialización de parques para DAGMA
  • POST /registrar-visita/ - Registrar visita con información de unidad de proyecto
  • GET /grupo-operativo/reportes - Obtener reportes del grupo operativo
  • DELETE /grupo-operativo/eliminar-reporte - Eliminar reporte del grupo operativo

Administración y Control de Accesos

  • POST /auth/validate-session - Validar sesión
  • POST /auth/login - Login de usuario
  • POST /auth/register - Registro de usuario
  • POST /auth/change-password - Cambiar contraseña
  • POST /auth/google - Autenticación con Google
  • DELETE /auth/user/{uid} - Eliminar usuario
  • GET /admin/users - Listar usuarios
  • GET /auth/config - Configuración de Firebase

🛠️ Instalación

  1. Clonar el repositorio

  2. Crear entorno virtual:

    python -m venv venv
    venv\Scripts\activate  # Windows
  3. Instalar dependencias:

    pip install -r requirements.txt
  4. Configurar variables de entorno:

    cp .env.example .env
    # Editar .env con tus credenciales
  5. Ejecutar la aplicación:

    uvicorn app.main:app --reload

📚 Documentación

Una vez iniciada la aplicación, accede a:

  • Swagger UI: http://localhost:8000/docs
  • ReDoc: http://localhost:8000/redoc

🔧 Configuración de Firebase

  1. Crear proyecto en Firebase Console
  2. Descargar archivo de credenciales (serviceAccountKey.json)
  3. Configurar ruta en .env:
    FIREBASE_CREDENTIALS_PATH=path/to/serviceAccountKey.json

☁️ Configuración de AWS S3 (para fotos)

  1. Crear bucket S3 llamado 360-dagma-photos
  2. Configurar credenciales AWS en .env:
    AWS_ACCESS_KEY_ID=tu_access_key
    AWS_SECRET_ACCESS_KEY=tu_secret_key
    AWS_REGION=us-east-1
    S3_BUCKET_NAME=360-dagma-photos

📝 Próximos Pasos (TODO)

  • Implementar conexión con Firebase (colección: reconocimientos_dagma)
  • Implementar subida de fotos a Amazon S3
  • Implementar eliminación de fotos en S3
  • Implementar consulta de parques desde Firebase
  • Implementar autenticación completa
  • Implementar validaciones de datos geoespaciales
  • Agregar tests unitarios para endpoints DAGMA
  • Configurar CI/CD
  • Deploy en Railway o AWS

📄 Licencia

Apache License 2.0 (basado en gestor_proyecto_api)

SSJDWH Frontend

Фронтенд аналитической платформы SyJDWH (Секретариат безопасности и юстиции Кали): приложение на React с TypeScript и Vite для работы с показателями хранилища данных по безопасности.

  • TypeScript
  • React
  • Vite
Показать оригинальный README репозитория

React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

export default tseslint.config({
  extends: [
    // Remove ...tseslint.configs.recommended and replace with this
    ...tseslint.configs.recommendedTypeChecked,
    // Alternatively, use this for stricter rules
    ...tseslint.configs.strictTypeChecked,
    // Optionally, add this for stylistic rules
    ...tseslint.configs.stylisticTypeChecked,
  ],
  languageOptions: {
    // other options...
    parserOptions: {
      project: ['./tsconfig.node.json', './tsconfig.app.json'],
      tsconfigRootDir: import.meta.dirname,
    },
  },
})

You can also install eslint-plugin-react-x and eslint-plugin-react-dom for React-specific lint rules:

// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
  plugins: {
    // Add the react-x and react-dom plugins
    'react-x': reactX,
    'react-dom': reactDom,
  },
  rules: {
    // other rules...
    // Enable its recommended typescript rules
    ...reactX.configs['recommended-typescript'].rules,
    ...reactDom.configs.recommended.rules,
  },
})

Voice2Text Reporter

Готовый к подключению модуль FastAPI для отчётов по голосовым заметкам: записывает, расшифровывает локально с faster-whisper (без платного API), сохраняет аудио в S3 или на диске и возвращает отчёт в виде структурированного JSON.

  • Python
  • FastAPI
  • Whisper
Показать оригинальный README репозитория

voice2textReporter

Python FastAPI faster-whisper License Status

Plug-and-play FastAPI module — records a voice note, transcribes it locally with faster-whisper (no API key, no cost), stores the audio in S3 or local filesystem, persists the record with timestamp and returns structured JSON.

Drop it into any FastAPI project with a single include_router() call.


Table of Contents


Features

  • 100% local transcription — no OpenAI API key, no cost, no data leaves your server.
  • Pluggable storage — local filesystem (dev) or AWS S3 (production).
  • Pluggable persistence — JSON file (zero deps) or Firebase Firestore.
  • gzip compression of uploaded audio by default (~40% size reduction).
  • iOS Safari compatible — handles video/mp4 MIME type from mobile voice notes.
  • Ports & adapters — swap backends via env vars, no code changes.

Quick start

1. Install

pip install fastapi uvicorn[standard] python-multipart faster-whisper boto3 python-dotenv aiofiles

Important: ffmpeg must be installed and on your PATH.
Windows: winget install FFmpeg
macOS: brew install ffmpeg
Ubuntu: apt install ffmpeg

2. Configure

cp .env.example .env
# Edit .env — the defaults work for local development without any changes.

3. Run the example app

uvicorn app.main:app --reload

Open http://localhost:8000/docs to explore the API.


Integration — add to your own FastAPI project

from fastapi import FastAPI
from voice2text import router           # 1. import the router

app = FastAPI()
app.include_router(router, prefix="/voice")  # 2. mount it — done

The module reads all configuration from environment variables (see below). It is entirely self-contained; it adds no global state to your application.


API Endpoints

All endpoints are mounted under the prefix you choose (default: /voice).

Method Path Description
POST /voice/records Upload audio → transcribe → save
GET /voice/records List all records
GET /voice/records/{id} Get a single record
DELETE /voice/records/{id} Delete record + audio file
GET /voice/health Health check

POST /voice/records

Content-Type: multipart/form-data

Field Type Required Description
audio file ✅ Audio file (wav, mp3, ogg, webm, m4a, mp4)
title string ❌ Human-readable label
language string ❌ Language hint (es, en, …). Auto-detected when omitted.
metadata JSON string ❌ Extra key-value pairs attached to the record

Example with curl:

curl -X POST http://localhost:8000/voice/records \
  -F "audio=@my_note.wav" \
  -F "title=Field inspection note" \
  -F "language=es"

Example response (201):

{
  "record_id": "a3f8c1d2e4b5...",
  "title": "Field inspection note",
  "text": "El árbol en la esquina está bloqueando la vía peatonal.",
  "language": "es",
  "duration_seconds": 5.4,
  "audio_url": "/audio/recordings/a3f8c1d2/audio_uuid.wav",
  "audio_key": "recordings/a3f8c1d2/audio_uuid.wav",
  "audio_filename": "my_note.wav",
  "created_at": "2026-05-14T10:23:45-05:00",
  "metadata": {}
}

Environment Variables

Variable Default Description
WHISPER_MODEL_SIZE base Whisper model: tiny / base / small / medium / large-v2
WHISPER_LANGUAGE es Default transcription language (BCP-47)
WHISPER_BEAM_SIZE 5 Beam search width — higher = more accurate, slower
WHISPER_DEVICE cpu cpu or cuda
WHISPER_COMPUTE_TYPE int8 int8 for CPU, float16 for GPU
STORAGE_BACKEND local local or s3
LOCAL_STORAGE_DIR voice2text_uploads Directory for local file storage
AWS_ACCESS_KEY_ID — AWS credentials (S3 only)
AWS_SECRET_ACCESS_KEY — AWS credentials (S3 only)
AWS_REGION us-east-1 S3 bucket region
S3_BUCKET_NAME voice2text-recordings Target S3 bucket
S3_PREFIX recordings Object key prefix inside the bucket
S3_PRESIGNED_URL_EXPIRATION 3600 Presigned URL TTL in seconds
REPO_BACKEND json json or firebase
JSON_DB_PATH voice2text_records.json Path to the JSON database file
FIREBASE_CREDENTIALS_PATH serviceAccountKey.json Path to Firebase service account JSON
FIRESTORE_COLLECTION voice_records Firestore collection name
COMPRESS_AUDIO true gzip-compress audio before uploading
VOICE2TEXT_TIMEZONE UTC IANA timezone for created_at timestamps
CORS_ORIGINS * Comma-separated allowed origins

Model size guide

Model Size Spanish WER Approx. speed (CPU)
tiny 39 MB ~15% < 0.5 s for 5 s audio
base 74 MB ~10% ~1 s for 5 s audio
small 244 MB ~7% ~3 s for 5 s audio
medium 769 MB ~5% ~8 s for 5 s audio

base is the recommended default — good quality and fast enough for real-time use.


Project Structure

voice2TextReporter/
├── voice2text/               ← The reusable module
│   ├── __init__.py           ← Exports `router`
│   ├── config.py             ← All config from env vars
│   ├── models.py             ← Pydantic v2 data models
│   ├── transcriber.py        ← Whisper singleton + transcribe()
│   ├── dependencies.py       ← DI factories (lru_cache)
│   ├── router.py             ← FastAPI APIRouter (public API)
│   ├── storage/
│   │   ├── base.py           ← BaseStorage ABC
│   │   ├── local_storage.py  ← Local filesystem backend
│   │   └── s3_storage.py     ← AWS S3 backend
│   └── repository/
│       ├── base.py           ← BaseRepository ABC
│       ├── json_repo.py      ← JSON file backend (thread-safe)
│       └── firebase_repo.py  ← Firestore backend
├── app/
│   └── main.py               ← Standalone example FastAPI app
├── tests/
│   ├── test_transcriber.py   ← Unit tests (mocked Whisper)
│   └── test_router.py        ← Integration tests (TestClient)
├── .env.example
├── .gitignore
├── requirements.txt
├── reverse-engineering-voice-transcription.md
└── README.md

Running Tests

pip install pytest httpx
pytest tests/ -v

Documentation

Full documentation lives in the docs/ folder:

Document Description
docs/QUICKSTART.md Step-by-step setup from zero to running server
docs/INTEGRATION.md How to import and mount the module in any FastAPI project
docs/API_REFERENCE.md Complete endpoint reference with request/response schemas
docs/CONFIGURATION.md All environment variables explained in detail
docs/BACKENDS.md Storage and repository backend guide (local, S3, JSON, Firestore)
reverse-engineering-voice-transcription.md Full reverse-engineering analysis of the original api-catatrack feature

License

MIT

MCP Productivity Tools

Сервер MCP (Model Context Protocol) с личными инструментами продуктивности, соединяющий ИИ-ассистентов вроде Claude с повседневными утилитами.

  • MCP
  • AI Agents

Datos SECOP Colombia

MVP для извлечения открытых данных SECOP (государственные закупки Колумбии) через API Socrata, с раздельной по доменам загрузкой процессов и контрактов в PostgreSQL с PostGIS и идемпотентными upsert-загрузками.

  • Python
  • PostgreSQL
  • PostGIS
  • Socrata API
Показать оригинальный README репозитория

contratos_warehouse

MVP para extracción de datos abiertos SECOP (Socrata) con separación por dominios:

  • src/procesos: ingesta de procesos.
  • src/contratos: ingesta de contratos.
  • src/common: utilidades compartidas (cliente API, DB, logging, settings).

Estructura

  • db/migrations/001_init.sql: tablas base con UPSERT-ready + POSTGIS.
  • scripts/run_mvp.py: ejecuta 10 requests de prueba por dataset y realiza upsert.
  • requirements.txt: dependencias del proyecto.

Uso rápido

  1. Copiar .env.example a .env y ajustar DATABASE_URL.
  2. Aplicar migración db/migrations/001_init.sql en PostgreSQL.
  3. Ejecutar:
    • ./.venv/Scripts/python.exe scripts/run_mvp.py

Bootstrap de SOCRATA_APP_TOKEN (headless)

  • scripts/bootstrap_socrata_token.py solo corre si SOCRATA_APP_TOKEN no existe en .env.
  • No persiste usuario/contraseña; las toma solo desde variables de entorno de sesión.

PowerShell:

  • $env:SOCRATA_EMAIL='tu_email'
  • $env:SOCRATA_PASSWORD='tu_password'
  • ./.venv/Scripts/python.exe scripts/bootstrap_socrata_token.py

Proyectos Cali ETL

ETL-конвейер для данных инвестиционных проектов администрации Сантьяго-де-Кали: загрузка и проверка данных в Firestore с безопасной аутентификацией через Workload Identity Federation в Google Cloud.

  • Python
  • Jupyter
  • Firebase
  • Google Cloud
Показать оригинальный README репозитория

📚 Documentación - Proyectos Cali ETL

🏗️ Configuración de Base de Datos

🔐 Firebase con Workload Identity Federation

Documentación completa para configurar Firebase usando las mejores prácticas de seguridad recomendadas por Google Cloud.

Incluye:

  • ✅ Instalación de Google Cloud CLI para Windows, Linux y macOS
  • ✅ Configuración de Workload Identity Federation
  • ✅ Setup para desarrollo, staging y producción
  • ✅ Integración con AWS, Azure y Kubernetes
  • ✅ Resolución de problemas comunes
  • ✅ Mejores prácticas de seguridad

⚡ Configuración Rápida

Guía de 5 minutos para configurar el entorno de desarrollo específico del proyecto.

Incluye:

  • ✅ Comandos específicos para el proyecto calitrack-44403
  • ✅ Variables de entorno preconfiguradas
  • ✅ Verificación automática de la configuración

🎯 Próxima Documentación (Planificada)

📊 Carga de Datos

  • Procesos ETL implementados
  • Estructura de datos en Firestore
  • Scripts de carga y verificación

🔍 Consultas y Análisis

  • Ejemplos de consultas Firestore
  • Patrones de acceso a datos
  • Optimización de rendimiento

🚀 Despliegue

  • Configuración para producción
  • CI/CD con GitHub Actions
  • Monitoreo y alertas

🆘 Inicio Rápido

  1. Primera vez: Sigue Firebase Workload Identity Setup
  2. Setup rápido: Usa Configuración Rápida
  3. Probar: Ejecuta python database/config.py

📞 Soporte

  • Configuración: Ver documentación en /docs/
  • Código: Revisar comentarios en archivos fuente
  • Issues: Crear issue en el repositorio

DAGMA Strategic Dashboard

Стратегический дашборд на Svelte для DAGMA: визуализация статуса природоохранных мероприятий и выездов, зафиксированных в поле инструментами DAGMA-360.

  • Svelte
  • TypeScript
  • Python

Gestor de Proyectos App Web

Инструмент визуализации и управления данными проектов для администрации Сантьяго-де-Кали: веб-приложение для просмотра статуса и показателей инвестиционных проектов.

  • Web
  • Data Visualization

API Dashboard Cali

API хранилища данных администрации Сантьяго-де-Кали: бюджетные данные, контракты SECOP и отслеживание проектов на FastAPI и PostgreSQL, с автоматизированным преобразованием файлов Excel в стандартизированные форматы.

  • Python
  • FastAPI
  • PostgreSQL
  • SQLAlchemy
Показать оригинальный README репозитория

🏛️ API Dashboard Alcaldía de Santiago de Cali - v2.6.0

Sistema integral de gestión de datos presupuestales, proyectos y contratos para la Alcaldía de Santiago de Cali. Proporciona una API robusta y eficiente para el manejo de información gubernamental con capacidades avanzadas de transformación y análisis de datos.

🎯 Novedades Versión 2.6.0

✅ Optimización Completa de la API

  • Modelos y Esquemas Alineados: Consistencia perfecta entre SQLAlchemy models, Pydantic schemas y estructura PostgreSQL
  • Campos Nullable Corregidos: Todos los campos críticos con nullable=False para garantizar integridad
  • Nombres Unificados: periodo_corte consistente en todas las tablas y endpoints
  • Endpoints Verificados: Funcionamiento 100% comprobado de todos los endpoints principales
  • Contratos Optimizados: JOIN simplificado con contratos_valores para mejor rendimiento

📋 Descripción del Proyecto

Este sistema está diseñado para centralizar y gestionar la información presupuestal, contractual y de seguimiento de proyectos de la Alcaldía de Santiago de Cali. Ofrece una arquitectura escalable que integra múltiples fuentes de datos y proporciona endpoints especializados para diferentes tipos de consultas y operaciones.

Funcionalidades Principales

  • Gestión Presupuestal: Manejo de movimientos y ejecución presupuestal con datos históricos
  • Contratos SECOP: Sistema optimizado para gestión de contratos con arquitectura BPIN-centric
  • Seguimiento de Proyectos: Monitoreo del Plan de Acción con métricas de avance y productos
  • Infraestructura: Gestión de unidades de proyecto, equipamientos e infraestructura vial
  • Transformación de Datos: Procesamiento automatizado de archivos Excel a formatos estandarizados
  • API RESTful: Endpoints especializados para consultas, cargas masivas y administración

🏗️ Arquitectura del Sistema

Componentes Principales

api-dashboard-db/
├── fastapi_project/           # Aplicación principal FastAPI
│   ├── main.py               # Endpoints y configuración API
│   ├── models.py             # Modelos SQLAlchemy
│   ├── schemas.py            # Esquemas Pydantic
│   └── database.py           # Configuración base de datos
├── transformation_app/       # Sistema de transformación de datos
│   ├── data_transformation_*.py  # Scripts de transformación
│   ├── app_inputs/          # Directorio de archivos de entrada
│   └── app_outputs/         # Directorio de archivos procesados
├── docs/                    # Documentación del proyecto
├── database_initializer.py # Inicialización y migración de BD
├── production_*.py         # Scripts de producción y mantenimiento
└── requirements.txt        # Dependencias del proyecto

Stack Tecnológico - Actualizado v2.6.0

  • Backend: FastAPI (Python 3.8+) con schemas Pydantic optimizados
  • Base de Datos: PostgreSQL 12+ con modelos SQLAlchemy alineados
  • ORM: SQLAlchemy con configuración nullable corregida
  • Validación: Pydantic con from_attributes=True para serialización ORM
  • Documentación: Swagger UI automático con endpoints reorganizados
  • Procesamiento: Pandas, OpenPyXL para archivos Excel

🛠️ Configuración e Instalación

Requisitos del Sistema

  • Python: 3.8 o superior
  • PostgreSQL: 12 o superior
  • RAM: Mínimo 2GB, recomendado 4GB
  • Almacenamiento: Mínimo 10GB para datos y logs
  • Herramientas: Git, Microsoft Excel o LibreOffice para archivos .xlsx

🗄️ Configuración de Base de Datos

1. Crear Base de Datos PostgreSQL

-- Conectar como superusuario
CREATE DATABASE api_dashboard_cali;
CREATE USER api_user WITH PASSWORD 'tu_contraseña_segura';
GRANT ALL PRIVILEGES ON DATABASE api_dashboard_cali TO api_user;

2. Variables de Entorno

Crear archivo .env en el directorio raíz:

# Configuración PostgreSQL
POSTGRES_USER=api_user
POSTGRES_PASSWORD=tu_contraseña_segura
POSTGRES_SERVER=localhost
POSTGRES_PORT=5432
POSTGRES_DB=api_dashboard_cali

# Para despliegue en Railway (opcional)
DATABASE_URL=postgresql://usuario:contraseña@host:puerto/database

# Configuración API (opcional)
API_HOST=0.0.0.0
API_PORT=8000
API_WORKERS=4

🚀 Instalación del Sistema

Método 1: Instalación Manual

# 1. Clonar el repositorio
git clone <repository-url>
cd api-dashboard-db

# 2. Crear entorno virtual
python -m venv env

# 3. Activar entorno virtual
# En Windows:
env\Scripts\activate
# En Linux/Mac:
source env/bin/activate

# 4. Instalar dependencias
pip install -r requirements.txt

# 5. Configurar variables de entorno
# Editar archivo .env con las credenciales correctas

# 6. ¡PASO CRÍTICO! Inicializar base de datos
python database_initializer.py

# 7. Ejecutar servidor
uvicorn fastapi_project.main:app --reload

🏗️ Database Initializer - Guía Completa Paso a Paso

📖 ¿Qué es el Database Initializer?

El database_initializer.py es el corazón del sistema de inicialización de la base de datos. Este script inteligente:

  • ✅ Detecta automáticamente si está en entorno local o Railway
  • ✅ Crea la estructura completa de base de datos usando SQLAlchemy models
  • ✅ Carga datos incrementalmente (solo datos nuevos)
  • ✅ Maneja errores automáticamente y filtra datos inválidos
  • ✅ Genera reportes detallados de métricas y estado
  • ✅ Usa UPSERT inteligente para evitar duplicados
  • ✅ Optimiza rendimiento con índices automáticos

🎯 Cuándo Usar el Database Initializer

✅ OBLIGATORIO usar en estos casos:

  • Primera instalación del sistema
  • Después de clonar el repositorio
  • Cuando agregues nuevos archivos JSON de datos
  • Para migrar datos a Railway o nueva base de datos
  • Después de cambios en models.py o schemas.py
  • Para reparar base de datos corrupta o incompleta

⚠️ OPCIONAL usar en estos casos:

  • Para cargar datos actualizados (es incremental)
  • Como verificación de integridad periódica
  • Para optimizar índices de base de datos

📋 Preparación Antes de Ejecutar

Paso 1: Verificar Estructura de Archivos

Asegúrate de tener esta estructura de directorios:

transformation_app/
├── app_outputs/
│   ├── contratos_secop_output/
│   │   ├── contratos.json
│   │   └── contratos_valores.json
│   ├── ejecucion_presupuestal_outputs/
│   │   ├── movimientos_presupuestales.json
│   │   ├── ejecucion_presupuestal.json
│   │   └── datos_caracteristicos_proyectos.json
│   ├── seguimiento_pa_outputs/
│   │   ├── seguimiento_pa.json
│   │   ├── seguimiento_productos_pa.json
│   │   └── seguimiento_actividades_pa.json
│   └── unidades_proyecto_outputs/
│       ├── unidad_proyecto_infraestructura_equipamientos.json
│       └── unidad_proyecto_infraestructura_vial.json

Paso 2: Verificar Conexión a Base de Datos

# Probar conexión directa
psql -h localhost -U api_user -d api_dashboard_cali

# O verificar variables de entorno
cat .env

Paso 3: Activar Entorno Virtual

# Windows
env\Scripts\activate

# Linux/Mac
source env/bin/activate

🚀 Ejecutando el Database Initializer

Ejecución Básica (Recomendada)

cd a:\programing_workspace\api-dashboard-db
python database_initializer.py

¿Qué Hace Durante la Ejecución?

FASE 1: Detección de Entorno (5-10 segundos)

🏛️ API Dashboard Alcaldía de Cali - Inicializador Unificado
🔧 Estructura + Datos para entornos Locales y Railway
======================================================================
INFO:__main__:🌍 Entorno detectado: Local (Desarrollo)  # O Railway
INFO:__main__:🚀 Iniciando inicialización completa de la base de datos

FASE 2: Verificación de Conexión (2-5 segundos)

INFO:fastapi_project.database:✅ Primera conexión a PostgreSQL establecida
INFO:__main__:✅ Conexión a la base de datos exitosa

FASE 3: Creación/Verificación de Estructura (10-20 segundos)

INFO:__main__:🔧 Creando estructura de tablas desde modelos SQLAlchemy...
INFO:__main__:✅ Todas las tablas creadas/verificadas desde modelos SQLAlchemy
INFO:__main__:📊 Tablas disponibles (25):
   • areas_funcionales
   • barrios
   • centros_gestores
   [... lista completa de 25 tablas ...]

FASE 4: Creación de Índices de Rendimiento (20-30 segundos)

INFO:__main__:🔧 Creando índices de rendimiento...
Creando índice: 100%|████████████████| 26/26 [00:02<00:00, 12.93índices/s]
INFO:__main__:✅ Procesamiento de índices completado (26 índices)

FASE 5: Carga de Datos (1-5 minutos dependiendo del tamaño)

INFO:__main__:📦 FASE DE CARGA DE DATOS
INFO:__main__:📋 Encontrados 10 archivos para procesar

# Para archivos ya cargados:
INFO:__main__:⏭️ contratos: Ya tiene 744 registros, se omite

# Para archivos nuevos:
INFO:__main__:📥 datos_caracteristicos_proyectos: Tabla vacía, se cargará
INFO:__main__:📥 Cargando datos_caracteristicos_proyectos.json (1.28 MB)
INFO:__main__:📊 Procesando 1,253 registros para tabla 'datos_caracteristicos_proyectos'
WARNING:__main__:⚠️ datos_caracteristicos_proyectos: 1 registros rechazados por BPIN NULL/inválido
Insertando en datos_caracteristicos_proyectos: 100%|████████| 1252/1252 [01:27<00:00, 14.29registros/s]
INFO:__main__:✅ datos_caracteristicos_proyectos: 1,252 registros cargados exitosamente

FASE 6: Resumen Final y Reporte

================================================================================
🎉 RESUMEN DE INICIALIZACIÓN COMPLETADA
================================================================================
⏱️ Duración total: 115.73 segundos
🌍 Entorno: Local (Desarrollo)
📁 Archivos procesados: 2
📊 Total registros cargados: 1,489

📋 Tablas con datos cargados (2):
   • datos_caracteristicos_proyectos: 1,252 registros
   • unidades_proyecto_infraestructura_equipamientos: 237 registros

⏭️ Tablas omitidas (8):
   • contratos: 744 registros existentes
   [... lista de tablas ya cargadas ...]

INFO:__main__:📄 Reporte completo disponible en: database_initialization_report_20250814_021348.md
✅ Base de datos completamente configurada y lista para producción
🚀 Puedes iniciar tu API con: uvicorn fastapi_project.main:app --reload

📊 Interpretando los Resultados

✅ Indicadores de Éxito

  • “✅ Conexión a la base de datos exitosa”: La conexión PostgreSQL funciona
  • “✅ Todas las tablas creadas/verificadas”: Estructura de BD correcta
  • “✅ X registros cargados exitosamente”: Datos insertados sin errores
  • “⏭️ tabla: Ya tiene X registros, se omite”: Comportamiento incremental correcto
  • “🚀 Base de datos lista para el API”: Sistema completamente funcional

⚠️ Advertencias Normales (No son errores)

  • “⚠️ X registros rechazados por BPIN NULL/inválido”: Limpieza automática de datos
  • “⏭️ tabla: Ya tiene X registros, se omite”: Carga incremental trabajando

❌ Indicadores de Error

  • “❌ Error de conexión a la base de datos”: Verificar .env y PostgreSQL
  • “❌ Error creando tablas”: Problemas con models.py o permisos de BD
  • “❌ tabla: No se pudo cargar ningún registro”: Archivos JSON corruptos o formato incorrecto

🔧 Opciones Avanzadas de Ejecución

Para Desarrollo (Recomendada)

python database_initializer.py

Para Railway (Automático)

railway run python database_initializer.py

Con Variables de Entorno Específicas

# Para forzar entorno específico
ENVIRONMENT=Railway python database_initializer.py

# Con base de datos específica
DATABASE_URL="postgresql://user:pass@host:port/db" python database_initializer.py

🛠️ Solución de Problemas del Database Initializer

Error: “No se puede conectar a PostgreSQL”

Síntomas:

❌ Error de conexión a la base de datos: connection to server at "localhost" failed

Soluciones:

# 1. Verificar que PostgreSQL esté ejecutándose
sudo service postgresql status  # Linux
# o
pg_ctl status  # Windows

# 2. Verificar variables de entorno
cat .env

# 3. Probar conexión manual
psql -h localhost -U api_user -d api_dashboard_cali

# 4. Verificar firewall y puertos
telnet localhost 5432

Error: “Archivos JSON no encontrados”

Síntomas:

📂 Archivo JSON no encontrado: transformation_app/app_outputs/.../archivo.json

Soluciones:

# 1. Verificar estructura de directorios
ls -la transformation_app/app_outputs/

# 2. Ejecutar transformaciones para generar archivos
python transformation_app/data_transformation_ejecucion_presupuestal.py
python transformation_app/data_transformation_contratos_secop.py
python transformation_app/data_transformation_seguimiento_pa.py
python transformation_app/data_transformation_unidades_proyecto.py

# 3. Verificar permisos de archivos
chmod 644 transformation_app/app_outputs/*/*.json

Error: “Registros rechazados por BPIN NULL”

Síntomas:

⚠️ unidades_proyecto_infraestructura_equipamientos: 88 registros rechazados por BPIN NULL/inválido

Explicación: Esto es NORMAL. El sistema automáticamente filtra registros con BPIN nulo porque violan las restricciones de integridad de la base de datos. Los registros válidos se cargan correctamente.

Error: “Error creando índices”

Síntomas:

⚠️ Error creando índice idx_movimientos_bpin: relation "tabla" does not exist

Soluciones:

# 1. Reinicializar con borrado de tablas
psql -d api_dashboard_cali -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
python database_initializer.py

# 2. Verificar permisos de usuario
GRANT ALL PRIVILEGES ON DATABASE api_dashboard_cali TO api_user;
GRANT ALL ON SCHEMA public TO api_user;

📈 Optimización y Mejores Prácticas

Para Mejor Rendimiento

  1. Ejecutar con SSD: El inicializador es intensivo en I/O
  2. Cerrar aplicaciones pesadas: Liberar RAM durante la carga
  3. Usar PostgreSQL local: Evitar conexiones de red lentas para desarrollo

Para Entornos de Producción

# 1. Configurar pool de conexiones más grande
# En .env:
DATABASE_POOL_SIZE=20
DATABASE_MAX_OVERFLOW=30

# 2. Ejecutar durante horas de menor tráfico
python database_initializer.py

# 3. Verificar logs posteriores
tail -f database_initialization_report_*.md

Para Actualizar Datos Regularmente

# El inicializador es seguro de ejecutar repetidamente
# Solo carga datos nuevos (incremental)
python database_initializer.py

# Para forzar recarga completa (solo si es necesario)
# 1. Truncar tablas específicas en PostgreSQL
# 2. Ejecutar inicializador

📄 Reportes Generados

Cada ejecución genera un reporte detallado:

database_initialization_report_YYYYMMDD_HHMMSS.md

Contenido del reporte:

  • Duración total de la operación
  • Entorno detectado (Local/Railway)
  • Lista detallada de tablas creadas
  • Estadísticas de registros por tabla
  • Archivos procesados y omitidos
  • Métricas de rendimiento
  • Errores y advertencias encontrados

🎯 Verificación Post-Inicialización

1. Verificar Estado de la Base de Datos

# Iniciar la API
uvicorn fastapi_project.main:app --reload

# En otra terminal, verificar salud
curl http://localhost:8000/health

# Verificar estadísticas
curl http://localhost:8000/database_status

2. Probar Endpoints Principales

# Datos caracteristicos de proyectos
curl "http://localhost:8000/datos_caracteristicos_proyectos?limit=5"

# Movimientos presupuestales
curl "http://localhost:8000/movimientos_presupuestales?limit=5"

# Contratos
curl "http://localhost:8000/contratos?limit=5"

3. Verificar Documentación API

Abrir en navegador: http://localhost:8000/docs


✅ Checklist de Verificación Final

Después de ejecutar el database_initializer.py, verificar:

  • ✅ El script terminó con mensaje “🚀 Base de datos lista para el API”
  • ✅ Se generó archivo de reporte database_initialization_report_*.md
  • ✅ La API inicia sin errores: uvicorn fastapi_project.main:app --reload
  • ✅ Health check responde OK: curl http://localhost:8000/health
  • ✅ Documentación accesible: http://localhost:8000/docs
  • ✅ Al menos 8-10 tablas tienen datos cargados
  • ✅ No hay errores críticos en los logs

¡Tu sistema está listo para producción! 🎉

📚 Documentación Detallada

Guías Específicas

Documentación por Módulos

Sistema de Transformación

📊 Estructura de Datos

Tablas Principales

Catálogos Base

  • centros_gestores: Centros gestores de la alcaldía
  • programas: Programas presupuestales
  • areas_funcionales: Áreas funcionales organizacionales
  • propositos: Propósitos de proyectos
  • retos: Retos estratégicos

Datos Operacionales

  • movimientos_presupuestales: Movimientos presupuestales por proyecto (clave: bpin + periodo)
  • ejecucion_presupuestal: Ejecución presupuestal detallada (clave: bpin + periodo)
  • contratos: Contratos SECOP con información completa (clave: bpin + cod_contrato)
  • contratos_valores: Valores financieros de contratos (clave: bpin + cod_contrato)

Seguimiento de Proyectos

  • seguimiento_pa: Resumen de seguimiento del Plan de Acción (PK auto-increment)
  • seguimiento_productos_pa: Productos del Plan de Acción (clave: cod_pd_lvl_1 + cod_pd_lvl_2)
  • seguimiento_actividades_pa: Actividades detalladas (clave: cod_pd_lvl_1 + cod_pd_lvl_2 + cod_pd_lvl_3)

Infraestructura

  • unidades_proyecto_infraestructura_equipamientos: Equipamientos por proyecto
  • unidades_proyecto_infraestructura_vial: Infraestructura vial por proyecto

Tipos de Datos Estandarizados - v2.6.0

  • BPIN: BIGINT - Códigos de proyectos de inversión
  • Períodos: VARCHAR(50) para movimientos/ejecución, VARCHAR(7) para seguimiento - Formato YYYY-MM
  • Valores monetarios: DECIMAL(15,2) - Presupuestos y pagos
  • Porcentajes: DECIMAL(5,2) - Avances y porcentajes de ejecución
  • Fechas: DATE - Formato ISO (YYYY-MM-DD)
  • Textos: TEXT - Nombres y descripciones sin límite
  • Campos críticos: nullable=False para garantizar integridad de datos

🔄 Sistema de Transformación de Datos

Procesamiento Automatizado

El sistema incluye scripts especializados para transformar archivos Excel en formatos estandarizados:

Scripts Disponibles

  1. Ejecución Presupuestal: data_transformation_ejecucion_presupuestal.py
  2. Contratos SECOP: data_transformation_contratos_secop.py
  3. Seguimiento PA: data_transformation_seguimiento_pa.py
  4. Unidades de Proyecto: data_transformation_unidades_proyecto.py

Flujo de Transformación

# 1. Colocar archivos Excel en directorio de entrada
transformation_app/app_inputs/[tipo_de_datos]_input/

# 2. Ejecutar script de transformación
python transformation_app/data_transformation_[tipo].py

# 3. Archivos JSON procesados se generan en:
transformation_app/app_outputs/[tipo_de_datos]_output/

# 4. Cargar datos a la base de datos via API
curl -X POST "http://localhost:8000/load_all_[tipo]"

Características de Transformación

  • Limpieza automática: Eliminación de símbolos monetarios, espacios y caracteres especiales
  • Validación de tipos: Conversión automática a tipos de datos correctos
  • Normalización: Estandarización de formatos de fecha, números y texto
  • Detección inteligente: Identificación automática de estructura de archivos
  • Preservación de datos: Mantiene valores originales eliminando solo formato

🌐 API y Endpoints

Documentación Interactiva

Una vez que el servidor esté ejecutándose, la documentación interactiva estará disponible en:

  • Swagger UI: http://localhost:8000/docs
  • ReDoc: http://localhost:8000/redoc
  • OpenAPI JSON: http://localhost:8000/openapi.json

Categorías de Endpoints - Actualizadas v2.6.0

1. Gestión de Catálogos

  • Centros gestores, programas, áreas funcionales, propósitos, retos
  • Operaciones: GET, POST para consulta y carga de datos

2. Datos Presupuestales (✅ Optimizados v2.6.0)

  • Movimientos y ejecución presupuestal con filtros corregidos
  • Operaciones: GET (con periodo_corte), POST (carga individual), POST (carga masiva)
  • Mejora: Campos y filtros unificados para consistencia total

3. Contratos SECOP (✅ Arquitectura BPIN-Centric v2.6.0)

  • Gestión completa de contratos y valores con JOIN optimizado
  • Operaciones: GET (con filtros avanzados), POST (carga masiva optimizada)
  • Mejora: Response unificado ContratoCompleto con valores incluidos

4. Seguimiento de Proyectos

  • Plan de Acción: resumen, productos, actividades
  • Operaciones: GET (con filtros múltiples), POST (carga masiva)

5. Infraestructura

  • Equipamientos e infraestructura vial
  • Operaciones: GET, POST, PUT, con soporte GeoJSON

6. Administración (✅ Reorganizados v2.6.0)

  • Health checks, estadísticas, información de esquemas
  • Operaciones administrativas y de mantenimiento
  • Mejora: Aparecen al final en Swagger UI para mejor organización

Ejemplos de Uso - Actualizados v2.6.0

Consultar Movimientos Presupuestales con Filtros Corregidos

curl "http://localhost:8000/movimientos_presupuestales?periodo_corte=2024-01&limit=10"

Consultar Contratos con JOIN Optimizado

curl "http://localhost:8000/contratos?bpin=2024760010156&limit=10"

Carga Masiva de Contratos (Recomendado)

curl -X POST "http://localhost:8000/load_all_contratos"

Obtener Estadísticas del Sistema

curl "http://localhost:8000/database_status"

Verificar Estado de la API

curl "http://localhost:8000/health"

🚀 Despliegue en Producción

Configuraciones Recomendadas

Desarrollo Local

uvicorn fastapi_project.main:app --reload --port 8000

Producción Básica

uvicorn fastapi_project.main:app --host 0.0.0.0 --port 8000 --workers 4

Producción con Gunicorn (Recomendado)

pip install gunicorn
gunicorn fastapi_project.main:app \
    -w 4 \
    -k uvicorn.workers.UvicornWorker \
    --bind 0.0.0.0:8000 \
    --access-logfile logs/access.log \
    --error-logfile logs/error.log

Scripts de Mantenimiento

Mantenimiento Preventivo

# Verificaciones básicas
python production_maintenance.py

# Con optimizaciones
python production_maintenance.py --optimize

# Con backup completo
python production_maintenance.py --backup --optimize

Monitoreo del Sistema

# Estado general del sistema
curl http://localhost:8000/health

# Estadísticas detalladas
curl http://localhost:8000/database_status

# Información de esquemas
curl http://localhost:8000/tables_info

📈 Rendimiento y Optimizaciones

Capacidades del Sistema - v2.6.0

  • Carga de datos: Hasta 97,000 registros en menos de 35 segundos
  • Consultas: Pool de conexiones optimizado para alta concurrencia
  • Transformación: Procesamiento de archivos Excel con millones de registros
  • Almacenamiento: Diseñado para manejar años de datos históricos
  • Integridad: Validación completa entre models, schemas y base de datos
  • Consistencia: Nombres de campos unificados en toda la aplicación

Optimizaciones Implementadas - v2.6.0

  • Índices de base de datos: En campos críticos (BPIN, períodos, códigos)
  • Bulk operations: Inserción y actualización masiva eficiente
  • Pool de conexiones: Manejo optimizado de conexiones PostgreSQL
  • Validación en capas: Pydantic + SQLAlchemy alineados para integridad de datos
  • Arquitectura BPIN-centric: Optimización específica para contratos SECOP
  • Schemas optimizados: from_attributes=True para mejor serialización ORM
  • JOIN simplificados: Eliminación de JOINs problemáticos para mejor rendimiento

🔍 Monitoreo y Logs

Sistema de Logging

  • Logs de aplicación: Registro detallado de operaciones API
  • Logs de transformación: Seguimiento de procesamiento de datos
  • Logs de mantenimiento: Histórico de operaciones de sistema
  • Logs de base de datos: Inicialización y migraciones

Archivos de Log Principales

logs/
├── database_init.log              # Inicialización de BD
├── maintenance_YYYYMMDD.log       # Mantenimiento diario
├── deployment_YYYYMMDD_HHMMSS.log # Despliegues
└── transformation_app/
    └── transformation_*.log       # Transformación de datos

Métricas Monitoreadas

  • Tiempo de respuesta de endpoints
  • Estado del pool de conexiones PostgreSQL
  • Conteo de registros por tabla
  • Espacio utilizado en base de datos
  • Conexiones activas y tiempo de vida
  • Performance de transformación de datos

🛡️ Seguridad y Buenas Prácticas

Medidas de Seguridad

  • Variables de entorno: Credenciales seguras fuera del código
  • Pool de conexiones: Límites configurados para prevenir agotamiento
  • Validación de entrada: Schemas Pydantic para todos los endpoints
  • Transacciones: Rollback automático en caso de errores
  • Logging de seguridad: Registro de operaciones críticas

Recomendaciones de Producción

  • Usar HTTPS en producción
  • Configurar firewall para PostgreSQL
  • Implementar backup automático de base de datos
  • Monitorear logs regularmente
  • Actualizar dependencias periódicamente

🐛 Solución de Problemas

Problemas Comunes y Soluciones

Error de Conexión a PostgreSQL

# Verificar configuración
python database_initializer.py

# Verificar variables de entorno
cat .env

# Probar conexión directa
psql -h localhost -U api_user -d api_dashboard_cali

Datos Inconsistentes - v2.6.0

# Verificar integridad del esquema y alineación models/schemas
curl http://localhost:8000/tables_info

# Reinicializar si es necesario (ahora con validación completa)
python database_initializer.py

# Verificar tipos de datos y campos nullable
python production_maintenance.py --optimize

Problemas de Rendimiento

# Verificar estadísticas
curl http://localhost:8000/database_status

# Optimizar base de datos
python production_maintenance.py --optimize

# Verificar logs de consultas lentas
tail -f logs/maintenance_*.log

Errores en Transformación de Datos

# Verificar formato de archivos Excel
# Revisar estructura de directorios app_inputs/
# Consultar logs específicos de transformación
tail -f transformation_app/transformation_*.log

📞 Información de Soporte

Recursos de Ayuda

  1. Documentación API: http://localhost:8000/docs
  2. Logs del sistema: Directorio logs/
  3. Health checks: http://localhost:8000/health
  4. Estado de BD: http://localhost:8000/database_status

Archivos de Configuración Importantes

  • .env: Variables de entorno
  • requirements.txt: Dependencias Python
  • database_initializer.py: Configuración de esquema
  • production_deployment.py: Script de despliegue

Desarrollado para la Alcaldía de Santiago de Cali
Sistema integral de gestión de datos gubernamentales v2.6.0
Optimizado con modelos, esquemas y API completamente alineados

Captura Reportes Empréstito

Инструмент еженедельного сбора данных об исполнении займа (empréstito) администрации Сантьяго-де-Кали, стандартизирующий периодическую отчётность о финансовом ходе проектов.

  • Data Capture
  • Reporting

Unidad de Cumplimiento

Приложение на Flutter для отслеживания и управления информацией о критически важных проектах окружной администрации Сантьяго-де-Кали с мобильных устройств и настольных компьютеров.

  • Dart
  • Flutter

Gestor Educativo

Бэкенд для управления образовательными досье (оценки, дипломы и сертификаты): FastAPI с асинхронным PostgreSQL, аутентификацией JWT, шифрованием персональных данных и генерацией документов с OCR.

  • Python
  • FastAPI
  • PostgreSQL
  • Docker
Показать оригинальный README репозитория

Gestor Educativo

Backend para gestión de expedientes educativos: notas, diplomas y certificados. Inspirado en Parchment.

Stack

Component Technology
Framework FastAPI (Python 3.11+)
Database PostgreSQL 16 + asyncpg
ORM SQLAlchemy 2.0 (async)
Auth JWT (HS256) + bcrypt
PII Encryption Fernet (AES-128-CBC)
Document Gen docxtpl + Tesseract OCR + OpenAI
Email Gmail API (OAuth2)
Deployment Docker + Railway

Quick Start

# 1. Clone and setup
git clone <repo-url>
cd gestor_educativo

# 2. Copy env file
cp secrets/.env.example secrets/.env
# Edit secrets/.env with your values

# 3. Start with Docker Compose
docker compose up -d

# 4. Run migrations
docker compose exec app alembic upgrade head

# 5. Access
# API:     http://localhost:8000
# Docs:    http://localhost:8000/docs
# PgAdmin: http://localhost:5050

Local Development (without Docker)

python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
make dev

Project Structure

app/
├── main.py             # FastAPI app entry point
├── config.py           # Settings (Pydantic BaseSettings)
├── database.py         # Async SQLAlchemy setup
├── core/               # Security, logging, middleware
├── models/             # 11 SQLAlchemy ORM models
├── schemas/            # 9 Pydantic schema files
├── api/v1/             # 9 API router files
├── services/           # Business logic (auth, cert, email, docs)
├── template_agent/     # OCR → LLM → template pipeline
└── utils/              # Encryption utilities
alembic/                # Database migrations
secrets/                # Environment variables (gitignored)
templates/              # .docx templates for document generation
docs/                   # Detailed documentation

Documentation

Document Description
Architecture System architecture and design decisions
Database Schema All tables, relationships, and ER diagram
API Reference Complete endpoint documentation
Authentication JWT auth flow and role-based access
Document Generation Template filling and mass generation
Template Agent OCR + LLM pipeline
Certification Document verification via hash + QR
Gmail Integration Email setup and sending
Deployment Docker, Railway, and cloud deployment
Security PII encryption, rate limiting, headers
Cost Monitoring LLM cost tracking

License

Private — All rights reserved.

AutoPlanosCuradurias

Расширение pyRevit, которое генерирует из модели Revit черновой комплект чертежей для получения разрешения на строительство ("curaduría") — планы этажей, фасады, разрезы, план кровли, генплан и ведомость площадей — на основе гексагональной архитектуры, с пометкой каждого листа как черновика, ожидающего профессиональной проверки.

  • Python
  • pyRevit
  • Revit API
  • Hexagonal Architecture
Показать оригинальный README репозитория

Curaduría Plan Generator

A pyRevit extension that generates a draft construction-permit (“curaduría”) drawing set — floor plans, elevations, sections, roof plan, site plan, and a cuadro de áreas (area schedule) — directly from a Revit model, following the studio’s graphic and regulatory conventions.

This tool prepares drawings. It does not replace professional review. Every sheet and every exported PDF/DWG carries a visible “draft — pending professional review” label. Output must be reviewed and signed by a licensed CPNAA/COPNIA professional (arquitecto/ingeniero) before submission to a curaduría. The tool is an interpreter of a declarative, editable catalog and configuration (not a hardcoded document generator) so that graphic and regulatory conventions can be corrected as data, not as code changes.

Architecture

Hexagonal (ports-and-adapters), running on pyRevit’s CPython 3 engine:

  • src/curaduria/domain/ and src/curaduria/application/ — pure Python, zero Autodesk.Revit imports, fully unit-testable with pytest outside Revit.
  • src/curaduria/adapters/revit/ — the only code that imports the Revit API; implements the ports the application layer depends on.
  • src/curaduria/diagnostics/ — pure report model for the Task-0 environment gate (see below); no Revit imports.
  • revit/CuraduriaPlanos.extension/ — the pyRevit extension. Each script.py does nothing but build a request, wire the real adapters, call the application use case, and render the result.

See openspec/changes/revit-curaduria-plan-generator/design.md for the full module layout, ports, data models, and architecture decisions.

Before anything else: Task-0 verification gate

Before any pipeline code is trusted, run the Task-0 gate inside the real target install (pyRevit ≥ 6.4.0 on Revit 2027) to confirm the CPython engine can reach everything this tool needs (PyYAML, DWGExportOptions, PDFExportOptions, output-folder write access). See docs/task0-verification.md.

Dev setup

Requires Python 3.11+ (bumped from the original 3.9+ once Task-0 confirmed the real target install’s CPython engine is 3.12.3 — see docs/task0-verification.md — and Unit G1’s config loader needs stdlib tomllib, which requires 3.11+).

python -m pip install -e ".[dev]"

This installs the package in editable mode plus pytest, ruff, and pre-commit.

Running tests

python -m pytest -q

Configured testpaths are tests/unit and tests/integration — both pure Python, no Revit and no Windows dependency required. The in-Revit contract suite (tests/contract/) is excluded from this default run; it is executed in-process from Revit via the SmokeTest.pushbutton command and is test-after by design (it exercises the real Revit adapters, which cannot run outside Revit).

Linting

python -m ruff check .

revit/ is excluded from lint: those scripts import pyrevit and Autodesk.Revit.*, which only resolve inside the Revit process.

Pre-commit hooks

python -m pip install pre-commit
pre-commit install
pre-commit run --all-files

Runs ruff (lint + format) and basic hygiene hooks (end-of-file, trailing whitespace, YAML syntax, merge-conflict markers) before each commit.

Installing the pyRevit extension

Copy or symlink revit/CuraduriaPlanos.extension/ into pyRevit’s extensions folder (or add its parent directory as a custom extension path in pyRevit’s settings), then reload pyRevit. Each command script prepends <repo>/src to sys.path at import time, so the extension always runs against this repo’s current src/curaduria — no separate install or symlink of the package itself is required for the extension to work inside Revit.

Commands (Curaduria tab → Planos panel):

  • Generar Set — runs a full generation against the active model.
  • Preflight — validates the model without generating anything.
  • Smoke Test — developer/CI tool; runs the adapter contract suite in-process against the fixture model.

Project status

Greenfield, Unit A (repo bootstrap) of a 10-unit chained-PR build. See openspec/changes/revit-curaduria-plan-generator/tasks.md for the full task breakdown and apply-progress.md in the same folder for current progress.