← Blog | Ingeniería 24 Mar 2026 · 16 min lectura

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

☁️ Razón #1

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.

☁️ Razón #2

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:

// Azure AI Search — una query, tres técnicas
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.

☁️ Razón #3

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.

// Un reporte SentryAI en Cosmos DB
{
  "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"]
  }
}
💰 Razón #4

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.

☁️ Razón #5

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.

C

Cadences Engineering

Documentación técnica del equipo de ingeniería