Данные API, лимиты и обложка
На этой странице
Все границы длины и размера
| Граница | Проверка реализации | Следствие / несоответствие |
|---|---|---|
| Полная подпись фото | ≤1024 после нормализации, JS UTF-16 | Ссылка включена в общий бюджет; эмодзи могут занимать 2 единицы |
| Предпочтение для текста | 700–900, 3–4 абзаца в prompt | Это не жёсткий минимум; в подтверждённом восстановлении 349 — 630 |
| URL на входе адаптера | ≤1500 | Не гарантирует, что ссылка уместится в подпись |
| Новостной body budget | 1024 − длина \n\nИсточник: − длина URL; бюджет должен быть ≥250 | При суффиксе 12 единиц URL должен быть ≤762; сам body не обязан быть ≥250 |
| Заголовок workflow | ≤70, рекомендация около 55 | Renderer принимает до 95, но не расширяет предел main |
| Подзаголовок workflow | ≤110, может быть пустым | Renderer принимает до 125 |
| Переносы title/subtitle | Workflow не допускает | Renderer сам умеет layout; его возможности не отменяют upstream-правил |
| Категория renderer | ≤45 | Это отдельная метка, не тело поста |
| image_prompt | ≤1800 | Язык/стиль задаётся prompt, не является полной семантической гарантией |
| Факты выбранной новости | 1–6; текст каждого ≤700; source_ids 1–3 | В JSON Schema API отсутствует maxLength=700 для текста факта; предел проверяется после ответа |
| Классификация title/angle | Parser ≤160/350 | Эти maxLength не полностью отражены в API JSON Schema; возможен отбрасываемый ответ |
| Ошибки смысловой проверки | ≤10 | Замены уникальные и неперекрывающиеся; один цикл правки |
| Исходник Images | Один PNG, 1536×1024, quality=medium; 33 байта…10 MiB | main проверяет подпись PNG и размер; renderer глубже проверяет структуру/декодирование |
| Импорт renderer | PNG ≤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–22000 | Source 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 непредвиденная ошибка.