Rappels
Recevez des événements de serveur à serveur signés et idempotents et des résultats asynchrones terminés.
Rappels
Configurez une URL de rappel dans Profil → Rappels et résultats asynchrones. Model Gate envoie HTTPS POST demandes de notifications de compte activées et demandes d’inférence asynchrone natives terminées. La transmission des rappels est indépendante du traitement d’inférence et s’exécute via une file d’attente de tâches Model Gate durable et dédiée.
URL de rappel et sécurité sortante
Utilisez un point de terminaison HTTPS accessible au public. La validation de l'URL de rappel est une limite de sécurité sortante. Les plages IP de bouclage, privées, lien local, de qualité opérateur, de documentation/test, de multidiffusion, non spécifiées et réservées sont rejetées. Le nom d'hôte est validé lors de l'enregistrement et à nouveau lors de la livraison ; les redirections sont revalidées. Ne dirigez pas les rappels vers les services internes ni les redirections vers des réseaux privés.
Enveloppe événementielle commune
Chaque rappel utilise la même enveloppe :
{
"event_id": "01J...",
"event": "account.balance_low",
"occurred_at": "2026-08-28T07:00:00Z",
"data": {}
}
event_id est stable pour chaque nouvelle tentative d'un événement logique. Dédoublonner les diffusions par event_id; ne déduisez pas l’identité en comparant le reste de la charge utile. occurred_at est UTC RFC3339. Les charges utiles peuvent gagner des champs supplémentaires au fil du temps, les consommateurs doivent donc ignorer les champs inconnus.
Chaque livraison inclut également le même identifiant d'événement dans X-Model-Gate-Event-ID.
Catalogue d'événements
account.balance_low
{
"event_id": "01J...",
"event": "account.balance_low",
"occurred_at": "2026-08-28T07:00:00Z",
"data": {
"balance": "10.1234567890",
"threshold": "20.0000000000",
"currency": "USD"
}
}
key.spend_limit_threshold_reached
{
"event_id": "01J...",
"event": "key.spend_limit_threshold_reached",
"occurred_at": "2026-08-28T07:00:00Z",
"data": {
"key_id": "KEY_PUBLIC_ID",
"key_name": "Bank integration",
"usage": "80.1234567890",
"spend_limit": "100.0000000000",
"threshold_percent": 80,
"currency": "USD"
}
}
group.spend_limit_threshold_reached
La charge utile utilise group_id, group_name, exact-décimal usage, exact-décimal spend_limit, entier threshold_percent, et currency = "USD".
request.completed
{
"event_id": "01J...",
"event": "request.completed",
"occurred_at": "2026-08-28T07:00:00.123456Z",
"data": {
"request_id": "01J...",
"status": "completed",
"response_status": 200,
"response": {"id":"msg_...","type":"message"}
}
}
response_status est nullable lorsqu'aucun statut HTTP en amont n'existe. Les résultats asynchrones échoués/annulés/expirés peuvent inclure data.error.
Les valeurs financières dans les charges utiles de rappel sont des chaînes décimales exactes ; ce ne sont pas des valeurs d’affichage arrondies par l’interface utilisateur.
Les alertes de seuil sont réarmées une fois que la valeur surveillée quitte sa condition de seuil. Le travailleur de seuil évalue les conditions environ une fois par minute, en dehors du chemin chaud d'inférence, de sorte que les rappels de seuil ne sont pas un signal de franchissement d'une milliseconde en temps réel.
Format de demande
POST /model-gate/callback HTTP/1.1
Content-Type: application/json
X-Model-Gate-Event-ID: 01J...
X-Model-Gate-Signature: t=1710000000,v1=hex_hmac_sha256
Vérification des signatures
Calculez HMAC-SHA256 sur la chaîne exacte <timestamp>.<raw_body> en utilisant le secret de rappel généré dans le profil. Le secret complet est affiché uniquement lorsqu'il est généré ou pivoté et est stocké crypté au repos. Comparez la signature hexadécimale en temps constant et rejetez les horodatages en dehors de votre fenêtre de relecture acceptée. L'horodatage HMAC est spécifique à une tentative de livraison ; le event_id reste stable au fil des tentatives.
Livraison, réponse et tentatives
N'importe quel HTTP 2xx la réponse accepte l’événement. HTTP 200 avec un corps vide est recommandé. Les erreurs de transport, les délais d'attente et toute réponse non-2xx sont des échecs.
Chaque événement a au plus 6 tentatives au total: la tentative initiale plus cinq tentatives. Les tentatives infructueuses 1 à 5 sont suivies de 5 secondes, 30 secondes, 2 minutes, 10 minutes et 1 heure. Chaque tentative a du mal 15 secondes délai d'attente global. Après la sixième tentative infructueuse, l'événement devient terminal failed et il n'y a pas d'autre tentative automatique. Les réclamations de travailleur périmées sont automatiquement renvoyées dans la file d'attente durable.
N'effectuez pas de travail de longue durée avant de répondre. Vérifier la signature, conserver/dédupliquer par event_id, retour 2xx, et traiter de manière asynchrone.