БФЛ КонтентДокументация проекта
Разделы документации
Для разработчика

Данные API, лимиты и обложка

Обновлено 16 сентября 2026БФЛ Контент
На этой странице
  1. Все границы длины и размера
  2. Когда сохраняется и меняется изображение
  3. Контракт renderer 0.3.0

Все границы длины и размера

ГраницаПроверка реализацииСледствие / несоответствие
Полная подпись фото≤1024 после нормализации, JS UTF-16Ссылка включена в общий бюджет; эмодзи могут занимать 2 единицы
Предпочтение для текста700–900, 3–4 абзаца в promptЭто не жёсткий минимум; в подтверждённом восстановлении 349 — 630
URL на входе адаптера≤1500Не гарантирует, что ссылка уместится в подпись
Новостной body budget1024 − длина \n\nИсточник: − длина URL; бюджет должен быть ≥250При суффиксе 12 единиц URL должен быть ≤762; сам body не обязан быть ≥250
Заголовок workflow≤70, рекомендация около 55Renderer принимает до 95, но не расширяет предел main
Подзаголовок workflow≤110, может быть пустымRenderer принимает до 125
Переносы title/subtitleWorkflow не допускаетRenderer сам умеет layout; его возможности не отменяют upstream-правил
Категория renderer≤45Это отдельная метка, не тело поста
image_prompt≤1800Язык/стиль задаётся prompt, не является полной семантической гарантией
Факты выбранной новости1–6; текст каждого ≤700; source_ids 1–3В JSON Schema API отсутствует maxLength=700 для текста факта; предел проверяется после ответа
Классификация title/angleParser ≤160/350Эти maxLength не полностью отражены в API JSON Schema; возможен отбрасываемый ответ
Ошибки смысловой проверки≤10Замены уникальные и неперекрывающиеся; один цикл правки
Исходник ImagesОдин PNG, 1536×1024, quality=medium; 33 байта…10 MiBmain проверяет подпись PNG и размер; renderer глубже проверяет структуру/декодирование
Импорт rendererPNG ≤10485760 байт; каждая сторона 64–2048; без анимацииДополнительный барьер после main
Готовая обложкаPNG 1080×1080, ≤10000000 байтЛимит результата десятичный и меньше 10 MiB исходника
JSON /v1/covers≤16384 байтСтрогий перечень ключей
Draft IDКоманда 1–40 ASCII; renderer 1–80 ASCII с начальной буквой/цифройВнутренние правила различаются; произвольные ID не обещаются
VersionКоманды 1…999999999; renderer 1…1000000Верхний диапазон команд не обслуживается renderer; факт кода, не наблюдавшийся сбой
Размер статьиHTML ≤1 MiB, текст 80–22000Source block helper имеет более широкий защитный потолок 60000, но reader строже

Встроенные границы проверяются последовательно; нельзя документировать только самый широкий предел конечного API. Объекты сохраняются целиком, текст не обрезается молча до лимита. Ограниченные запросы сокращения могут не справиться — тогда статус ошибки сохраняется до дальнейшего действия.

Когда сохраняется и меняется изображение

ДействиеНовая генерация изображенияНовый рендер обложкиЧто повторно используется
Первое созданиеДа, если исходника нетДаНовый исходник
Обычная текстовая доработкаНет по умолчаниюДа, для новой версииsource_image_id; надписи могут измениться
Изменение заголовкаНет без запроса смены картинкиДаИсходная иллюстрация
Корректная точная замена фразыНетНетГотовая обложка и telegram_file_id; для новости смысл ещё проверяется
Явно распознанная смена иллюстрацииДаДаСохранённый новостной источник/контекст, а не старый image source
/resume после допустимого технического сбояНет новой платной генерацииВозможен идемпотентный повторbinary/import/source/готовый cover по стадии
ПубликацияНетНетЗафиксированные caption и Telegram file_id

Признак замены иллюстрации определяется конкретными regex, а не пониманием любого русского синонима. Часть отрицаний убирается перед поиском, но не все формулировки покрыты. Точную грамматику и отказы см. контракт команд и Code «Подготовить новую версию». Версия обложки может отличаться от версии текста при её явном повторном использовании — для этого хранится cover_origin_version.

Контракт renderer 0.3.0

Подробности renderer сохранены из предыдущего снимка. Новый экспорт подтверждает неизменность контракта workflow и успешный реальный рендер, но не содержит повторной полной выгрузки исходников renderer. Основания описания.

GET /healthz без авторизации возвращает состояние/версию/шаблон. Все прикладные маршруты требуют Bearer, проверяемый constant-time; ключ ≥32 символов, отдельный от n8n encryption/API. Секрет не включён в документацию.

POST /v1/images: тело raw image/png. Проверяет PNG signature/IHDR, chunk boundaries/IEND, отсутствие анимации, размер/геометрию и декодирование. Сохраняет исходные байты под SHA-256; атомарный temp/link предотвращает частичный файл. Ответ 201 или 200 reused: image_id вида sha256:…, sha256, asset_path, mime_type, bytes, width, height. Повтор тех же байтов не генерирует новую картинку.

POST /v1/covers: JSON с draft_id, version, template_version, title, subtitle, category, image_id; лишние поля отклоняются. image_id — consultation-v1 либо sha256:64hex; шаблон ff-square-0.1. Канонический request hash фиксирует содержание. Для одной пары draft/version повтор того же запроса возвращает готовый результат, другой запрос — 409 version_conflict. Renderer не перезаписывает обложку под прежней версией другим содержимым. Layout допускает максимум три строки заголовка/две подзаголовка; если даже корректная длина не помещается, возвращает 422, не скрытое усечение.

Ответ проверяется main: draft_id/version/template_version/image_id совпали; width/height=1080; mime_type=image/png; asset_id=sha256 и оба 64hex; request_sha256/template_fingerprint корректны; asset_path точно /v1/assets/{asset_id}.png. GET /v1/assets/{64hex}.png также требует auth, сверяет хеш файла, выдаёт private immutable cache. Нарушение целостности — 503. Прочие ответы: 400 плохой JSON, 401 auth, 404 объект/путь, 413 размер, 415 content type, 422 параметры/layout, 409 конфликт версии, 500 непредвиденная ошибка.