Поддержка изображений и медиа — 2025-12-05
Канал WhatsApp работает через Baileys Web. Этот документ описывает текущие правила обработки медиа для отправки, шлюза и ответов агента.
Цели
- Отправлять медиа с опциональными подписями через openclaw message send --media.
- Разрешить автоматические ответы из веб-входящих включать медиа вместе с текстом.
- Сохранять разумные и предсказуемые ограничения для каждого типа.
Интерфейс CLI
- openclaw message send --media <путь-или-url> [--message <подпись>]
- --media опционально; подпись может быть пустой для отправки только медиа.
- --dry-run выводит разрешенную полезную нагрузку; --json выдает \{ channel, to, messageId, mediaUrl, caption \}.
Поведение канала WhatsApp Web
- Вход: локальный путь к файлу или HTTP(S) URL.
- Поток: загрузить в Buffer, определить тип медиа и создать правильную полезную нагрузку:
- Изображения: изменить размер и перекомпрессировать в JPEG (максимальная сторона 2048px), ориентируясь на agents.defaults.mediaMaxMb (по умолчанию 5 МБ), ограничено до 6 МБ.
- Аудио/Голос/Видео: пропустить до 16 МБ; аудио отправляется как голосовая заметка (ptt: true).
- Документы: все остальное, до 100 МБ, с сохранением имени файла, когда доступно.
- Воспроизведение GIF в стиле WhatsApp: отправьте MP4 с gifPlayback: true (CLI: --gif-playback), чтобы мобильные клиенты зациклили встроенное воспроизведение.
- Определение MIME предпочитает магические байты, затем заголовки, затем расширение файла.
- Подпись берется из --message или reply.text; пустая подпись разрешена.
- Логирование: не-подробное показывает ↩️/✅; подробное включает размер и исходный путь/URL.
Конвейер автоматического ответа
- getReplyFromConfig возвращает \{ text?, mediaUrl?, mediaUrls? \}.
- Когда медиа присутствует, веб-отправитель разрешает локальные пути или URL, используя тот же конвейер, что и openclaw message send.
- Несколько записей медиа отправляются последовательно, если предоставлены.
Входящие медиа для команд (Pi)
- Когда входящие веб-сообщения включают медиа, OpenClaw загружает во временный файл и предоставляет переменные шаблонизации:
- \{\{MediaUrl\}\} псевдо-URL для входящего медиа.
- \{\{MediaPath\}\} локальный временный путь, записанный перед выполнением команды.
- Когда включена песочница Docker для каждой сессии, входящие медиа копируются в рабочее пространство песочницы, а MediaPath/MediaUrl переписываются в относительный путь, например media/inbound/<имя файла>.
- Понимание медиа (если настроено через tools.media.* или общие tools.media.models) запускается до шаблонизации и может вставлять блоки [Image], [Audio] и [Video] в Body.
- Аудио устанавливает \{\{Transcript\}\} и использует транскрипт для разбора команд, чтобы команды со слэшем по-прежнему работали.
- Описания видео и изображений сохраняют любой текст подписи для разбора команд.
- По умолчанию обрабатывается только первое совпадающее вложение изображения/аудио/видео; установите tools.media.<cap>.attachments для обработки нескольких вложений.
Ограничения и ошибки
Ограничения отправки исходящих (отправка WhatsApp web)
- Изображения: ~6 МБ ограничение после перекомпрессии.
- Аудио/голос/видео: 16 МБ ограничение; документы: 100 МБ ограничение.
- Слишком большие или нечитаемые медиа → четкая ошибка в логах, и ответ пропускается.
Ограничения понимания медиа (транскрипция/описание)
- Изображение по умолчанию: 10 МБ (tools.media.image.maxBytes).
- Аудио по умолчанию: 20 МБ (tools.media.audio.maxBytes).
- Видео по умолчанию: 50 МБ (tools.media.video.maxBytes).
- Слишком большие медиа пропускают понимание, но ответы все равно проходят с исходным телом.
Примечания для тестов
- Охватите потоки отправки + ответа для случаев изображения/аудио/документа.
- Проверьте перекомпрессию для изображений (ограничение размера) и флаг голосовой заметки для аудио.
- Убедитесь, что ответы с несколькими медиа разворачиваются как последовательные отправки.