Saltar al contenido principal

Plugin Multimodal — Enrutamiento de Imagenes

El plugin image_router detecta automaticamente cuando una peticion contiene una imagen y la devia al experto de vision configurado, sin que el router semantico tenga que intervenir.

El problema que resuelve

El router de l3mcore esta disenado para trabajar con texto. Cuando un cliente como OpenWebUI adjunta una imagen, la envia embebida como un bloque base64 dentro del campo content del mensaje. Si esa peticion llegara al modelo de embeddings E5, produciria una puntuacion impredecible y el enrutamiento seria incorrecto.

El plugin intercepta esa peticion antes de que el router la vea y la redirige directamente al experto multimodal.

Como funciona

El plugin implementa el hook override_route, que el sistema ejecuta antes de cualquier logica de enrutamiento semantico.

Peticion llega al servidor
|
v
Plugin hook: override_route(messages)
|
├── Detecta imagen? --> Devuelve "image-expert"
| |
| v
| ExpertDispatcher -> Modelo de vision
|
└── No hay imagen? --> Devuelve None
|
v
Router semantico normal (E5)

Reglas de deteccion

El plugin inspecciona los mensajes buscando objetos con el formato estandar de OpenAI:

{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,iVBORw0KGgoAAAA..."
}
}

Para que la imagen sea aceptada, el campo url debe cumplir una de estas condiciones:

Tipo de URLComportamiento
data:image/<tipo>;base64,<datos>Aceptada si el formato es correcto
https:// o http://Aceptada con aviso en el log
file://, ftp:// u otrosRechazada, no activa el enrutamiento
Vacio o nuloRechazado, no activa el enrutamiento
Limite de inspeccion

Por rendimiento y seguridad, el plugin solo inspecciona los ultimos 10 mensajes del historial y los primeros 20 fragmentos de contenido por mensaje.

Requisitos

1. Modelo multimodal disponible

Necesitas un modelo capaz de procesar imagenes. Algunas opciones:

Ollama (local):

ollama pull llava
# o
ollama pull bakllava

APIs externas: GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro, etc.

2. Configurar el experto en experts.json

El plugin busca un experto con el label exacto image-expert. Debes crearlo en tu config/experts.json.

Con Ollama local:

{
"experts": [
{
"label": "image-expert",
"type": "ollama",
"model_name": "llava",
"url": "http://127.0.0.1:11434",
"system_prompt": "You are an expert visual assistant. Analyze and describe images in detail.",
"keywords": ["imagen", "foto", "visual", "grafico", "captura", "diagrama"]
}
]
}

Con API externa (OpenAI):

{
"experts": [
{
"label": "image-expert",
"type": "api",
"provider": "openai",
"model_name": "gpt-4o",
"api_key_env": "OPENAI_API_KEY",
"system_prompt": "You are an expert visual assistant. Analyze and describe images in detail.",
"keywords": ["image", "photo", "visual", "chart", "screenshot", "diagram"]
}
]
}

3. Activar el directorio de plugins

Durante la instalacion con setup.sh, cuando se pregunte por el sistema de plugins, responde y. Esto crea el directorio plugins/.

Si ya tienes l3mcore instalado, puedes crearlo manualmente:

mkdir -p plugins

4. Descargar y colocar el plugin

Puedes obtener el plugin directamente desde el repositorio oficial:

Copia el fichero image_router.py en el directorio plugins/ de tu instalación de l3mcore. El servidor lo cargará automáticamente en el próximo arranque.

Verificar que funciona

Al arrancar el servidor, el log mostrara:

INFO - Loaded plugin: image_router

Cuando envies una peticion con imagen, veras:

INFO - image_router: image detected, forcing route to 'image-expert'.
INFO - Plugin forced route to: image-expert

Comportamiento ante distintas entradas

EntradaResultado
Solo textoEl plugin devuelve None. El router semantico actua con normalidad.
Imagen con data-URI validaEl plugin devia al experto image-expert.
Imagen con URL externa https://Acepta y devia. Se registra un aviso en el log.
Data-URI con MIME no valido (text/html, etc.)Rechazada. El router semantico actua.
Campo url vacio o nuloRechazado. El router semantico actua.
Si el experto image-expert no existe o fallal3mcore usa el experto de fallback automaticamente.

Avisos en el log

El plugin escribe en el log del servidor bajo el prefijo image_router:. Si ves avisos como:

WARNING - image_router: data-URI does not match expected image/base64 format, skipping.
WARNING - image_router: external image URL detected (https://...).
WARNING - image_router: base64 payload is 612000 bytes (threshold 524288). This may overload the vision model.

El primer aviso indica que el cliente envio una imagen con formato incorrecto. El segundo es informativo cuando se usan URLs externas. El tercero aparece cuando una imagen es especialmente grande y puede tardar mas de lo habitual en procesarse.

Limitaciones conocidas

  • El plugin no descarga imagenes desde URLs externas. Las envia tal cual al modelo de vision, que puede o no soportar URLs directas segun el backend elegido. Si usas Ollama con LLaVA, usa data-URIs.
  • El plugin no redimensiona imagenes. Si el modelo de vision tiene un limite de tamano de contexto bajo, images de alta resolucion pueden producir errores en el backend.
  • Solo se activa con el formato multimodal de OpenAI ("type": "image_url"). El formato de Ollama nativo con imagenes en campo separado no esta soportado en esta version.