Skip to content
Esta página fue generada y traducida con asistencia de IA. Si encuentra alguna imprecisión, no dude en ayudar a mejorarla. Editar en GitHub

Manejo de contenido multimodal

PRX soporta contenido multimodal -- imagenes, audio y video -- a traves de sus canales y proveedores LLM. El subsistema multimodal maneja la deteccion de tipo de contenido, transcodificacion de formato, aplicacion de limites de tamano y negociacion de capacidades entre canales y proveedores.

Vision general

Cuando un usuario envia un adjunto multimedia (foto, mensaje de voz, documento) a traves de un canal, el pipeline multimodal:

  1. Detecta el tipo de contenido usando bytes magicos y extension de archivo
  2. Valida el contenido contra restricciones de tamano y formato
  3. Transcodifica el contenido si el proveedor destino no soporta el formato origen
  4. Despacha el contenido al proveedor LLM como parte del contexto de conversacion
  5. Maneja medios en la respuesta si el proveedor genera imagenes o audio
Channel Input                    Provider Output
  │                                  │
  ▼                                  ▼
┌──────────────┐              ┌──────────────┐
│ Content Type │              │ Response     │
│ Detection    │              │ Media        │
└──────┬───────┘              └──────┬───────┘
       │                             │
       ▼                             ▼
┌──────────────┐              ┌──────────────┐
│ Validation   │              │ Transcoding  │
│ & Limits     │              │ (if needed)  │
└──────┬───────┘              └──────┬───────┘
       │                             │
       ▼                             ▼
┌──────────────┐              ┌──────────────┐
│ Transcoding  │              │ Channel      │
│ (if needed)  │              │ Delivery     │
└──────┬───────┘              └──────────────┘


┌──────────────┐
│ Provider     │
│ Dispatch     │
└──────────────┘

Tipos de contenido soportados

Imagenes

FormatoDeteccionEnviar a proveedorRecibir de proveedor
JPEGBytes magicos FF D8 FFSiSi
PNGBytes magicos 89 50 4E 47SiSi
GIFBytes magicos 47 49 46Si (primer fotograma)No
WebPCabecera RIFF + WEBPSiSi
BMPBytes magicos 42 4DTranscodificado a PNGNo
TIFFBytes magicos 49 49 o 4D 4DTranscodificado a PNGNo
SVGDeteccion XMLRasterizado a PNGNo

Audio

FormatoDeteccionTranscripcionEntrada al proveedor
OGG/OpusCabecera OGGSi (via STT)Texto transcrito
MP3Cabecera ID3/syncSi (via STT)Texto transcrito
WAVRIFF + WAVESi (via STT)Texto transcrito
M4A/AACCaja ftypSi (via STT)Texto transcrito
WebMCabecera EBMLSi (via STT)Texto transcrito

Video

FormatoDeteccionProcesamiento
MP4Caja ftypExtraer fotogramas clave + pista de audio
WebMCabecera EBMLExtraer fotogramas clave + pista de audio
MOVCaja ftypExtraer fotogramas clave + pista de audio

Los archivos de video se descomponen en imagenes de fotogramas clave y una pista de audio. Los fotogramas clave se envian como imagenes y el audio se transcribe.

Deteccion de tipo de contenido

La deteccion usa un enfoque de dos pasadas:

  1. Bytes magicos -- los primeros 16 bytes del archivo se verifican contra firmas conocidas
  2. Extension de archivo -- si los bytes magicos no son concluyentes, se usa la extension de archivo como alternativa
  3. Cabecera de tipo MIME -- para contenido recibido via HTTP, se consulta la cabecera Content-Type

El resultado de la deteccion determina que pipeline de procesamiento maneja el contenido.

Configuracion

toml
[multimodal]
enabled = true

[multimodal.images]
max_size_bytes = 20_971_520      # 20 MB
max_resolution = "4096x4096"     # maximum width x height
auto_resize = true               # resize images exceeding max_resolution
resize_quality = 85              # JPEG quality for resized images (1-100)
strip_exif = true                # remove EXIF metadata for privacy

[multimodal.audio]
max_size_bytes = 26_214_400      # 25 MB
max_duration_secs = 300          # 5 minutes
stt_provider = "whisper"         # "whisper", "deepgram", or "provider" (use LLM provider's STT)
stt_model = "whisper-1"
stt_language = "auto"            # "auto" for language detection, or ISO 639-1 code

[multimodal.video]
max_size_bytes = 104_857_600     # 100 MB
max_duration_secs = 120          # 2 minutes
keyframe_interval_secs = 5       # extract one keyframe every 5 seconds
max_keyframes = 20               # maximum keyframes to extract
extract_audio = true             # transcribe audio track

Referencia de configuracion

Imagenes

CampoTipoPor defectoDescripcion
max_size_bytesu6420971520Tamano maximo de archivo de imagen (20 MB)
max_resolutionString"4096x4096"Dimensiones maximas de imagen (AnchoxAlto)
auto_resizebooltrueRedimensionar automaticamente imagenes sobredimensionadas
resize_qualityu885Calidad JPEG para imagenes redimensionadas (1--100)
strip_exifbooltrueEliminar metadatos EXIF de las imagenes

Audio

CampoTipoPor defectoDescripcion
max_size_bytesu6426214400Tamano maximo de archivo de audio (25 MB)
max_duration_secsu64300Duracion maxima de audio (5 minutos)
stt_providerString"whisper"Proveedor de voz a texto
stt_modelString"whisper-1"Nombre del modelo STT
stt_languageString"auto"Indicacion de idioma para transcripcion

Video

CampoTipoPor defectoDescripcion
max_size_bytesu64104857600Tamano maximo de archivo de video (100 MB)
max_duration_secsu64120Duracion maxima de video (2 minutos)
keyframe_interval_secsu645Segundos entre fotogramas clave extraidos
max_keyframesusize20Numero maximo de fotogramas clave a extraer
extract_audiobooltrueTranscribir la pista de audio del video

Capacidades de proveedores

No todos los proveedores LLM soportan los mismos tipos de medios. PRX negocia capacidades automaticamente:

ProveedorEntrada de imagenSalida de imagenEntrada de audioMultimodal nativo
Anthropic (Claude)SiNoNo (transcribir primero)Si (vision)
OpenAI (GPT-4o)SiSi (DALL-E)Si (Whisper)Si
Google (Gemini)SiSi (Imagen)SiSi
Ollama (LLaVA)SiNoNoSi (vision)
AWS BedrockVaria segun modeloVariaNoVaria

Cuando un proveedor no soporta un tipo de medio de forma nativa, PRX aplica procesamiento alternativo:

  • Imagen no soportada -- la imagen se describe usando un modelo con capacidad de vision, y la descripcion se envia como texto
  • Audio no soportado -- el audio se transcribe usando el proveedor STT configurado, y la transcripcion se envia como texto
  • Video no soportado -- los fotogramas clave y la transcripcion del audio se envian como un mensaje compuesto

Limites de medios por canal

Cada canal impone sus propias restricciones de tamano de archivo y formato:

CanalSubida maximaDescarga maximaFormatos soportados
Telegram50 MB20 MBImagenes, audio, video, documentos
Discord25 MB (gratis)25 MBImagenes, audio, video, documentos
WhatsApp16 MB (medios)16 MBJPEG, PNG, MP3, MP4, PDF
QQ20 MB20 MBImagenes, audio, documentos
DingTalk20 MB20 MBImagenes, audio, documentos
Lark25 MB25 MBImagenes, audio, video, documentos
MatrixDepende del homeserverDepende del homeserverTodos los formatos comunes
Email25 MB (tipico)25 MBTodos via adjuntos MIME
CLILimite del sistema de archivosLimite del sistema de archivosTodos los formatos

PRX aplica los limites del canal antes de intentar enviar una respuesta. Si una imagen o archivo generado excede el limite del canal, se comprime o se proporciona un enlace de descarga en su lugar.

Pipeline de transcodificacion

Cuando se necesita conversion de formato, PRX usa el siguiente pipeline de transcodificacion:

  1. Transcodificacion de imagenes -- manejada por el crate image (Rust puro, sin dependencias externas)
  2. Transcodificacion de audio -- manejada por FFmpeg si esta instalado, en caso contrario recurre a decodificadores nativos para formatos comunes
  3. Extraccion de fotogramas clave de video -- requiere FFmpeg

Deteccion de FFmpeg

PRX detecta automaticamente FFmpeg al iniciar:

bash
prx doctor multimodal

Salida:

Multimodal Support:
  Images: OK (native)
  Audio transcoding: OK (ffmpeg 6.1 detected)
  Video processing: OK (ffmpeg 6.1 detected)
  STT provider: OK (whisper-1 via OpenAI)

Si FFmpeg no esta instalado, la transcodificacion de audio y el procesamiento de video se limitan a formatos soportados nativamente.

Limitaciones

  • El procesamiento de video requiere que FFmpeg este instalado en el sistema
  • Los archivos multimedia grandes pueden incrementar significativamente el uso de tokens del LLM (especialmente multiples fotogramas clave)
  • Algunos proveedores cobran tarifas adicionales por llamadas a la API de vision/multimodal
  • El streaming de audio en tiempo real (conversacion por voz en vivo) aun no esta soportado
  • Las imagenes generadas por proveedores (DALL-E, Imagen) estan sujetas a la politica de contenido del proveedor
  • La rasterizacion de SVG usa un renderizador basico; SVGs complejos pueden no renderizarse con precision

Paginas relacionadas

Released under the Apache-2.0 License.