Sistema de Plugins
l3mcore implementa una arquitectura de plugins basada en Hooks que permite extender la funcionalidad sin tocar el código central.
Cómo funciona
Cualquier archivo .py en la carpeta plugins/ se importa automáticamente al arrancar l3mcore.
lemoe/
└── plugins/
├── email_masker.py ← se carga automáticamente
├── audit_logger.py ← se carga automáticamente
└── rag_enhancer.py ← se carga automáticamente
Si un plugin tiene errores sintácticos, l3mcore lo registra en el log y continúa funcionando sin colapsar.
Hooks disponibles
before_routing(prompt: str) -> str
Se ejecuta antes de que el router ML vectorice el prompt.
Usos: censura PII, bloqueo de prompt injection, enriquecimiento RAG, traducción automática.
def before_routing(prompt: str) -> str:
# Tu lógica aquí
return modified_prompt # debe devolver string
after_generation(response: str) -> str
Se ejecuta después de que el experto genera la respuesta, antes de enviarla al cliente.
Usos: formateo de salida, censura de respuestas, inyección de firmas, validación JSON.
def after_generation(response: str) -> str:
# Tu lógica aquí
return modified_response # debe devolver string
Ejemplo: Data Masking (PII)
# plugins/email_masker.py
import re
EMAIL_REGEX = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
def before_routing(prompt: str) -> str:
"""Oculta emails antes de enviar al modelo cloud."""
return re.sub(EMAIL_REGEX, '[EMAIL_OCULTO]', prompt)
def after_generation(response: str) -> str:
"""Añade nota si el modelo menciona el placeholder."""
if '[EMAIL_OCULTO]' in response:
response += "\n\n*(Se han protegido direcciones de correo por privacidad.)*"
return response
Ejemplo: Audit Logger
# plugins/audit_logger.py
import logging
from datetime import datetime
audit_log = logging.getLogger('lemoe.audit')
def before_routing(prompt: str) -> str:
"""Registra todas las peticiones en el log de auditoría."""
audit_log.info(f"[{datetime.now().isoformat()}] PROMPT_RECEIVED: {len(prompt)} chars")
return prompt # sin modificar
def after_generation(response: str) -> str:
audit_log.info(f"[{datetime.now().isoformat()}] RESPONSE_SENT: {len(response)} chars")
return response
Ejemplo: Enriquecimiento RAG
# plugins/rag_enhancer.py
import requests
RAG_API_URL = "http://localhost:8000/search"
def before_routing(prompt: str) -> str:
"""Añade contexto relevante desde tu base de conocimiento."""
try:
r = requests.post(RAG_API_URL, json={"query": prompt}, timeout=2)
if r.ok:
context = r.json().get("context", "")
if context:
return f"Contexto relevante:\n{context}\n\nPregunta: {prompt}"
except Exception:
pass # Si el RAG falla, devuelve el prompt original
return prompt
Mejores prácticas
- Velocidad: Los hooks son síncronos. Si haces requests HTTP, usa timeouts bajos (≤2s).
- Manejo de errores: Siempre envuelve en
try/excepty devuelve el input original en caso de fallo. - Independencia: No importes módulos internos de l3mcore. Trabaja con strings puros.
- Idempotencia: El hook
after_generationpuede llamarse en chunks de streaming — diseña pensando en eso.
Repositorio de plugins
Los plugins oficiales de l3mcore estan disponibles en GitHub:
Para instalar un plugin descarga el fichero .py correspondiente y copialo en la carpeta plugins/ de tu instalacion. El servidor lo cargara en el proximo arranque.
Plugins disponibles
| Plugin | Repositorio | Hook | Descripcion |
|---|---|---|---|
| Plugin Multimodal (Imagenes) | image_router.py | override_route | Enruta automaticamente peticiones con imagenes a un experto de vision como LLaVA o GPT-4o. |
| Plugin de Fecha y Hora | system_time.py | override_route | Inyecta automaticamente la fecha y hora local actual del sistema en el contexto inicial. |
| Plugin de Perfil de Usuario | user_profile.py | override_route | Inyecta las preferencias, nombre e instrucciones personalizadas del usuario en el contexto inicial. |