Ir al contenido

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');

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 falseno 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 real
# 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()

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.

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.

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.

  • 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 default y 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 a stream().
  • El agente es un bucle, no un planificador. No descompone objetivos ni mantiene un modelo del mundo.