Gestión de incidencias con un agente de IA real
CUSTOUTP evolucionó de una maqueta a un sistema funcional de extremo a extremo: backend real en Supabase con seguridad por fila, y Aura, un asistente que consulta, analiza y actúa sobre las incidencias —con confirmación— usando herramientas propias sobre la base de datos. Esta es la propuesta, contada a detalle técnico.
Míralo en acción
Un recorrido cinemático por CUSTOUTP y por Aura: del problema cotidiano a la resolución asistida por IA, con la misma identidad morada de la app.
Compuesto en Remotion · arte generativo por Higgsfield AI · 1080p, sin audio
Una plataforma para el ciclo de vida completo de cada incidencia
CUSTOUTP cubre el recorrido entero: reportar, clasificar, asignar, atender, comprar/contratar cuando hace falta, y cerrar con evidencia. Cada pantalla consume datos reales con seguridad por rol, y Aura acompaña en cada etapa.
Flujo de extremo a extremo
Incidencia → triage por prioridad y categoría → asignación a técnico → órdenes de trabajo → compras o contratación externa → recepción con acta → cierre. Todo con historial de estados auditable.
Seguridad por fila (RLS)
Postgres con Row Level Security: cada usuario solo ve y modifica lo que su rol permite. La identidad la impone el servidor; ni la UI ni el agente pueden saltársela.
Aura, el agente protagonista
Un agente de IA real (API de Anthropic) que lee, analiza, hace triage, redacta y —con tu confirmación— ejecuta acciones sobre la base de datos mediante herramientas propias.
Qué cambió respecto a la app original de la documentación
La propuesta inicial describía la experiencia y el contrato de datos. Esta iteración la vuelve real y funcional: se construyó el backend, la seguridad, el almacenamiento, el agente y toda la inteligencia operativa. Estos son los saltos principales.
Maqueta con datos simulados (mock) en pantalla.
Backend real en Supabase: 38 tablas, datos sembrados con varios meses de historia.
Sin autenticación ni control de acceso.
Auth real + Row Level Security por rol; 6 cuentas demo listas.
Adjuntos figurados.
Supabase Storage real con URLs firmadas y políticas por bucket.
Sin asistencia inteligente.
Aura: agente de IA con 23 herramientas sobre la BD, con confirmación de escrituras.
Alertas y avisos estáticos.
Motor de alertas inteligentes a puro código (reglas R1–R8) que abren chats con Aura.
Sin resúmenes operativos.
Briefings diarios por rol, generados en código, ampliables con Aura.
Un solo modo de IA (o ninguno).
Selector de 3 niveles (Nova/Clara/Chispa → Opus/Sonnet/Haiku).
Rendimiento sin optimizar.
Streaming con Suspense, code-splitting, deduplicación de queries y carga diferida.
Una app por rol, 16 pantallas, un solo modelo de datos
El acceso enruta a cada persona a su panel según su perfil funcional. Todas las vistas comparten el mismo backend y respetan RLS; el agente vive en todas ellas como una superficie flotante.
Gestión local
gestion_localReporta y da seguimiento a las incidencias de su unidad.
Técnico ejecutor
tecnicoAtiende órdenes de trabajo y registra evidencias.
Supervisor
supervisorAsigna, escala y vigila SLA y carga del equipo.
Compras
comprasSolicitudes, cotizaciones y contrataciones externas.
Dirección
direccionIndicadores globales, costos ejecutivos y reportes.
Administración
adminUsuarios, roles, catálogos y configuración del sistema.
App Router + Server Components
Datos resueltos en el servidor (respetando cookies/RLS), islas cliente solo donde hay interacción. Menos JavaScript, primer pintado más rápido.
16 pantallas por dominio
Dashboard, incidencias, órdenes, compras, contrataciones, supervisión, reportes, notificaciones, perfil y administración — cada una con su capa de datos dedicada.
Agente omnipresente
Aura se monta una vez en el layout y está disponible en todas las pantallas, con contexto del perfil ya resuelto en el servidor.
La base de datos vive en Supabase
Un Postgres gestionado con Auth, Row Level Security, Storage y Realtime. El esquema se aplica por migraciones versionadas y los embeds usan constraints con nombres reales (fk_*). En total, 40 tablas organizadas por dominio.
Postgres gestionado
Migraciones 0001–0004; índices únicos en claves naturales para upserts idempotentes.
RLS + Auth
Trigger que vincula auth.users con la fila de usuario; políticas por rol y por entidad.
Storage
Buckets privados para evidencias, documentos de contratación y actas; URLs firmadas.
Realtime
Base lista para suscripciones en vivo a cambios de estado y notificaciones.
Incidencias
incidencias, historial_estados, asignaciones, comentarios, evidencias.
Órdenes de trabajo
ordenes_trabajo, estados_orden, técnicos asignados.
Compras y contratación
solicitudes_compra, cotizaciones, contrataciones_externas, proveedores, actas.
Usuarios y roles
usuarios, entidades, roles, perfiles_funcionales, usuarios_roles.
Catálogos
estados, prioridades (con SLA), categorías, ubicaciones.
Alertas y briefings
alertas_descartes, briefings_diarios_vistos, notificaciones.
Las 40 tablas reales agrupadas por dominio. Filtra, busca y expande cada tabla para ver sus columnas, tipos, claves y relaciones (FK). Los conteos son los datos sembrados actuales en vivo.
Usuarios y roles
· 5 tablasCatálogos y estructura
· 12 tablasIncidencias
· 7 tablasidbigintcodigo_incidenciavarcharUNIQUEtitulovarchardescripciontextcategoria_idbigint→ categorias_incidenciaprioridad_idbigint→ prioridadesestado_idbigint→ estados_incidenciaubicacion_idbigint→ ubicacionesreportado_porbigint→ usuariosentidad_actual_idbigint→ entidadeslinea_actual_idbigint→ lineas_atencionsupervisor_actual_idbigint→ usuariostecnico_actual_idbigint→ usuariosrequiere_compraboolnot nullrequiere_contratacionboolnot nullproveedor_actual_idbigint→ proveedores_externostecnico_externo_actual_idbigint→ tecnicos_externosfecha_creaciontimestamptzfecha_asignaciontimestamptzfecha_inicio_atenciontimestamptzfecha_resolucion_tecnicatimestamptzfecha_cierretimestamptzfue_escaladaboolnot nullnivel_escalamientobigintsolucion_resumentextobservaciones_generalestextcreated_at, updated_at (timestamptz)Órdenes de trabajo
· 1 tablasCompras y contrataciones
· 9 tablasTransversales
· 4 tablasIA · Alertas · Briefings
· 2 tablasAura: lee, analiza y actúa —con tu confirmación
Aura corre contra la API de Anthropic con un bucle manual de herramientas sobre la base de datos. Las lecturas se ejecutan al momento; las escrituras nunca se ejecutan solas: se proponen y requieren tu confirmación. Todo respeta tu identidad y tus permisos (RLS).
Bucle de herramientas con streaming
El modelo razona, llama herramientas y la respuesta llega token a token por NDJSON. Hasta 8 iteraciones por turno, con chips de “Consultando…”.
Confirmar antes de escribir
Cualquier acción que modifique datos se muestra como tarjeta de confirmación; solo al aprobar se ejecuta vía un endpoint dedicado. Cero sorpresas.
Identidad en el servidor
La clave de IA vive solo en el servidor; el usuario_id lo pone el backend, no el modelo. Las queries usan el cliente con la sesión → RLS.
Aura Chispa
claude-haiku-4-5Consultas rápidas e instantáneas.
Aura Clara
claude-sonnet-4-6Equilibrio: el día a día y las alertas. Por defecto.
Aura Nova
claude-opus-4-8Razonamiento máximo para decisiones complejas.
El usuario elige el nivel desde el chat (se guarda su preferencia). Las alertas y briefings abren en Aura Clara (Sonnet) por defecto. Detalle importante: Haiku no admite “thinking” adaptativo, así que su configuración se construye aparte para no fallar.
buscar_incidenciasleeBusca por texto, estado, prioridad o área.
obtener_incidencialeeDetalle completo de una incidencia + historial.
kpisleeIndicadores: abiertas, escaladas, por estado/prioridad y costos.
buscar_ordenesleeÓrdenes de trabajo por técnico o estado.
catalogosleeEstados, prioridades, categorías y ubicaciones.
analizar_cotizacionesleeCompara cotizaciones (mín/mediana/máx). Scoring determinista.
sugerir_clasificacion_documentoleePropone el tipo de un documento subido.
listar_documentosleeDocumentos y evidencias adjuntos.
briefing_diarioleeBriefing del día por rol (misma fuente que el código).
crear_incidenciaproponeCrea una incidencia ya clasificada.
cambiar_estado_incidenciaproponeMueve la incidencia de estado.
asignar_tecnicoproponeAsigna o reasigna técnico.
agregar_comentarioproponeAñade un comentario público/interno.
seleccionar_cotizacionproponeSelecciona una cotización (rechaza las hermanas).
rechazar_cotizacionproponeRechaza una cotización con motivo.
pedir_cotizacionproponeSolicita una nueva cotización a un proveedor.
registrar_documentoproponeRegistra metadatos de un documento subido.
validar_evidenciaproponeAprueba o rechaza una evidencia.
triage_incidenciaproponeAsigna prioridad/categoría/línea inicial.
escalar_incidenciaproponeEscala a otra línea/entidad con motivo.
programar_ordenproponePrograma una orden de trabajo.
aprobar_solicitud_compraproponeAprueba una solicitud de compra.
actualizar_estado_contratacionproponeAvanza el estado de una contratación.
Las de lectura se ejecutan al momento; las de escritura se proponen y solo se ejecutan al confirmar.
Aura no es una ventana aislada: está cosida a la operación. Estos son los puntos donde aparece y lo que hace en cada uno.
Botón flotante (todas las pantallas)
Abre el chat con el contexto del perfil ya resuelto en el servidor.
Campana de alertas → “Indagar con Aura”
Abre Aura con el prompt de la alerta (en nivel Clara por defecto) para diagnosticar y accionar.
Briefing del dashboard → “Ampliar/Atender con Aura”
Profundiza el resumen del día y propone próximos pasos.
Detalle de incidencia → “Analizar con Aura”
Diagnostica, hace triage, escala o genera la orden —con confirmación.
Asignación → “Sugerir técnico con Aura”
Recomienda a quién asignar según carga y especialidad.
Compras / Contrataciones → “Recomendar con Aura”
Analiza cotizaciones y propone la selección (rechaza hermanas).
Subida de documentos → “Pedir ayuda a Aura”
Sugiere el tipo del documento y lo registra.
Reportes / Notificaciones / Perfil / Admin
Interpreta indicadores, trió avisos y responde consultas en lenguaje natural.
El ciclo de vida de una incidencia, y los ojos que lo vigilan
Cada incidencia recorre un camino claro de 8 etapas sobre 5 estados reales. En paralelo, un motor de alertas a puro código (8 reglas deterministas) vigila los puntos críticos y, cuando algo se sale de cauce, abre un chat con Aura para indagar y actuar.
Toca cada etapa para ver qué ocurre, qué tablas de la base de datos se tocan, dónde participa Aura y qué alertas vigilan ese punto.
Reporte
→ PendienteCualquier miembro de la UTP crea la incidencia (qué pasó, dónde). Nace en estado Pendiente con su código correlativo.
Tablas
incidenciasubicacionesAura (tools)
crear_incidenciaAlertas que vigilan
No usan IA para detectar: son reglas deterministas sobre los datos (con RLS), así que son explicables y auditables. La IA entra después: cada alerta abre Aura con un prompt que diagnostica y propone la acción correcta —con confirmación. Filtra por rol para ver qué recibe cada quien.
P1 sin asignar
P1_SIN_ASIGNARIncidencia de prioridad P1, sin técnico asignado y aún no cerrada.
asignar_tecnicoGestión localSupervisorDirecciónSLA de respuesta en riesgo
SLA_RESPUESTA_EN_RIESGOIncidencia abierta sin primera atención que ya consumió ≥ 80% de su SLA de respuesta.
Sube a crítica si ≥ 100%.
triage_incidenciaGestión localSupervisorDirecciónSLA de resolución vencido
SLA_RESOLUCION_VENCIDOIncidencia abierta más horas que su SLA de resolución (P1 24h · P2 48h · P3 168h).
triage_incidenciaGestión localSupervisorDirecciónEscalada sin atención
ESCALADA_SIN_ATENCIONIncidencia escalada, abierta y sin movimiento por más de 24 h (o sin asignación registrada).
escalar_incidenciaSupervisorDirecciónOrden vencida
ORDEN_VENCIDAOrden de trabajo con fecha programada en el pasado, sin fecha de fin y no cerrada.
programar_ordenTécnicoSupervisorSolicitud estancada
SOLICITUD_COMPRA_ESTANCADASolicitud de compra en estado 'solicitada' o 'aprobada' por más de 72 h sin avanzar.
Sube a alta si > 120 h.
aprobar_solicitud_compraComprasDirecciónContratación por finalizar
CONTRATACION_POR_FINALIZARContratación 'en ejecución' que finaliza en ≤ 72 h, o que ya venció sin pasar a 'finalizada'.
Sube a alta si ya venció.
actualizar_estado_contratacionSupervisorComprasDirecciónCotización faltante
COTIZACION_FALTANTESolicitud de compra 'solicitada' que aún no tiene ninguna cotización registrada.
pedir_cotizacionComprasCómo está programado todo esto
Aquí no hay humo: cada pieza es código real. Explora el mapa conceptual —Aura en el centro, los conceptos orbitando— y luego baja al detalle: lenguajes, el modelo de programación, cómo se construyen las herramientas de la IA, en qué se basa el prompt caching y qué papel juega el NLP.
Pasa el cursor o toca un nodo · arrastra la vista con el cursor
NLP · Transformer
Tokeniza el lenguaje natural y, vía atención, deduce intención y la traduce a acciones.
Cuatro lenguajes con un papel claro cada uno, sobre un stack moderno de TypeScript en todo el camino.
TypeScript
Front + agenteTipado estricto de extremo a extremo: UI, capa de datos y el agente Aura. Los tipos de la base de datos se derivan del esquema (types/db.ts), así un cambio de columna se ve en compilación.
SQL · PL/pgSQL
Base de datosMigraciones versionadas (0001–0004) definen 40 tablas, constraints fk_*, triggers (set_updated_at, handle_new_user) y funciones SECURITY DEFINER que sostienen las políticas RLS.
GLSL
ShadersEl fragment shader del login (raymarching de una metaball) y los efectos se escriben a mano en GLSL, ejecutados por WebGL en la GPU. Cero dependencias 3D.
Kotlin · XML
App AndroidEl concepto original incluye una app Android nativa con vistas XML (restricción dura: sin Jetpack Compose), hablando con la misma base Supabase vía supabase-kt.
Servidor por defecto
Casi todo son Server Components: los datos se consultan en el servidor con la sesión del usuario (RLS) y se envía HTML, no la lógica. El cliente solo hidrata pequeñas islas.
Frontera cliente/servidor
Regla dura: un componente cliente no puede importar código que toque next/headers. Por eso la capa de Storage está partida en cliente-seguro y solo-servidor.
Streaming NDJSON
La respuesta del agente viaja como líneas JSON (una por evento): texto, razonamiento, chips de herramienta y propuestas de acción, renderizadas en vivo.
Cada herramienta es una declaración JSON Schema (nombre, descripción y input_schema) que se envía al modelo. El modelo no ejecuta nada: solo decide qué herramienta llamar y con qué argumentos. La ejecución la hace el servidor con el cliente Supabase de la sesión, así que RLS se aplica siempre.
- Lecturas: se ejecutan en el acto durante el streaming y el resultado vuelve al modelo.
- Escrituras: NO se ejecutan en el chat. El servidor responde
PENDIENTE_DE_CONFIRMACIONy emite una propuesta; solo corren vía/api/agent/executeal confirmar. - La identidad (
usuario_id) la inyecta el servidor desde la sesión; el modelo solo propone el contenido, nunca quién es. - El orden de las 23 tools es estable (las nuevas van al final) para no invalidar el prompt cache.
export const TOOLS: Anthropic.Tool[] = [
{
name: "buscar_incidencias",
description:
"Lista incidencias visibles para el usuario…",
input_schema: {
type: "object",
properties: {
texto: { type: "string" },
estado_codigo: { type: "string" },
prioridad_codigo:{ type: "string" },
solo_abiertas: { type: "boolean" },
limite: { type: "integer" },
},
required: [],
},
},
// … 22 más (lecturas + escrituras)
];for (let iter = 0; iter < MAX_ITERACIONES_TOOL; iter++) {
const stream = client.messages.stream({
model: cfgTier.model, // nivel elegido (Opus/Sonnet/Haiku)
system: sesion.sistema, // [estable + cache_control] + [dinámico]
tools: TOOLS_CACHEADAS, // 23 defs, cache_control en la última
messages: convo,
});
// …reemite deltas de texto y razonamiento…
const final = await stream.finalMessage();
if (final.stop_reason !== "tool_use") break;
for (const block of final.content) {
if (block.type !== "tool_use") continue;
if (esEscritura(block.name)) {
enviarPropuesta(block); // → confirmación en la UI
} else {
const data = await ejecutarLectura( // ejecuta YA (con RLS)
block.name, block.input, sesion.ctx,
);
// …se devuelve al modelo como tool_result…
}
}
}En cada petición, una parte del prompt es idéntica: las instrucciones del sistema (~900 tokens) y las 23 definiciones de herramientas (~3.600 tokens). Marcar ese prefijo con cache_control: ephemeral hace que Anthropic lo guarde: a partir de la 2ª petición se lee de caché (~10% del precio de entrada) en vez de re-procesarlo.
- En qué se basa: un prefijo estable y un punto de corte. Todo lo que cambia (perfil, fecha) va después del bloque cacheado para no invalidarlo.
- Resultado: ~40% más barato por interacción y menor latencia (TTFT), porque el modelo no relee el prefijo enorme cada vez.
- Disciplina: el orden de las tools y del system no debe cambiar; por eso las herramientas nuevas se añaden al final.
export function construirSistema(ctx): TextBlockParam[] {
return [
// 1) ESTABLE → se cachea (idéntico en cada petición)
{
type: "text",
text: SISTEMA_ESTABLE, // instrucciones de Aura
cache_control: { type: "ephemeral" },
},
// 2) DINÁMICO → NO cacheado (perfil, unidad, fecha ISO)
{
type: "text",
text: bloqueDeSesion(ctx),
},
];
}
// Las 23 tools (TOOLS_CACHEADAS) llevan cache_control
// en la última definición → todo el bloque es prefijo cacheado.El Procesamiento de Lenguaje Natural es el puente entre cómo habla una persona y lo que la base de datos entiende. El modelo Claude es, en el fondo, un transformer: convierte tu frase en tokens, usa el mecanismo de atención para captar la intención y las entidades (qué incidencia, qué acción, qué prioridad), y traduce todo eso a una llamada de herramienta estructurada. Ese es el corazón de Aura: NLP que no solo «responde», sino que opera —y como los datos salen de herramientas reales, no inventa cifras.
Lenguaje natural
“¿Qué incidencias P1 siguen abiertas en mi área?”
PASO 1Tokens + atención
El transformer entiende intención y entidades.
PASO 2Tool-use estructurado
Elige buscar_incidencias con sus argumentos.
PASO 3Ejecución con RLS
El servidor consulta Supabase con tu sesión.
PASO 4Respuesta fundamentada
Genera la explicación con datos reales.
PASO 5Por qué importa para la UTP: el NLP democratiza el sistema — cualquiera pregunta en español llano y obtiene respuestas accionables, sin aprender a usar filtros ni SQL. Y como cada dato pasa por una herramienta con RLS, la respuesta es precisa, auditable y dentro de los permisos de cada persona.
Costo bajo y controlable, con caché de prompts
El costo depende del nivel elegido y del volumen de uso. El sistema cachea el prompt y las definiciones de herramientas (gran descuento sobre la entrada repetida), y el nivel por defecto (Sonnet) ya es muy capaz y barato. La estimación detallada por interacción y por escenario mensual para la UTP se presenta a continuación.
Costo por interacción (con caché)
Prefijo cacheado de ~4.500 tok (system + 23 tools) + ~3.300 tok no cacheados + salida.
| Nivel | Modelo | Por interacción |
|---|---|---|
| Chispa | Haiku 4.5 | ~$0.0063 |
| Clara (def.) | Sonnet 4.6 | ~$0.029 |
| Nova | Opus 4.8 | ~$0.064 |
Costo mensual para la UTP
22 días hábiles. Por nivel, sin mezclar.
| Escenario | Chispa | Clara | Nova |
|---|---|---|---|
| Ligero · 1.1k/mes | ~$7 | ~$32 | ~$70 |
| Medio · 6.6k/mes | ~$42 | ~$191 | ~$420 |
| Intenso · 33k/mes | ~$208 | ~$957 | ~$2.1k |
En la práctica la UTP no usaría Opus para todo. Con esa mezcla el costo baja a ~$0.015 por interacción: piloto de una facultad ~$16/mes, despliegue medio ~$98/mes, y toda la UTP ~$492/mes. El prompt caching ya activo ahorra ~40% por interacción; los briefings/alertas no interactivos pueden ir por la Batches API (−50%).
Aura también puede correr con modelos gratuitos en la nube
Como el modelo es configurable, Aura no está atada a un proveedor. Para una adopción sin costo en la UTP, se propone una capa que permita usar modelos cloud gratuitos o muy baratos —como NVIDIA Nemotron (V3 Ultra) vía NIM, y opciones de OpenRouter, Groq, Google Gemini o Cerebras— siempre que soporten tool calling y streaming, que es lo que Aura necesita.
NVIDIA Nemotron · NIM
Modelos abiertos potentes con capa gratuita en la nube de NVIDIA. Candidato fuerte para razonamiento y herramientas sin costo de API.
OpenRouter / Groq / Gemini
Capas gratuitas con límites de tasa; útiles para demos y uso institucional moderado, con calidad cercana a la de referencia en muchas tareas.
Cambio de proveedor transparente
La selección de modelo ya está centralizada; añadir un adaptador por proveedor permite alternar entre Claude (calidad máxima) y modelos gratuitos (costo cero) sin tocar la UI.
| Proveedor | Modelos | Capa gratis | Tools + stream | Calidad vs Claude | Privacidad |
|---|---|---|---|---|---|
| NVIDIA NIM | Nemotron (V3 Ultra/Super), Llama, DeepSeek | ~40 RPM · todo el catálogo | Sí · function-calling top | Nemotron ≈ Sonnet | No entrena (verificar prod) |
| Groq | Llama 3.3 70B, Llama 4 | 30 RPM · 1k–14k/día | Sí | ≈ Haiku–Sonnet · ultrarrápido | No usa datos del free |
| Cerebras | Llama 3.3 70B, Qwen3 | 1M tok/día · ctx 8k | Sí | ≈ Haiku/Sonnet · 2.000+ tok/s | Revisar retención |
| Google Gemini | 2.5 Flash / Pro | 10–15 RPM · 100–1k/día | Sí (nativo) | Flash ≈ Sonnet · Pro ≈ Opus | ⚠ Entrena con prompts (free) |
| Mistral | Large / Small | ~1.000M tok/mes · 5 RPS | Sí | Large ≈ Sonnet | EU · GDPR-friendly |
| OpenRouter | DeepSeek R1, Llama, Qwen :free | 20 RPM · 50–1k/día | Parcial (por modelo) | Variable | Depende del backend |
Aura necesita tool-calling y streaming; todos exponen API compatible con OpenAI.
Cambiar de proveedor = pocas líneas
El modelo ya se resuelve por entorno (ANTHROPIC_MODEL + tabla CONFIG_TIER) y nunca se confía el id crudo del cliente.
- Base URL + clave por variables de entorno (drop-in OpenAI).
- Cliente: SDK de OpenAI apuntando al proveedor.
- Shape de tools (el único trabajo real): mapear las 23 definiciones a
functionyJSON.parsede los argumentos. - Streaming SSE; el resto del loop (RLS, confirmación) no cambia.
Tabla de decisión
| Objetivo | Elección | Costo |
|---|---|---|
| Producción · calidad · datos seguros | Claude Sonnet/Haiku | ~$16–500/mes |
| Demo gratis veloz | Cerebras / Groq (Llama 3.3) | $0 |
| Demo gratis mejor tools | NVIDIA NIM (Nemotron) | $0 |
| Volumen sostenido gratis | Cerebras / Mistral | $0 |
| Privacidad / soberanía | Mistral (EU) / NIM | $0 free |
| No usar con datos reales | Gemini free (entrena) | $0 ⚠ |
Qué gana la Universidad Tecnológica de Panamá
Operación
- Trazabilidad total: cada incidencia tiene historial, evidencias y responsables claros.
- Menos cuellos de botella: alertas inteligentes y triage asistido reducen el tiempo de respuesta.
- SLA bajo control: prioridades con tiempos y vigilancia automática de vencimientos.
- Compras ordenadas: cotizaciones comparadas y contrataciones con acta de recepción.
Dirección e IA
- Indicadores ejecutivos y costos reales para decidir con datos.
- Aura democratiza el análisis: cualquiera pregunta en lenguaje natural y obtiene respuestas fundamentadas.
- Adopción sin costo posible gracias a modelos gratuitos en la nube.
- Base moderna y escalable (Supabase + Next.js) lista para crecer con la institución.
Entra al prototipo y velo funcionando
Todo lo descrito aquí está vivo: backend real, seguridad por rol y Aura lista para ayudarte. Usa una de las cuentas demo y explora.
Entrar al prototipo