Обработка мультимодального контента
PRX поддерживает мультимодальный контент — изображения, аудио и видео — в своих каналах и LLM-провайдерах. Мультимодальная подсистема обрабатывает определение типов контента, перекодирование форматов, контроль размеров и согласование возможностей между каналами и провайдерами.
Обзор
Когда пользователь отправляет медиа-вложение (фото, голосовое сообщение, документ) через канал, мультимодальный конвейер:
- Определяет тип контента с помощью магических байтов и расширения файла
- Проверяет контент на соответствие ограничениям размера и формата
- Перекодирует контент, если целевой провайдер не поддерживает исходный формат
- Передаёт контент в LLM-провайдер как часть контекста разговора
- Обрабатывает медиа в ответе, если провайдер генерирует изображения или аудио
Вход канала Вывод провайдера
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Определение │ │ Медиа в │
│ типа контента│ │ ответе │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Валидация │ │ Перекодиров. │
│ и ограничения│ │ (при необх.) │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Перекодиров. │ │ Доставка │
│ (при необх.) │ │ в канал │
└──────┬───────┘ └──────────────┘
│
▼
┌──────────────┐
│ Передача │
│ провайдеру │
└──────────────┘Поддерживаемые типы контента
Изображения
| Формат | Определение | Отправка провайдеру | Получение от провайдера |
|---|---|---|---|
| JPEG | Магические байты FF D8 FF | Да | Да |
| PNG | Магические байты 89 50 4E 47 | Да | Да |
| GIF | Магические байты 47 49 46 | Да (первый кадр) | Нет |
| WebP | Заголовок RIFF + WEBP | Да | Да |
| BMP | Магические байты 42 4D | Перекодируется в PNG | Нет |
| TIFF | Магические байты 49 49 или 4D 4D | Перекодируется в PNG | Нет |
| SVG | Определение XML | Растеризуется в PNG | Нет |
Аудио
| Формат | Определение | Транскрипция | Ввод провайдера |
|---|---|---|---|
| OGG/Opus | Заголовок OGG | Да (через STT) | Транскрибированный текст |
| MP3 | Заголовок ID3/sync | Да (через STT) | Транскрибированный текст |
| WAV | RIFF + WAVE | Да (через STT) | Транскрибированный текст |
| M4A/AAC | ftyp box | Да (через STT) | Транскрибированный текст |
| WebM | Заголовок EBML | Да (через STT) | Транскрибированный текст |
Видео
| Формат | Определение | Обработка |
|---|---|---|
| MP4 | ftyp box | Извлечение ключевых кадров + аудиодорожка |
| WebM | Заголовок EBML | Извлечение ключевых кадров + аудиодорожка |
| MOV | ftyp box | Извлечение ключевых кадров + аудиодорожка |
Видеофайлы декомпозируются на ключевые кадры и аудиодорожку. Ключевые кадры отправляются как изображения, а аудио транскрибируется.
Определение типа контента
Определение использует двухпроходный подход:
- Магические байты — первые 16 байт файла проверяются на соответствие известным сигнатурам
- Расширение файла — если магические байты неоднозначны, расширение файла используется как запасной вариант
- Заголовок MIME-типа — для контента, полученного по HTTP, учитывается заголовок
Content-Type
Результат определения определяет, какой конвейер обработки обрабатывает контент.
Конфигурация
[multimodal]
enabled = true
[multimodal.images]
max_size_bytes = 20_971_520 # 20 МБ
max_resolution = "4096x4096" # максимальная ширина x высота
auto_resize = true # изменение размера изображений, превышающих max_resolution
resize_quality = 85 # качество JPEG для изменённых изображений (1-100)
strip_exif = true # удаление метаданных EXIF для конфиденциальности
[multimodal.audio]
max_size_bytes = 26_214_400 # 25 МБ
max_duration_secs = 300 # 5 минут
stt_provider = "whisper" # "whisper", "deepgram" или "provider" (использовать STT провайдера LLM)
stt_model = "whisper-1"
stt_language = "auto" # "auto" для определения языка или код ISO 639-1
[multimodal.video]
max_size_bytes = 104_857_600 # 100 МБ
max_duration_secs = 120 # 2 минуты
keyframe_interval_secs = 5 # извлечение одного ключевого кадра каждые 5 секунд
max_keyframes = 20 # максимум извлекаемых ключевых кадров
extract_audio = true # транскрипция аудиодорожкиСправочник конфигурации
Изображения
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
max_size_bytes | u64 | 20971520 | Максимальный размер файла изображения (20 МБ) |
max_resolution | String | "4096x4096" | Максимальные размеры изображения (ШxВ) |
auto_resize | bool | true | Автоматическое изменение размера слишком больших изображений |
resize_quality | u8 | 85 | Качество JPEG для изменённых изображений (1--100) |
strip_exif | bool | true | Удаление метаданных EXIF из изображений |
Аудио
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
max_size_bytes | u64 | 26214400 | Максимальный размер аудиофайла (25 МБ) |
max_duration_secs | u64 | 300 | Максимальная продолжительность аудио (5 минут) |
stt_provider | String | "whisper" | Провайдер распознавания речи |
stt_model | String | "whisper-1" | Имя модели STT |
stt_language | String | "auto" | Подсказка языка для транскрипции |
Видео
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
max_size_bytes | u64 | 104857600 | Максимальный размер видеофайла (100 МБ) |
max_duration_secs | u64 | 120 | Максимальная продолжительность видео (2 минуты) |
keyframe_interval_secs | u64 | 5 | Секунды между извлекаемыми ключевыми кадрами |
max_keyframes | usize | 20 | Максимальное количество извлекаемых ключевых кадров |
extract_audio | bool | true | Транскрипция аудиодорожки видео |
Возможности провайдеров
Не все LLM-провайдеры поддерживают одинаковые типы медиа. PRX автоматически согласует возможности:
| Провайдер | Ввод изображений | Вывод изображений | Ввод аудио | Нативный мультимодальный |
|---|---|---|---|---|
| Anthropic (Claude) | Да | Нет | Нет (сначала транскрипция) | Да (vision) |
| OpenAI (GPT-4o) | Да | Да (DALL-E) | Да (Whisper) | Да |
| Google (Gemini) | Да | Да (Imagen) | Да | Да |
| Ollama (LLaVA) | Да | Нет | Нет | Да (vision) |
| AWS Bedrock | Зависит от модели | Зависит | Нет | Зависит |
Когда провайдер не поддерживает тип медиа нативно, PRX применяет резервную обработку:
- Изображение не поддерживается — изображение описывается с помощью модели с поддержкой vision, и описание отправляется как текст
- Аудио не поддерживается — аудио транскрибируется настроенным STT-провайдером, и транскрипт отправляется как текст
- Видео не поддерживается — ключевые кадры и аудиотранскрипт отправляются как составное сообщение
Ограничения медиа каналов
Каждый канал устанавливает собственные ограничения на размер и формат файлов:
| Канал | Макс. загрузка | Макс. скачивание | Поддерживаемые форматы |
|---|---|---|---|
| Telegram | 50 МБ | 20 МБ | Изображения, аудио, видео, документы |
| Discord | 25 МБ (бесплатно) | 25 МБ | Изображения, аудио, видео, документы |
| 16 МБ (медиа) | 16 МБ | JPEG, PNG, MP3, MP4, PDF | |
| 20 МБ | 20 МБ | Изображения, аудио, документы | |
| DingTalk | 20 МБ | 20 МБ | Изображения, аудио, документы |
| Lark | 25 МБ | 25 МБ | Изображения, аудио, видео, документы |
| Matrix | Зависит от сервера | Зависит от сервера | Все распространённые форматы |
| 25 МБ (типично) | 25 МБ | Все через MIME-вложения | |
| CLI | Ограничение ФС | Ограничение ФС | Все форматы |
PRX проверяет ограничения канала перед попыткой отправки ответа. Если сгенерированное изображение или файл превышает ограничение канала, оно сжимается или вместо этого предоставляется ссылка для скачивания.
Конвейер перекодирования
Когда требуется преобразование формата, PRX использует следующий конвейер перекодирования:
- Перекодирование изображений — обрабатывается крейтом
image(чистый Rust, без внешних зависимостей) - Перекодирование аудио — обрабатывается FFmpeg при наличии, иначе используются нативные декодеры для распространённых форматов
- Извлечение ключевых кадров видео — требуется FFmpeg
Определение FFmpeg
PRX автоматически определяет FFmpeg при запуске:
prx doctor multimodalВывод:
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)Если FFmpeg не установлен, перекодирование аудио и обработка видео ограничены нативно поддерживаемыми форматами.
Ограничения
- Обработка видео требует установки FFmpeg в системе
- Большие медиафайлы могут значительно увеличить потребление токенов LLM (особенно множественные ключевые кадры)
- Некоторые провайдеры взимают дополнительную плату за вызовы API vision/мультимодальных
- Потоковая передача аудио в реальном времени (живой голосовой разговор) пока не поддерживается
- Сгенерированные изображения от провайдеров (DALL-E, Imagen) подчиняются политике контента провайдера
- Растеризация SVG использует базовый рендерер; сложные SVG могут отображаться неточно
Связанные страницы
- Среда выполнения агента — как медиаконтент проходит через цикл агента
- Обзор каналов — обработка медиа для каждого канала
- Обзор провайдеров — мультимодальные возможности провайдеров
- Бэкенд эмбеддингов — модели эмбеддингов для памяти