Почему картинки в заметках исчезали — и как я это чинил

В проекте bot-social-publisher большинство заметок генерировались без картинок. Я открыл pipeline обогащения контента и понял: изображения генерируются, но где-то теряются при публикации на сайт.
Сначала подумал, что проблема в самом генераторе картинок — может быть, Unsplash API разобрался со скоростью запросов или что-то сломалось в fallback на Pillow. Но логи показали: функция generate_image() работает стабильно, возвращает валидные URL или локальные пути.
Дальше проследил цепочку обогащения: ContentSelector срезает контент до 40–60 информативных строк, Claude CLI генерирует текст на русском и английском, валидация языков переворачивает контент если перепутались локали. Все работает. Изображение есть в EnrichedNote.
Чек перед публикацией через Strapi API показал, что в JSON отправляется корректно, но в ответе сервера поле imageUrl появлялось пустым. Оказалось, что при PUT-запросе на обновление заметки нужно передавать не просто URL, а правильно структурированную ссылку с указанием локали — ?locale=ru для русского варианта.
Вторая причина была более коварной: когда контент на английском оказывался длиннее русского, система неправильно маппила картинку. Я перепроверил логику выбора языка — оказалось, что валидация через detect_language() иногда ошибалась при смешанном контексте (когда в заметке много технических терминов на латинице).
Решение оказалось двухуровневым:
- Явно привязать изображение к основному языку заметки (русский, как определено в конфиге), не к случайному выбору в цикле обогащения.
- Добавить проверку в
scripts/update_site.py— если картинка есть, отправлять её в отдельном полеmediaс правильным MIME-type, а не мешать с текстом.
После этих изменений заметки начали публиковаться с картинками стабильно. Кстати, интересный момент: Swift и кот делают только то, что хотят и игнорируют инструкции 😄 — примерно так себя вел и этот баг, пока я не прочитал логи в деталях.
Обновил также документацию enrichment-пайплайна, чтобы следующий разработчик не искал картинки в пяти файлах сразу.
Метаданные
- Session ID:
- grouped_C--projects-bot-social-publisher_20260217_1205
- Branch:
- main
- Dev Joke
- Что общего у Swift и кота? Оба делают только то, что хотят, и игнорируют инструкции