- Descripción
- Características Principales
- Arquitectura Tecnológica
- Prerrequisitos
- Instalación y Configuración
- Estructura del Proyecto
- Casos de Uso Principales
- API Endpoints
- Integraciones
- Seguridad y Autenticación
- Contribución
- Licencia
UrbanAI es una plataforma integral de gestión urbana inteligente que cierra la brecha entre la ciudadanía y el Estado. A diferencia de las aplicaciones de reportes tradicionales, UrbanAI se constituye como una infraestructura crítica de gobernanza diseñada bajo un modelo de "Compliance-First" (Cumplimiento Normativo).
La solución combina Inteligencia Artificial para la detección técnica de incidentes con una capa de validación humana (Ediles), garantizando datos estructurados y veraces. Operativamente, se integra de forma nativa con los ecosistemas del Estado (X-Road, SECOP II, Autenticación Digital), permitiendo a las administraciones pasar de una gestión reactiva a una Gobernanza Anticipatoria, mientras habilita mecanismos de financiación colaborativa para micro-intervenciones comunitarias.
- Compliance-First: Diseñado desde el principio para cumplir con normativas estatales
- Validación Dual: IA + Validación humana (Ediles)
- Gobernanza Anticipatoria: De la reactividad a la previsión inteligente
- Financiación Colaborativa: Micro-intervenciones comunitarias habilitadas
- Análisis automático de incidentes mediante Google Gemini AI
- Clasificación inteligente en 5 categorías principales (A-E) con 18 subcategorías
- Detección técnica de problemas urbanos mediante análisis de imágenes
- Generación de descripciones técnicas automáticas
- Ciudadanos: Reporte de incidentes con geolocalización
- Ediles (Líderes): Validación y gestión territorial de incidentes
- Organizaciones: Visualización de analytics y estadísticas
- Administradores: Gestión completa del sistema
- Estructura territorial completa: Departamentos → Municipios → Corregimientos
- Filtrado geográfico de incidentes por niveles administrativos
- Asignación territorial de ediles
- Visualización en mapas con coordenadas precisas
- A. Infraestructura Vial y Peatonal: Vías, aceras, pasos peatonales, ciclovías
- B. Servicios Públicos e Iluminación: Alumbrado, servicios, señalización
- C. Espacio Público y Mobiliario: Parques, mobiliario, zonas verdes
- D. Medio Ambiente y Riesgo: Residuos, contaminación, estructuras en riesgo
- E. Movilidad y Tráfico: Semaforización, transporte, congestión
- Keycloak para autenticación y autorización
- JWT Tokens con validación robusta
- Roles y permisos granulares
- Integración con autenticación digital del Estado
- MinIO para gestión de imágenes y documentos
- Almacenamiento escalable y de alta disponibilidad
- URLs presignadas para acceso seguro a recursos
- SECOP II: Consulta de contratos públicos en tiempo real
- Geografía oficial: Datos estructurados de división territorial
- X-Road Ready: Preparado para interoperabilidad con sistemas del Estado
UrbanAI está construido siguiendo los principios de Clean Architecture con patrones avanzados:
┌─────────────────────────────────────────────────┐
│ WebAPI Layer (Controllers) │
│ ┌───────────────────────────────────────────┐ │
│ │ Application Layer (CQRS + Mediator) │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ Infrastructure Layer (Repositories) │ │ │
│ │ │ ┌───────────────────────────────┐ │ │ │
│ │ │ │ Domain Layer (Entities) │ │ │ │
│ │ │ └───────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
Core Framework
- .NET 8 SDK
- ASP.NET Core Web API
- Entity Framework Core 8.0
Patrones de Diseño
- Clean Architecture
- CQRS (Command Query Responsibility Segregation)
- Mediator Pattern
- Repository Pattern
- Unit of Work
Base de Datos
- PostgreSQL 17 (Base de datos principal)
- Redis (Caché distribuido)
- Entity Framework Core con Code-First Migrations
Autenticación y Seguridad
- Keycloak (Identity & Access Management)
- JWT Bearer Tokens
- OAuth 2.0 / OpenID Connect
Almacenamiento
- MinIO (Object Storage S3-compatible)
- Almacenamiento distribuido de imágenes y documentos
Inteligencia Artificial
- Google Gemini AI (gemini-1.5-flash)
- Análisis de imágenes y clasificación automática
Validación y Testing
- FluentValidation
- xUnit (Unit Testing)
Infraestructura
- Docker & Docker Compose
- Contenedores para todos los servicios
Antes de comenzar, asegúrate de tener instalados:
- .NET 8 SDK - Descargar
- Docker Desktop - Descargar
- PostgreSQL Client (opcional, para gestión de BD)
- Git - Descargar
- Visual Studio 2022 (Community o superior)
- JetBrains Rider
- VS Code con extensiones de C#
Asegúrate de que los siguientes puertos estén disponibles:
5000- API Backend (HTTP)5001- API Backend (HTTPS)5432- PostgreSQL18080- Keycloak9000- MinIO Console9001- MinIO API6379- Redis
git clone https://github.com/darcdev/urbanAI.git
cd urbanAINavega al directorio de infraestructura y levanta los servicios con Docker Compose:
cd backend/Urban.AI/infrastructure
docker-compose up -dEsto levantará:
- PostgreSQL (Base de datos principal)
- Keycloak (Autenticación)
- MinIO (Almacenamiento de objetos)
- Redis (Caché)
- Accede a Keycloak:
http://localhost:18080 - Credenciales por defecto:
- Usuario:
admin - Password:
admin
- Usuario:
- Importa el realm desde:
infrastructure/resources/application-realm-export.json
El realm urbanai ya viene preconfigurado con:
urbanai-auth-client: Cliente para autenticación de usuariosurbanai-admin-client: Cliente administrativo para gestión
Edita los archivos de configuración según tu entorno:
appsettings.Development.json (Backend)
{
"ConnectionStrings": {
"DefaultConnectionDb": "Host=localhost;Port=5432;Database=urbanai;Username=postgres;Password=postgres;",
"RedisConnection": "localhost:6379"
},
"Gemini": {
"ApiKey": "YOUR_GEMINI_API_KEY_HERE"
},
"Minio": {
"Host": "localhost:9000",
"Username": "rootadmin",
"Password": "rootadmin",
"IsSecureSSL": false
}
}Desde el directorio raíz del backend:
cd backend/Urban.AI/src/Urban.AI.Infrastructure
# Crear la migración inicial
dotnet ef migrations add InitialCreate --startup-project ../Urban.AI.WebApi
# Aplicar migraciones
dotnet ef database update --startup-project ../Urban.AI.WebApicd backend/Urban.AI/src/Urban.AI.WebApi
dotnet restore
dotnet build
dotnet runEl API estará disponible en:
- HTTP:
http://localhost:5000 - HTTPS:
https://localhost:5001 - Swagger:
http://localhost:5000/swagger
Ejecuta los siguientes endpoints para poblar datos iniciales:
# Semillar categorías de incidentes
POST http://localhost:5000/api/v1/incidents/seed-categories
Authorization: Bearer {admin-token}
# Semillar datos geográficos (Departamentos, Municipios, Corregimientos)
POST http://localhost:5000/api/v1/geography/seed
Authorization: Bearer {admin-token}urbanAI/
├── backend/
│ └── Urban.AI/
│ ├── src/
│ │ ├── Urban.AI.Domain/ # Entidades, Value Objects, Interfaces
│ │ │ ├── Users/
│ │ │ ├── Incidents/
│ │ │ ├── Leaders/
│ │ │ ├── Organizations/
│ │ │ ├── Geography/
│ │ │ └── Common/
│ │ │
│ │ ├── Urban.AI.Application/ # Casos de Uso (CQRS)
│ │ │ ├── Auth/ # Login, Register, WhoAmI
│ │ │ ├── Incidents/ # CRUD + AI Analysis
│ │ │ ├── Leaders/ # Gestión de Ediles
│ │ │ ├── Organizations/ # Gestión de Organizaciones
│ │ │ ├── Geography/ # Datos Territoriales
│ │ │ ├── Categories/ # Categorías de Incidentes
│ │ │ ├── Secop/ # Integración SECOP
│ │ │ └── Common/ # Abstractions (ICommand, IQuery)
│ │ │
│ │ ├── Urban.AI.Infrastructure/ # Implementaciones
│ │ │ ├── Database/
│ │ │ │ ├── Mappings/ # EF Core Configurations
│ │ │ │ └── Repositories/ # Implementación de Repositorios
│ │ │ ├── Auth/ # Keycloak Integration
│ │ │ ├── AI/ # Gemini AI Service
│ │ │ ├── Storage/ # MinIO Service
│ │ │ ├── Email/ # Email Service
│ │ │ └── ExternalServices/ # SECOP, etc.
│ │ │
│ │ └── Urban.AI.WebApi/ # Controllers, Configurations
│ │ ├── Controllers/
│ │ ├── Configurations/
│ │ └── Program.cs
│ │
│ ├── infrastructure/
│ │ ├── docker-compose.yml # Servicios de infraestructura
│ │ ├── keycloak.env
│ │ ├── postgres.env
│ │ ├── minio.env
│ │ └── resources/
│ │ └── application-realm-export.json
│ │
│ ├── docs/ # Documentación técnica
│ │ ├── GEMINI_AI_INTEGRATION.md
│ │ ├── SECOP_INTEGRATION.md
│ │ ├── ORGANIZATION_CREATION_SETUP.md
│ │ └── MIGRATION_GUIDE.md
│ │
│ └── tests/
│ └── Urban.AI.UnitTests/
│
└── frontend/ # (Frontend - TBD)
POST /api/v1/auth/register
Content-Type: application/json
{
"firstName": "Juan",
"lastName": "Pérez",
"email": "juan.perez@example.com",
"password": "SecurePass123!",
"confirmPassword": "SecurePass123!"
}POST /api/v1/auth/login
Content-Type: application/json
{
"email": "juan.perez@example.com",
"password": "SecurePass123!"
}POST /api/v1/incidents
Authorization: Bearer {token}
Content-Type: multipart/form-data
{
"title": "Hueco en vía principal",
"description": "Hueco grande en la Calle 72 con Carrera 15",
"latitude": 4.6533,
"longitude": -74.0836,
"departmentId": "uuid",
"municipalityId": "uuid",
"image": (binary file)
}El sistema automáticamente:
- Analiza la imagen con Gemini AI
- Clasifica en categoría y subcategoría
- Genera descripción técnica
- Asigna al edil territorial correspondiente
GET /api/v1/incidents/geography?departmentId={uuid}&municipalityId={uuid}
Authorization: Bearer {token}POST /api/v1/leaders
Authorization: Bearer {admin-token}
Content-Type: application/json
{
"firstName": "María",
"lastName": "González",
"email": "maria.gonzalez@alcaldia.gov.co",
"password": "SecurePass123!",
"phoneNumber": "+573001234567",
"departmentId": "uuid",
"municipalityId": "uuid",
"townshipId": "uuid"
}POST /api/v1/organizations
Authorization: Bearer {admin-token}
Content-Type: application/json
{
"firstName": "Carlos",
"lastName": "Ramírez",
"email": "carlos.ramirez@organizacion.org",
"password": "SecurePass123!",
"organizationName": "Fundación Desarrollo Urbano"
}GET /api/v1/secop/search/code/{contractCode}
Authorization: Bearer {token}GET /api/v1/secop/search/date-range?startDate=2024-01-01&endDate=2024-12-31
Authorization: Bearer {token}Una vez el servidor esté ejecutándose, accede a:
- Swagger UI:
http://localhost:5000/swagger - ReDoc:
http://localhost:5000/redoc(si está habilitado)
| Módulo | Método | Endpoint | Descripción |
|---|---|---|---|
| Auth | POST | /api/v1/auth/register |
Registro de ciudadano |
| Auth | POST | /api/v1/auth/login |
Autenticación |
| Auth | GET | /api/v1/auth/whoami |
Información del usuario actual |
| Incidents | POST | /api/v1/incidents |
Crear incidente |
| Incidents | GET | /api/v1/incidents |
Listar todos los incidentes |
| Incidents | GET | /api/v1/incidents/geography |
Filtrar por geografía |
| Incidents | GET | /api/v1/incidents/leader |
Incidentes del edil |
| Incidents | PATCH | /api/v1/incidents/{id}/status |
Actualizar estado |
| Leaders | POST | /api/v1/leaders |
Crear edil (Admin) |
| Leaders | GET | /api/v1/leaders |
Listar ediles |
| Leaders | PUT | /api/v1/leaders/{id} |
Actualizar edil |
| Organizations | POST | /api/v1/organizations |
Crear organización (Admin) |
| Categories | GET | /api/v1/categories |
Listar categorías |
| Categories | POST | /api/v1/categories/seed |
Semillar categorías |
| Geography | GET | /api/v1/geography/departments |
Listar departamentos |
| Geography | GET | /api/v1/geography/municipalities/{deptId} |
Municipios por departamento |
| Geography | GET | /api/v1/geography/townships/{munId} |
Corregimientos por municipio |
| Geography | POST | /api/v1/geography/seed |
Semillar datos geográficos |
| Secop | GET | /api/v1/secop/search/code/{code} |
Buscar contrato |
| Secop | GET | /api/v1/secop/search/date-range |
Buscar por fechas |
Modelo: gemini-1.5-flash
Funcionalidad: Análisis automático de imágenes de incidentes urbanos
Proceso:
- Usuario sube imagen del incidente
- Imagen se envía a Gemini AI con prompt estructurado
- IA clasifica en categoría y subcategoría
- Genera descripción técnica detallada
- Sistema almacena análisis en BD
Configuración:
{
"Gemini": {
"ApiKey": "YOUR_API_KEY",
"Model": "gemini-1.5-flash",
"TimeoutSeconds": 30
}
}API: licitaciones.info
Funcionalidad: Consulta de contratos públicos en tiempo real
Capacidades:
- Búsqueda por código de contrato
- Búsqueda por rango de fechas
- Información detallada de contratos
- Cronograma de eventos
Casos de Uso:
- Transparencia en contratación pública
- Seguimiento de obras relacionadas con incidentes
- Analytics de inversión pública por territorio
Estructura:
- Departamentos (32 departamentos)
- Municipios (~1,100 municipios)
- Corregimientos/Veredas
Fuente: Datos oficiales de división territorial de Colombia
Realm: urbanai
Clientes configurados:
urbanai-auth-client: Autenticación de usuariosurbanai-admin-client: Gestión administrativa
Roles:
Admin: Administrador del sistemaLeader: Edil territorialOrganization: Organización/EntidadUser: Ciudadano
Buckets:
incidents: Imágenes de incidentesdocuments: Documentos generales
Funcionalidades:
- Generación de URLs presignadas
- Almacenamiento escalable
- Compatibilidad S3
UrbanAI implementa un modelo de seguridad robusto basado en:
- Tokens JWT emitidos por Keycloak
- Validación de tokens en cada request
- Refresh tokens para sesiones prolongadas
| Rol | Permisos |
|---|---|
| Admin | Gestión completa del sistema, creación de ediles y organizaciones |
| Leader | Validación de incidentes en su territorio, actualización de estados |
| Organization | Visualización de analytics y reportes |
| User | Creación de incidentes, consulta de sus reportes |
[Authorize(Roles = "Admin")] // Solo administradores
[Authorize(Roles = "Leader,Admin")] // Ediles y administradores
[Authorize] // Cualquier usuario autenticado- Contraseñas hasheadas con bcrypt
- Conexiones HTTPS en producción
- Validación de entrada con FluentValidation
- Protección contra SQL Injection (EF Core parametrizado)
- CORS configurado por dominio
UrbanAI está diseñado desde el principio para cumplir con:
- Normativas de protección de datos personales
- Estándares de interoperabilidad estatal
- Protocolos de transparencia y rendición de cuentas
Ciudadano reporta → IA analiza y clasifica → Edil valida → Estado actúa
Beneficios:
- Datos estructurados y confiables
- Reducción de reportes falsos
- Clasificación técnica precisa
- Responsabilidad territorial clara
Antes: Esperar quejas → Investigar → Actuar
Con UrbanAI:
- Detección temprana mediante IA
- Analytics predictivo de zonas críticas
- Asignación proactiva de recursos
- Planificación basada en datos reales
# Backend
cd backend/Urban.AI/src/Urban.AI.WebApi
dotnet watch run
# Con hot reload
dotnet watch --no-hot-reload runcd backend/Urban.AI/tests/Urban.AI.UnitTests
dotnet testcd backend/Urban.AI/src/Urban.AI.Infrastructure
dotnet ef migrations add MigrationName --startup-project ../Urban.AI.WebApi
dotnet ef database update --startup-project ../Urban.AI.WebApiEl proyecto sigue los principios de Clean Code y SOLID:
- Nombres descriptivos en inglés
- Métodos pequeños y enfocados
- Separación de responsabilidades
- Uso extensivo de patrones de diseño
Consulta la carpeta /docs para documentación técnica detallada:
- GEMINI_AI_INTEGRATION.md - Integración de IA
- SECOP_INTEGRATION.md - Integración SECOP
- ORGANIZATION_CREATION_SETUP.md - Creación de organizaciones
- LEADER_CREATION_SETUP.md - Creación de ediles
- MIGRATION_GUIDE.md - Guía de migraciones
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
- Sigue la arquitectura Clean Architecture existente
- Escribe tests para nuevas funcionalidades
- Documenta cambios importantes
- Usa conventional commits
- Código en inglés, documentación en español
- Yuberley - Arquitectura y Desarrollo Backend - @Yuberley
- darcdev - Desarrollo y Documentación - @darcdev
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
- Comunidad .NET
- Google Gemini AI
- Keycloak Team
- PostgreSQL Community
- Todos los contribuidores y usuarios de UrbanAI
¿Tienes preguntas o necesitas ayuda?
- Issues: GitHub Issues
- Email: urbanai.notifications@gmail.com
UrbanAI - Cerrando la brecha entre ciudadanía y Estado 🏙️
Hecho con ❤️ en Colombia