Skip to content
Эта страница создана и переведена с помощью ИИ. Если вы заметили неточности, помогите нам улучшить её. Редактировать на GitHub

Обработка мультимодального контента

PRX поддерживает мультимодальный контент — изображения, аудио и видео — в своих каналах и LLM-провайдерах. Мультимодальная подсистема обрабатывает определение типов контента, перекодирование форматов, контроль размеров и согласование возможностей между каналами и провайдерами.

Обзор

Когда пользователь отправляет медиа-вложение (фото, голосовое сообщение, документ) через канал, мультимодальный конвейер:

  1. Определяет тип контента с помощью магических байтов и расширения файла
  2. Проверяет контент на соответствие ограничениям размера и формата
  3. Перекодирует контент, если целевой провайдер не поддерживает исходный формат
  4. Передаёт контент в LLM-провайдер как часть контекста разговора
  5. Обрабатывает медиа в ответе, если провайдер генерирует изображения или аудио
Вход канала                     Вывод провайдера
  │                                  │
  ▼                                  ▼
┌──────────────┐              ┌──────────────┐
│ Определение  │              │ Медиа в      │
│ типа контента│              │ ответе       │
└──────┬───────┘              └──────┬───────┘
       │                             │
       ▼                             ▼
┌──────────────┐              ┌──────────────┐
│ Валидация    │              │ Перекодиров. │
│ и ограничения│              │ (при необх.) │
└──────┬───────┘              └──────┬───────┘
       │                             │
       ▼                             ▼
┌──────────────┐              ┌──────────────┐
│ Перекодиров. │              │ Доставка     │
│ (при необх.) │              │ в канал      │
└──────┬───────┘              └──────────────┘


┌──────────────┐
│ Передача     │
│ провайдеру   │
└──────────────┘

Поддерживаемые типы контента

Изображения

ФорматОпределениеОтправка провайдеруПолучение от провайдера
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)Транскрибированный текст
WAVRIFF + WAVEДа (через STT)Транскрибированный текст
M4A/AACftyp boxДа (через STT)Транскрибированный текст
WebMЗаголовок EBMLДа (через STT)Транскрибированный текст

Видео

ФорматОпределениеОбработка
MP4ftyp boxИзвлечение ключевых кадров + аудиодорожка
WebMЗаголовок EBMLИзвлечение ключевых кадров + аудиодорожка
MOVftyp boxИзвлечение ключевых кадров + аудиодорожка

Видеофайлы декомпозируются на ключевые кадры и аудиодорожку. Ключевые кадры отправляются как изображения, а аудио транскрибируется.

Определение типа контента

Определение использует двухпроходный подход:

  1. Магические байты — первые 16 байт файла проверяются на соответствие известным сигнатурам
  2. Расширение файла — если магические байты неоднозначны, расширение файла используется как запасной вариант
  3. Заголовок MIME-типа — для контента, полученного по HTTP, учитывается заголовок Content-Type

Результат определения определяет, какой конвейер обработки обрабатывает контент.

Конфигурация

toml
[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_bytesu6420971520Максимальный размер файла изображения (20 МБ)
max_resolutionString"4096x4096"Максимальные размеры изображения (ШxВ)
auto_resizebooltrueАвтоматическое изменение размера слишком больших изображений
resize_qualityu885Качество JPEG для изменённых изображений (1--100)
strip_exifbooltrueУдаление метаданных EXIF из изображений

Аудио

ПолеТипПо умолчаниюОписание
max_size_bytesu6426214400Максимальный размер аудиофайла (25 МБ)
max_duration_secsu64300Максимальная продолжительность аудио (5 минут)
stt_providerString"whisper"Провайдер распознавания речи
stt_modelString"whisper-1"Имя модели STT
stt_languageString"auto"Подсказка языка для транскрипции

Видео

ПолеТипПо умолчаниюОписание
max_size_bytesu64104857600Максимальный размер видеофайла (100 МБ)
max_duration_secsu64120Максимальная продолжительность видео (2 минуты)
keyframe_interval_secsu645Секунды между извлекаемыми ключевыми кадрами
max_keyframesusize20Максимальное количество извлекаемых ключевых кадров
extract_audiobooltrueТранскрипция аудиодорожки видео

Возможности провайдеров

Не все LLM-провайдеры поддерживают одинаковые типы медиа. PRX автоматически согласует возможности:

ПровайдерВвод изображенийВывод изображенийВвод аудиоНативный мультимодальный
Anthropic (Claude)ДаНетНет (сначала транскрипция)Да (vision)
OpenAI (GPT-4o)ДаДа (DALL-E)Да (Whisper)Да
Google (Gemini)ДаДа (Imagen)ДаДа
Ollama (LLaVA)ДаНетНетДа (vision)
AWS BedrockЗависит от моделиЗависитНетЗависит

Когда провайдер не поддерживает тип медиа нативно, PRX применяет резервную обработку:

  • Изображение не поддерживается — изображение описывается с помощью модели с поддержкой vision, и описание отправляется как текст
  • Аудио не поддерживается — аудио транскрибируется настроенным STT-провайдером, и транскрипт отправляется как текст
  • Видео не поддерживается — ключевые кадры и аудиотранскрипт отправляются как составное сообщение

Ограничения медиа каналов

Каждый канал устанавливает собственные ограничения на размер и формат файлов:

КаналМакс. загрузкаМакс. скачиваниеПоддерживаемые форматы
Telegram50 МБ20 МБИзображения, аудио, видео, документы
Discord25 МБ (бесплатно)25 МБИзображения, аудио, видео, документы
WhatsApp16 МБ (медиа)16 МБJPEG, PNG, MP3, MP4, PDF
QQ20 МБ20 МБИзображения, аудио, документы
DingTalk20 МБ20 МБИзображения, аудио, документы
Lark25 МБ25 МБИзображения, аудио, видео, документы
MatrixЗависит от сервераЗависит от сервераВсе распространённые форматы
Email25 МБ (типично)25 МБВсе через MIME-вложения
CLIОграничение ФСОграничение ФСВсе форматы

PRX проверяет ограничения канала перед попыткой отправки ответа. Если сгенерированное изображение или файл превышает ограничение канала, оно сжимается или вместо этого предоставляется ссылка для скачивания.

Конвейер перекодирования

Когда требуется преобразование формата, PRX использует следующий конвейер перекодирования:

  1. Перекодирование изображений — обрабатывается крейтом image (чистый Rust, без внешних зависимостей)
  2. Перекодирование аудио — обрабатывается FFmpeg при наличии, иначе используются нативные декодеры для распространённых форматов
  3. Извлечение ключевых кадров видео — требуется FFmpeg

Определение FFmpeg

PRX автоматически определяет FFmpeg при запуске:

bash
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 могут отображаться неточно

Связанные страницы

Released under the Apache-2.0 License.