Обратные вызовы

Получайте подписанные межсерверные уведомления и завершенные асинхронные результаты.

Обратные вызовы

Настройте URL-адрес обратного вызова в Профиль → Обратные вызовы и асинхронные результаты. Модель Gate отправляет HTTPS POST запросы на включенные уведомления учетной записи и на завершенные запросы асинхронного вывода.

URL обратного вызова

Используйте общедоступную конечную точку HTTPS. Конечная точка должна прочитать необработанное тело запроса, проверить подпись, идемпотентно обработать событие и вернуть HTTP. 200 как только событие будет принято.

События

Обратные вызовы могут включать в себя:

  • завершенные результаты асинхронного вывода;
  • уведомления о низком балансе счета при включении;
  • Уведомления о лимите расходов API-ключа при включении;
  • уведомления о лимите расходов ключевой группы, если они включены.

Асинхронная доставка результатов включается всякий раз, когда настроен URL-адрес обратного вызова. Флажки уведомлений в профиле контролируют только соответствующие оповещения о балансе и лимите.

Формат запроса

POST /model-gate/callback HTTP/1.1
Content-Type: application/json
X-Model-Gate-Signature: t=1710000000,v1=hex_hmac_sha256

Пример полезной нагрузки асинхронного результата:

{
  "event":"async.completed",
  "request_id":"01J...",
  "status":"completed",
  "response":{"id":"msg_...","type":"message"}
}

Поля полезной нагрузки можно расширять со временем. Игнорировать неизвестные поля.

Проверка подписи

Заголовок подписи имеет следующий формат:

X-Model-Gate-Signature: t=<unix>,v1=<hmac_sha256>

Вычислить HMAC-SHA256 по точной строке <timestamp>.<raw_body> используя секрет обратного вызова, показанный в профиле. Сравните шестнадцатеричную подпись со сравнением в постоянном времени и отклоните временные метки за пределами принятого вами окна воспроизведения.

Доставка и повторные попытки

Возврат HTTP 200 после благополучного принятия события. Ответы, отличные от 2xx, и сбои соединения могут быть повторены. Поэтому ваша конечная точка должна быть идемпотентной; использовать request_id вместе с event в качестве ключа дедупликации.

Не выполняйте длительную работу до ответа. Поставьте событие в очередь внутри себя, верните 200и обработать его асинхронно.

Сопутствующая документация