Гайд · TNWS AI
Как дождаться результата prediction в Replicate: sync, async и polling
Когда использовать Prefer: wait, а когда polling или webhook в Replicate API: статусы prediction, пример цикла ожидания, таймаут и критерии завершения.
Задача и применимость
Материал отвечает на запрос «как дождаться результата prediction Replicate API». Факты и названия параметров сверены 12 сентября 2026 года с официальной документацией Replicate. Цель — получить проверяемый технический результат, а не просто увидеть успешный HTTP-код.
HTTP API Replicate для community models, official models и deployments. Три типа endpoint создают один и тот же объект prediction, но путь запроса выбирают по типу модели.
Перед запуском откройте страницу API именно выбранной модели и скопируйте ее идентификатор, версию и схему input. У разных моделей различаются обязательные поля, допустимые типы и форма output. Поэтому пример ниже проверяет механизм статьи, а значения в угловых скобках требуют замены данными из официальной страницы модели.
Что подтверждает документация
- По умолчанию prediction создается асинхронно и ответ сразу содержит id.
- Синхронное ожидание запрашивается заголовком Prefer: wait; документированное ожидание по умолчанию — до 60 секунд.
- Конечные успешный и ошибочные статусы нужно различать, а не ждать только появления output.
- Для долгих задач документация предлагает polling или webhooks.
Объект prediction нужно считать отдельной сущностью со своим id, status, output, error и ссылками управления. Сохраняйте id сразу после создания: без него невозможно надежно выяснить, завершилась ли задача после сетевого таймаута. Не создавайте вторую prediction только потому, что клиент перестал ждать первую.
Пошаговая настройка
- Определите один критерий успеха. Для изображения это не только наличие URL, но и ненулевой файл, декодируемый формат, ожидаемые размеры и отсутствие служебной ошибки. Для текста — конечный статус, непустая строка и проверяемая структура.
- Создайте отдельный токен для окружения и поместите его в
REPLICATE_API_TOKENна сервере. Не передавайте постоянный секрет в браузер, мобильный пакет, query string или журнал запроса. - На официальной странице модели скопируйте endpoint и точную схему input. Зафиксируйте model/version рядом с тестовым набором, чтобы обновление не смешалось с изменением кода.
- Выполните минимальный пример ниже без очереди, ORM и автоматических retry. Сохраните HTTP-код, prediction id, status, error и время каждого перехода. Содержимое prompt логируйте только после обезличивания.
- Сравните результат с ожиданием: Цикл прекращается только на документированном конечном статусе; при succeeded доступен output, а failed, canceled и aborted превращаются в контролируемую ошибку с prediction id.
- Проведите отрицательный тест: испорченный файл, неверное поле, просроченная подпись или искусственный сетевой обрыв — в зависимости от сценария. Система должна завершиться контролируемо и не выдать частичный результат за готовый.
- После приемки добавьте очередь, ограниченные повторы с задержкой, метрики и алерт. Повторяйте безопасный GET; новый POST создавайте лишь когда подтверждено, что предыдущая prediction не была создана или ее повтор допустим бизнес-логикой.
Минимальный рабочий пример
import os, time, requests
headers = {"Authorization": f"Bearer {os.environ['REPLICATE_API_TOKEN']}", "Content-Type": "application/json"}
created = requests.post(
"https://api.replicate.com/v1/models/black-forest-labs/flux-schnell/predictions",
headers=headers, json={"input": {"prompt": "A blue paper boat on white background"}}, timeout=30).json()
pid = created["id"]
for attempt in range(30):
p = requests.get(f"https://api.replicate.com/v1/predictions/{pid}", headers=headers, timeout=15).json()
if p["status"] in {"succeeded", "failed", "canceled", "aborted"}: break
time.sleep(min(2 + attempt * 0.25, 5))
else: raise TimeoutError(pid)
if p["status"] != "succeeded": raise RuntimeError({"id": pid, "status": p["status"], "error": p.get("error")})
Пример намеренно не содержит настоящего токена. Для модели, версии, hardware или имени поля используйте только актуальную страницу API. Если ответ отличается от примера, сначала сравните endpoint и schema, затем версию клиентской библиотеки, и лишь потом меняйте обработчик.
Готовый шаблон проверки с ИИ
Роль: инженер по приемке Replicate API.
Проверь сценарий: как дождаться результата prediction Replicate API.
Вход: приложенный JSON запроса, HTTP-код, объект prediction и локальные метрики.
Верни таблицу: проверка | фактическое значение | PASS/FAIL | исправление.
Не считай HTTP 200 достаточным. Не выдумывай отсутствующие поля; отмечай их как MISSING.
Такой промпт можно передать модели для первичной ревизии логов, но секреты и персональные данные предварительно удаляются. Итог PASS/FAIL рассчитывает код по явным условиям. Нейросеть не должна решать, считать ли failed успехом или можно ли проигнорировать неверную подпись.
Контрольный вход и ожидаемый результат
Контрольный вход указан в примере: короткий prompt или локальный файл с заранее известными свойствами. До вызова API сохраните SHA-256 входного файла либо точную строку prompt, идентификатор модели и схему ожидаемого результата. Это позволяет воспроизвести тест и отделить изменение модели от ошибки транспорта.
Ожидаемый результат: Цикл прекращается только на документированном конечном статусе; при succeeded доступен output, а failed, canceled и aborted превращаются в контролируемую ошибку с prediction id.
Проверьте и негативный вход. Пустой prompt, отсутствующий файл, недоступный URL или неверная подпись должны привести к понятному отказу. Не заменяйте отсутствующие поля пустыми строками: MISSING, null, пустой output и сетевой таймаут означают разные состояния и требуют разных действий.
Критерии приемки
- id сохраняется сразу после создания
- starting и processing считаются промежуточными
- есть локальный предел ожидания
- ошибочные статусы не маскируются
- повтор не создает дубликат
Дополнительно измерьте время до создания prediction, время в starting, время в processing и полную длительность. Эти величины помогают отличить запуск worker от длительного выполнения модели. Для файлов сохраняйте число байтов, MIME после декодирования и хеш. Для webhook фиксируйте результат проверки подписи и дедупликации.
Типичные ошибки и что не делать
- Проверять только output: при ошибке оно может отсутствовать.
- Опрашивать API без паузы и создавать лишнюю нагрузку.
- После клиентского таймаута автоматически создавать новую prediction, не проверив первую по id.
Не делайте бесконечные повторы на 4xx: неправильный токен, неизвестное поле или неподдерживаемая версия требуют изменения запроса. Для временных 5xx и сетевых ошибок используйте ограниченный retry с jitter. Перед повторным POST проверьте, не существует ли уже prediction с сохраненным id, иначе пользователь получит несколько результатов и лишние вычисления.
Еще одна ошибка — принимать URL результата за постоянное хранилище. Если файл нужен позже, переносите его в собственный объектный storage, проверяйте размер и хеш, а в базе храните стабильный адрес. Политика хранения должна учитывать исходные данные, output и диагностические логи отдельно.
Проверка на реальных данных
Соберите 20 обезличенных тестов: минимальный корректный input, кириллица, длинный prompt, файл на границе допустимого размера, поврежденный файл, недоступный URL и принудительный таймаут. Для каждого задайте машинное условие, а не эталонную красивую картинку: статус, формат, обязательные поля, диапазон размера и отсутствие ошибки.
Запускайте набор при смене version, SDK или инфраструктуры. Отдельно считайте технический успех и содержательное качество. Prediction со статусом succeeded, но пустым или недекодируемым output, не должна проходить приемку. И наоборот, клиентский таймаут не доказывает, что серверная задача завершилась ошибкой.
FAQ
Можно ли считать HTTP 200 доказательством успешной генерации?
Нет. Нужно проверить конечный status, отсутствие error, форму output и критерии содержимого.
Где брать точные поля input?
На странице API конкретной модели и версии Replicate. Схема другой модели может быть несовместима.
Что сохранить для диагностики?
Prediction id, model/version, status, error, временные метрики и результат локальной валидации — без токена и лишних персональных данных.
Нужно ли повторять POST после сетевого таймаута?
Не автоматически. Сначала используйте сохраненный id или свою запись запуска, чтобы исключить уже созданную задачу.
Официальный источник
Частые вопросы
Достаточно ли HTTP 200?
Нет, проверьте конечный status, error и валидность output.
Где брать схему input?
На странице API конкретной модели и версии Replicate.
Можно ли хранить токен в браузере?
Нет, постоянный токен должен оставаться на backend.
Что делать после сетевого таймаута?
Проверить исходную prediction по сохраненному id, а не сразу создавать новую.
Читайте также
Как безопасно хранить API token Replicate и заменить его после утечки
Защита Replicate API token: переменные окружения, отдельные ключи для dev/stage/prod, ротация, отключение и проверка утечки без простоя.
Как настроить webhook Replicate для завершения prediction
Практический webhook для Replicate: публичный HTTPS endpoint, выбор событий, быстрый ответ, идемпотентность по prediction id и загрузка результата.
Как передать локальный файл, URL или Data URI в Replicate API
Три официальных способа файлового input в Replicate: hosted URL, локальный файл до 100 МБ и Data URI менее 1 МБ, с проверкой формата.
Комментарии
Пока тихо. Скажите первое слово