Cómo empaquetamos el SDK VEXKIO en 5.4KB con WebAssembly
Un SDK de emotion AI que pesa menos que un favicon. Contamos las decisiones de ingeniería: WASM, carga diferida, cuantización y tree-shaking agresivo.
Por Diego Ramírez
Un SDK de IA emocional que pesa 5.4KB gzipped suena imposible. Tres años atrás nosotros pensábamos lo mismo. Hoy corre en producción sobre cientos de miles de sesiones mensuales. Acá contamos cómo lo logramos.
El punto de partida: 2.3MB era inaceptable
La primera versión del SDK pesaba 2.3MB comprimidos. Incluía runtime de ONNX, un modelo facial sin cuantizar y polyfills para navegadores antiguos. Descargar eso en una red 3G colombiana tomaba 14 segundos. Inaceptable para un widget de checkout o un modal de onboarding.
Tres decisiones que cambiaron todo
Revisamos cada byte del bundle. Tres cambios concentraron el 90% de la reducción:
- WebAssembly en lugar de ONNX Runtime Web: escribimos nuestro propio intérprete de inferencia en Rust compilado a WASM. 180KB menos, y 2.3x más rápido en Chrome estable.
- Cuantización INT8 del modelo facial: pasamos de FP32 a INT8 con calibración post-entrenamiento. El modelo OMEGA cayó de 11MB a 2.8MB, con solo 0.3 puntos porcentuales de pérdida en F1.
- Carga diferida del modelo: el SDK base (5.4KB) solo contiene el bootstrap y el contrato de API. El modelo se descarga cuando el usuario acepta el permiso de cámara.
Qué hay adentro de esos 5.4KB
El bundle mínimo contiene:
- Detector de capacidades del navegador (WebGL, WASM, WebRTC).
- Loader asíncrono del runtime WASM.
- Contrato TypeScript tipado de las 14 IAs.
- Suscripción a eventos de los 5 estados.
- Fallback a modo degradado si WASM no está disponible.
Nada más. Ni un solo polyfill para IE11. Ni una dependencia de lodash. Ni un shim de fetch.
El truco del tree-shaking agresivo
Usamos Rollup con configuración pure-module y marcamos cada export del SDK con anotaciones /* @__PURE__ */. Los bundlers de nuestros clientes —Webpack, Vite, esbuild— eliminan en build time las IAs que no se usan.
Un cliente que solo usa Emotions API sobre facial nunca descarga el código de Signs o Voice. El bundle final en su sitio pesa aún menos que los 5.4KB del paquete base, porque solo importa lo que invoca.
Benchmarks reales
Medimos sobre un Samsung Galaxy A34 en red 4G típica de Bogotá:
- Descarga SDK base: 180ms
- Descarga modelo cuantizado: 1.1s
- Primera inferencia: 230ms después de permitir cámara
- Latencia estable: 78ms por frame a 30 FPS
- Consumo de memoria: 34MB en el tab del navegador
Comparado con cargar un JPEG de hero grande, el SDK es más liviano. Literalmente.
Lo que no hicimos
No sacrificamos precisión por tamaño. La cuantización INT8 fue validada contra el modelo FP32 en 12 mil muestras de test. Las decisiones del motor de fusión siguen siendo las mismas. Si el tamaño hubiera requerido degradar los 5 estados, no lo habríamos hecho.
Conclusión
Un SDK pequeño no es estética, es adopción. Los equipos de front-end rechazan dependencias pesadas. A 5.4KB, la conversación cambia: ya no hay tradeoff entre emotion AI y rendimiento.
Pruebe el SDK con Emotions API y mida usted mismo el impacto en Lighthouse.