Ir al contenido

API: ai/nlu

@mosaicoo/svg-engine/ai/nlu es la capa de lenguaje natural opcional (headless, sin Material/CDK). Convierte una frase como “dibuja un círculo rojo” en una acción del editor: un engine basado en reglas casa el texto con intents registrados, extrae slots y devuelve candidatos rankeados o auto-ejecuta el mejor. Una capa de LLM local opcional resuelve lo que las reglas no pueden.

import { NaturalLanguageService, builtinNluPlugin } from '@mosaicoo/svg-engine/ai/nlu';
APIDescripciónÚsalo para
NaturalLanguageServiceEl registry de intents + matcher. registerIntent(intent) → Disposable; parse(text, ctx, opts?) devuelve NluCandidate[] rankeados; execute(text, ctx, opts?) parsea y auto-ejecuta el mejor cuando hay confianza; signals intents/intentsCount.Registrar intents y convertir texto en acciones del editor.
builtinNluPluginUn plugin (instala vía provideSvgEnginePlugin(builtinNluPlugin)) que auto-descubre cada comando de menú como intent y añade integrados como create-shape, set-fill, move-selected, resize-selected, duplicate-selected.Tener un vocabulario de comandos funcional de inmediato.
discoverMenuIntents(...) / discoverMenuIntentsReactive(...)Convierten entradas del MenuContributionRegistry en intents — una vez, o de forma continua conforme se instalan plugins.Exponer tus menús al lenguaje natural automáticamente.
const nlu = inject(NaturalLanguageService);
const result = await nlu.execute('dibuja un círculo rojo', { injector });
if (!result.executed) console.log(result.rejection); // por qué no se ejecutó
TipoDescripción
NluIntentDefinición de intent: id, keywords, opcionales actionKeywords/slots/destructive/description, y execute(slots, ctx).
NluContextEl contexto por llamada — lleva el injector para que el intent resuelva servicios del editor.
NluCandidateUn resultado de parse: el intent casado, una confidence en [0,1], los slots extraídos y los matches que lo explican.
NluSlotSchemaLa forma de un slot: number, color, shape, enum, string, point o gradient, con optional/default/anchor keywords.
NluParseOptionsthreshold (por defecto 0.3) y maxResults (por defecto 5).
NluExecuteOptionsAñade autoExecuteThreshold (por defecto 0.7) y confirmGate (hook de confirmación — obligatorio para intents destructive).
NluExecuteResultEl resultado: executed, el candidate, alternatives, y un motivo de rejection (no-match, below-threshold, confirmation-declined, destructive-no-gate, execute-error o null).
NluLanguageIdioma detectado: pt, en o unknown.

Para peticiones que el engine de reglas no resuelve, escala a un LLM de chat (p. ej. un servidor Ollama local). El contrato es enchufable.

APIDescripción
AiChatProvider / AI_CHAT_PROVIDEREl contrato del backend LLM (chat(messages, opts?), isConfigured, defaultModel) y su token de inyección (por defecto ninguno).
provideOllamaChat(config?)Conecta el provider Ollama integrado. Config: baseUrl, model, models.
DEFAULT_OLLAMA_BASE_URL / DEFAULT_OLLAMA_MODEL / DEFAULT_OLLAMA_MODELSDefaults: http://localhost:11434, qwen2.5:3b, y una pequeña lista de modelos Qwen sugeridos.
LlmIntentResolverServiceLa capa de escalado: resolvePlan(text, ctx) pide al LLM desglosar una petición compleja en un plan de intents de varios pasos; resolveAndExecute(text, ctx) lo ejecuta.
AiChatMessage / AiChatOptionsEl mensaje de chat (role, content) y las opciones por llamada (model, format, temperature, …).

ai/nlu define el contrato del provider de voz; las implementaciones reales viven en ai/nlu-ui (Web Speech) y ai/nlu-voice-wasm (Whisper en el dispositivo).

APIDescripción
VoiceProviderUn provider de reconocimiento de voz: signals isSupported/listening/lastError, listen(lang?, options?) → transcripción, stop().
VoiceEngineQué engine usar: web-speech, whisper o auto.
VOICE_WHISPER_PROVIDERToken de inyección del provider Whisper opcional (por defecto ninguno).