Visión general de IA
wu.ai es una capa de IA que vive junto al framework, no dentro de él. Es BYOL (trae tu propio LLM): fetch() puro, cero dependencias, sin SDK de proveedor. Tú la apuntas a OpenAI, Anthropic, Ollama o tu propio proxy, y ella normaliza el resto.
wu.ai.provider('openai', { endpoint: '/api/ai/chat', model: 'gpt-4o' });
wu.ai.action('addToCart', { description: 'Add an item to the shopping cart', parameters: { productId: { type: 'string', required: true } }, handler: async (params, api) => { api.emit('cart:add', params); return { added: params.productId }; },});
const { content } = await wu.ai.send('Add two units of SKU-42 to my cart');Se carga de forma perezosa
Sección titulada «Se carga de forma perezosa»wu.ai es un Proxy. Nada de la capa de IA (~80 KB) entra en tu bundle principal hasta que la primera llamada la toca. El proxy mantiene funcionando la API síncrona y encadenable antes de que llegue el chunk:
| Acceso | Antes de que cargue el chunk |
|---|---|
provider, action, trigger, capability, workflow, removeApp, init |
Se encolan en orden y devuelve el proxy, así que el encadenado funciona |
abort, destroy, confirmTool, rejectTool, fireTrigger |
Se encolan y devuelven undefined |
stream, agent, runWorkflow |
Devuelve un generador asíncrono que espera a la carga y luego delega |
context, conversation, permissions |
Un sub-proxy que encola las llamadas a métodos |
send, json, intent, execute y cualquier otra cosa |
Devuelve una Promise que se resuelve tras la carga |
tools() |
Devuelve [] — no se encola, la llamada simplemente se pierde |
expose() |
Devuelve false — no se encola |
getStats() |
Devuelve { initialized: false, lazy: true } |
then |
undefined, a propósito |
Fuerza la carga y obtén la instancia real:
const ai = await wu.aiReady();console.log(ai.tools().length); // cuenta realCuatro paradigmas
Sección titulada «Cuatro paradigmas»| # | Nombre | Qué significa | API |
|---|---|---|---|
| 1 | App → LLM | Tu app le pregunta algo al modelo | send / stream / json |
| 2 | LLM → App | Un agente externo llama a tu app | tools() / execute() / expose() |
| 3 | AI Director | El modelo persigue un objetivo de forma autónoma | agent(goal) |
| 4 | Pegamento entre microfrontends | El modelo coordina varias apps | capability() / intent() |
Los módulos
Sección titulada «Los módulos»wu.ai conecta ocho submódulos, todos construidos de forma perezosa en el primer uso:
| Módulo | Responsabilidad | Página |
|---|---|---|
| Provider | OpenAI / Anthropic / Ollama / personalizado, reintentos | Proveedores |
| Permissions | Flags, límites de peticiones, circuit breaker, guardia de bucles | Capas de seguridad |
| Context | Contexto de la app recolectado automáticamente con presupuesto de tokens | Conversaciones |
| Actions | Registro de tools y ejecución en sandbox | Acciones |
| Conversation | Historial por namespace, bucle de tool calling, streaming | Conversaciones |
| Triggers | Puente evento → LLM | Triggers |
| Agent | Objetivo → pasos → listo | Agentes |
| Orchestrate | Capacidades, intents, workflows | Agentes |
Más 10 browser actions (screenshot, click, type, …) registradas automáticamente cuando existe window. Consulta Control del navegador.
Configurarlo de antemano
Sección titulada «Configurarlo de antemano»wu.ai.init({ permissions: { writeStore: true }, rateLimit: { requestsPerMinute: 40, maxConcurrent: 5 }, circuitBreaker: { maxFailures: 5, cooldownMs: 60_000 }, loopProtection: { maxDepth: 2 }, conversation: { maxHistoryMessages: 30, maxToolRounds: 3 }, triggers: { maxActiveTriggers: 10 }, agent: { maxSteps: 6 }, context: { budget: 2000 },});Llamar a init() de nuevo reconfigura en vez de volver a crear. wu.ai.getStats() devuelve una instantánea de cada módulo; wu.ai.destroy() lo desmonta todo y aborta el trabajo en vuelo.
Eventos
Sección titulada «Eventos»Todo lo que hace la capa de IA es observable en el bus de eventos de wu:
ai:initialized, ai:response, ai:error, ai:action:executed, ai:action:denied, ai:action:error, ai:tool:confirm, ai:trigger:result, ai:trigger:error, ai:agent:start, ai:agent:step, ai:agent:done, ai:agent:error, ai:workflow:start, ai:workflow:done, ai:webmcp:exposed, ai:destroyed.
Se emiten con appName: 'wu-ai' y un token interno, de modo que una micro-app no puede suplantarlos en modo estricto.
Límites honestos
Sección titulada «Límites honestos»- No hay persistencia. El historial de conversación vive en memoria. Al recargar la página se empieza de cero.
- Los namespaces caducan. 30 minutos de inactividad, con barrido cada 5 minutos (el namespace
defaulty cualquiera con una petición en vuelo nunca se recogen). - Tres de los siete flags de permisos nunca se comprueban. Consulta Capas de seguridad.
- Los reintentos solo se aplican a
send(), no astream(). - El agente es un bucle, no un planificador. No descompone objetivos ni mantiene un modelo del mundo.
