Por qué Hemos Adoptado Azure para Proyectos de IA: El Caso VallSecurity
Después de construir 10+ subsistemas de IA en Cloudflare Workers, elegimos Microsoft Azure para nuestro nuevo proyecto de seguridad privada. Esta es la historia honesta de por qué — con números, free tiers y las lecciones que nos llevamos de Cadences.
1 El contexto: 10 subsistemas de IA antes de Azure
Cadences es nuestra plataforma que integra CRM, automatización, IA y webs profesionales. Está construida 100% sobre Cloudflare Workers — edge-native, sin servidores, cold starts de 0ms, con Durable Objects, D1, Vectorize, R2 y Workers AI.
Funciona extraordinariamente bien. En serio. Pero cuando surgió la oportunidad de construir SentryAI — una plataforma de inteligencia operativa para la empresa de seguridad privada VallSecurity — nos hicimos una pregunta que rara vez nos hacemos con honestidad:
🤔 La pregunta incómoda
"¿Usamos Cloudflare porque es mejor para este proyecto, o porque es lo que conocemos?"
La respuesta fue reveladora. No es que CF fuera malo — es que Azure tenía servicios managed que ganaban por goleada en este caso de uso concreto. Veamos por qué.
2 SentryAI: Inteligencia compartida para seguridad privada
VallSecurity es una empresa de seguridad privada. Sus guardias patrullan polígonos industriales, centros comerciales y urbanizaciones. El problema: los partes de incidencias se hacen en papel, nadie los lee, y la información muere entre turnos.
SentryAI es una PWA (Progressive Web App) que reemplaza esos partes por una interfaz conversacional con IA:
Reportes por voz
El guardia habla, la IA transcribe y extrae entidades (persona, vehículo, zona, nivel de riesgo).
Detección de patrones
Si un coche sospechoso aparece en Zona A y luego en Zona C, el sistema conecta los puntos.
Chat RAG inteligente
"¿Qué pasó anoche en la zona norte?" → Respuesta con citas de reportes reales.
Alertas en tiempo real
Si la IA detecta un patrón de riesgo, alerta push a todos los guardias en servicio.
Es un proyecto con voz, búsqueda semántica, LLM, almacenamiento de audio, notificaciones en tiempo real y auth corporativo. Cada uno de esos componentes tiene implicaciones de stack.
3 Las 5 razones concretas por las que elegimos Azure
Azure AI Speech — STT nativo, streaming, 120+ idiomas
Los guardias hablan. No escriben. Y hablan con guantes, bajo lluvia, mientras caminan. Necesitamos un Speech-to-Text en tiempo real que muestre la transcripción mientras el guardia habla — no 3 segundos después.
En Cloudflare
Workers AI tiene Whisper, pero solo batch (envías audio, recibes texto). Sin streaming parcial. Para adaptar el patrón de Cadences necesitaríamos ElevenLabs + Durable Objects — costoso y complejo.
En Azure
Azure Speech SDK: WebSocket nativo, eventos recognizing (parciales) + recognized (final). Free tier: 5h/mes. SDK disponible en Python y JavaScript.
Ganador claro: Azure. No hay equivalente en CF para STT en streaming con resultados parciales.
Azure AI Search — Búsqueda híbrida managed
En Cadences construimos nuestro propio pipeline de RAG: Vectorize para embeddings, D1 para chunks, Workers AI para embeber, y todo el código de scoring y reranking a mano. Funciona bien — pero requiere mucho código nuestro.
Azure AI Search ofrece vector + BM25 + semantic ranker en un solo servicio managed:
results = search_client.search(
search_text="coche sospechoso zona norte",
vector_queries=[VectorizedQuery(
vector=embedding,
k_nearest_neighbors=5,
fields="embedding"
)],
query_type="semantic",
semantic_configuration_name="reports-semantic",
filter="zone eq 'norte' and timestamp gt 2026-03-23T00:00:00Z"
)
Esto combina búsqueda vectorial (semántica), keyword (BM25) y un reranker neuronal — todo en una llamada. En CF hacemos lo mismo, pero cada pieza es un servicio independiente conectado con código nuestro.
Free tier: 3 índices, 50MB. Suficiente para un MVP y primeros clientes.
Cosmos DB — Documentos JSON fluidos, sin migrar schemas
Un reporte de seguridad tiene datos fijos (guardia, zona, timestamp) y datos completamente variables (entidades extraídas por IA, score de riesgo, metadatos de audio, enrichment). Forzar esto en un esquema SQL es doloroso — en D1 tenemos 60+ migraciones en Cadences.
Cosmos DB es NoSQL nativo: cada documento es JSON flexible. Un reporte puede tener 3 entidades y otro 15, sin alterar ningún schema. Y el free tier incluye 1.000 RU/s y 25GB — más que suficiente.
{
"id": "RPT-20260324-001",
"guard_id": "guard-lopez",
"zone": "norte",
"transcription": "Veo individuo merodeando la valla...",
"entities": {
"subjects": [{ "description": "Hombre chaqueta roja" }],
"vehicles": [],
"risk_level": "high"
},
"triage": {
"confidence": 0.72,
"action": "escalate",
"similar_reports": ["RPT-20260323-047"]
}
}
Free tiers generosos + cuenta gratuita de Azure ($200)
Este fue el argumento killer. La cuenta gratuita de Azure incluye $200 de crédito para los primeros 30 días, 65+ servicios siempre gratis y 20+ servicios gratis durante 12 meses. Además, la mayoría de servicios que necesitamos tienen free tiers permanentes:
| Servicio | Free tier | Coste estimado/mes |
|---|---|---|
| Azure AI Speech (STT) | 5 horas/mes | $0 |
| Azure AI Search | 3 índices, 50MB | $0 |
| Cosmos DB (NoSQL) | 1.000 RU/s, 25GB | $0 |
| App Service | F1 (1GB RAM) | $0 |
| Blob Storage | 5GB | ~$0.01 |
| Azure OpenAI (GPT-4o) | — | ~$5 |
| Web PubSub | 20K mensajes/día | $0 |
| Application Insights | 5GB logs/mes | $0 |
| Total mensual estimado | ~$5/mes | |
Con los $200 de crédito inicial y los free tiers permanentes, el coste recurrente real es prácticamente ~$5/mes. Y cuando escale, los costes siguen siendo razonables porque los servicios más pesados (STT, Search, Cosmos) empiezan en free y escalan progresivamente.
Microsoft Entra ID — Auth corporativo nativo
VallSecurity ya usa Microsoft 365. Sus empleados ya tienen cuentas corporativas. Con Entra ID (Azure AD), el SSO es gratuito y nativo — los guardias se loguean con su email de empresa, y los roles (guardia, jefe de turno, director) se mapean desde AD Groups.
En Cloudflare haríamos login con Turnstile + cookies custom + nuestra base de usuarios. Funciona, pero para un cliente enterprise con 200+ empleados, el SSO corporativo no es un nice-to-have.
4 Lo que nos llevamos de Cadences: patrones que funcionan en cualquier cloud
La ventaja de haber construido 10+ subsistemas de IA en Cadences es que los patrones son portables. Los nombres de servicios cambian, la lógica no. Estos son los patrones que portamos directamente:
💡 Lección clave de Cadences
En nuestro artículo Edge-Native vs Cloud Tradicional detallamos cómo los mismos patrones arquitectónicos aplican en cualquier plataforma. SentryAI es la prueba viviente de esa tesis.
| Patrón | En Cadences CF | En SentryAI Azure |
|---|---|---|
| JSON Repair | 4 fallback layers para parsear respuestas LLM rotas | Mismo código, portado a Python |
| Single source of IDs | makeId() — un generador, sin duplicados | id_generator.py — mismo patrón |
| Respuestas estandarizadas | success(), error() | response_helpers.py |
| RAG enrichment (HyDE) | DeepSeek V3 genera preguntas hipotéticas | Azure OpenAI genera enrichment_questions |
| AlertTriage | autonomousEngine.js (risk + confidence) | intelligence.py — port completo |
| 2-phase sync | sync/changes.js — counts primero | sync.py — mismo patrón offline |
| CORS restrictivo en prod | Wildcard en dev, dominio exacto en prod | Mismo patrón en FastAPI |
✅ El resultado
El 70% del scaffolding de SentryAI fue portar código que ya habíamos validado en producción. Los patrones de Cadences nos ahorraron semanas de decisiones de diseño. El cloud cambia, la arquitectura no.
5 Arquitectura: del audio a la alerta
El pipeline es lineal y cada servicio tiene una sola responsabilidad:
🎤 Guardia habla
│
▼
┌────────────────────────┐
│ Azure AI Speech (STT) │ ← Streaming WebSocket
│ Transcripción parcial │ Eventos: recognizing → recognized
└──────────┬─────────────┘
│
▼
┌────────────────────────┐
│ Azure OpenAI (GPT-4o) │ ← Entity Extraction
│ Personas, vehículos, │ JSON estructurado via Pydantic
│ riesgo, ubicación │
└──────────┬─────────────┘
│
┌──────┼──────────────────┐
▼ ▼ ▼
Cosmos DB Blob Storage AI Search
(reporte) (audio .webm) (embedding)
│ │
└─────────┬───────────────┘
▼
┌────────────────────────┐
│ Pattern Detection │ ← Buscar reportes similares (24h)
│ AlertTriage Engine │ score > 0.80 → ALERTA
└──────────┬─────────────┘
│
▼
┌────────────────────────┐
│ Azure Web PubSub │ ← Push notification
│ → Todos los guardias │ SSE / WebSocket
│ en servicio │
└────────────────────────┘ El mismo guardia que reportó no necesita hacer nada más. La IA procesa, indexa, detecta patrones y alerta — todo en menos de 10 segundos.
6 Comparativa honesta: dónde gana cada plataforma
No es "Azure bueno, Cloudflare malo". Es cada plataforma tiene fortalezas distintas. Esta tabla refleja nuestra experiencia real construyendo en ambas:
| Aspecto | ⚡ Cloudflare | ☁️ Azure | SentryAI |
|---|---|---|---|
| Latencia global | ✅ <10ms (edge) | ⚠️ Región fija | No crítico (usuarios en España) |
| STT en streaming | ❌ Solo batch (Whisper) | ✅ Azure Speech SDK | Azure |
| Búsqueda vectorial | ⚠️ Vectorize (bueno, manual) | ✅ AI Search (managed) | Azure |
| DB flexible | ⚠️ D1 (SQL, migraciones) | ✅ Cosmos DB (NoSQL) | Azure |
| Auth enterprise | ❌ Manual (Turnstile + custom) | ✅ Entra ID (SSO) | Azure |
| Multi-tenant SaaS | ✅ D1 por org (nativo) | ⚠️ Cosmos partitions | Tenant único (VallSecurity) |
| Deploy speed | ✅ <5s (edge global) | ⚠️ ~2min (App Service) | Aceptable |
| Coste a escala | ✅ Pay-per-request | ⚠️ Reserva de capacidad | Start en free tiers |
| Cold starts | ✅ 0ms | ⚠️ Variable | Aceptable con always-on |
📊 El veredicto para SentryAI
De 9 aspectos evaluados, Azure gana en 4 que son críticos para este proyecto (STT, búsqueda, DB flexible, auth enterprise). Cloudflare gana en 4 que son menos relevantes aquí (latencia global, deploy speed, cold starts, multi-tenant). El último (coste a escala) es un empate práctico dado que empezamos con free tiers.
7 El stack final: FastAPI + Vite PWA + Azure AI
La decisión de usar Python con FastAPI en lugar de .NET fue deliberada. Para un MVP de IA, Python tiene ventaja clara: los SDKs de Azure para IA son nativos (azure-ai-search, azure-cognitiveservices-speech, openai), Pydantic genera validación + docs automáticas, y el prototipado es más rápido.
⚙️ Backend
- Python 3.11 + FastAPI
- Pydantic v2 (schemas + validation)
- 6 routers: reports, chat, alerts, shifts, dashboard, sync
- AlertTriage engine (port de Cadences)
🖥️ Frontend
- TypeScript + Vite 6 (PWA)
- Service Worker offline-first
- MediaRecorder API (grabación de audio)
- Network-first API, cache-first assets
☁️ Azure Services
AI Speech
AI Search
OpenAI (GPT-4o)
Cosmos DB
Blob Storage
Web PubSub
Entra ID
App Insights
8 Cuándo NO elegiríamos Azure (y seguiríamos en Cloudflare)
La honestidad importa. Estos son los casos donde seguiríamos eligiendo Cloudflare Workers:
🌍 Producto global con latencia crítica
Si cada milisegundo importa y tus usuarios están en 50 países, edge-native gana. SentryAI tiene guardias en España — no necesitamos 300 PoPs.
🏗️ Multi-tenant SaaS con aislamiento total
Cadences tiene una base D1 por organización — aislamiento perfecto sin particiones lógicas. Si necesitas 500 tenants con datos completamente separados, D1 es imbatible.
⚡ Deploy en <5 segundos
Wrangler despliega globalmente en segundos. Azure App Service tarda minutos. Para iteración rápida en producción, CF es superior.
💸 Escala masiva pay-per-request
10M requests/mes en Workers cuesta ~$5. En Azure Functions, los idle costs y cold starts hacen que el modelo sea menos predecible a baja carga.
🎯 La regla que seguimos
Elige el cloud por las necesidades del proyecto, no por inercia. Si necesitas STT en streaming, búsqueda híbrida managed y auth corporativo → Azure. Si necesitas latencia global, multi-tenancy nativo y deploy instantáneo → Cloudflare. Los patrones de código son los mismos.
9 Timeline: del spec al repo en una sesión
El scaffolding de SentryAI fue un ejercicio de velocidad, gracias a tener los patrones de Cadences como referencia. Todo el proyecto se concibió, diseñó y scaffoldeó en una sola sesión:
Spec: ~1.050 líneas
Arquitectura completa, modelos de datos, workflows, presupuesto, comparativa stack. Un documento que cualquier desarrollador puede leer y empezar a implementar.
Backend: FastAPI scaffold
main.py, config.py (pydantic-settings), 3 modelos Pydantic, 6 routers, AlertTriage engine completo, 3 utils portados de Cadences.
Frontend: PWA scaffold
Vite 6 + TypeScript, Service Worker con network-first para API y cache-first para assets, manifest.json, cola offline para POSTs.
Infra: Azure AI Search index
Definición del índice con 14 campos, embeddings 1536 dims, HNSW vectorial, configuración semántica con HyDE.
Deploy: 36 archivos → GitHub
Repo privado, 2.679 líneas, initial commit. Listo para empezar a implementar features reales.
10 Conclusión: no hay stack perfecto, hay decisiones informadas
Llevamos 10+ subsistemas construidos en Cloudflare y no vamos a dejar de usarlo. Cadences sigue siendo edge-native y seguirá siéndolo. Pero SentryAI necesitaba servicios que Azure ofrece mejor — STT en streaming, búsqueda híbrida managed, NoSQL flexible y auth corporativo.
La lección más valiosa es que los patrones de arquitectura son independientes del cloud. JSON repair, generadores de IDs, respuestas estandarizadas, RAG con HyDE, AlertTriage con risk/confidence — todo eso viajó en un git init desde Cadences a SentryAI.
🛡️ SentryAI para VallSecurity
Inteligencia compartida de seguridad. Reportes por voz, detección de patrones con IA, chat RAG que resume lo ocurrido y alertas en tiempo real. Todo en una PWA que funciona con guantes, bajo lluvia, en una ronda de madrugada.
Stack: Python FastAPI · Azure OpenAI · AI Search · Cosmos DB · Speech SDK · Vite PWA · Entra ID
Si este artículo te ha mostrado algo, es que elegir un cloud no es una religión. Analiza los requisitos, mapea los servicios, calcula los costes — y luego porta tus patrones probados. El código bueno viaja bien.
Cadences Engineering
Documentación técnica del equipo de ingeniería