回调
接收签名的幂等服务器到服务器事件和完成的异步结果。
回调
配置回调 URL 配置文件 → 回调和异步结果。 Model Gate 发送 HTTPS POST 启用帐户通知和完成本机异步推理请求的请求。回调传递独立于推理处理,并通过专用的持久 Model Gate 工作队列运行。
回调 URL 和出站安全
使用可公开访问的 HTTPS 端点。回调 URL 验证是出站安全边界。环回、专用、链路本地、运营商级 NAT、文档/测试、多播、未指定和保留的 IP 范围将被拒绝。主机名在保存时进行验证,并在交付过程中再次进行验证;重定向被重新验证。不要将回调指向内部服务或重定向到专用网络。
公共事件信封
每个回调都使用相同的信封:
{
"event_id": "01J...",
"event": "account.balance_low",
"occurred_at": "2026-08-28T07:00:00Z",
"data": {}
}
event_id 对于一个逻辑事件的每次重试都是稳定的。删除重复交付 event_id;不要通过比较其余有效负载来推断身份。 occurred_at 是 UTC RFC3339。随着时间的推移,有效负载可能会获得额外的字段,因此消费者必须忽略未知的字段。
每次交付还包含相同的事件 ID X-Model-Gate-Event-ID。
活动目录
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
有效负载使用 group_id, group_name, 精确十进制 usage, 精确十进制 spend_limit, 整数 threshold_percent, 和 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 当不存在上游 HTTP 状态时可为 null。失败/取消/过期的异步结果可能包括 data.error。
回调有效负载中的财务值是精确的十进制字符串;它们不是 UI 四舍五入的显示值。
当监控值离开其阈值条件后,阈值警报将重新启动。阈值工作器在推理热路径之外大约每分钟评估一次条件,因此阈值回调不是实时毫秒交叉信号。
请求格式
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
签名验证
通过精确的字符串计算 HMAC-SHA256 <timestamp>.<raw_body> 使用配置文件中生成的回调密钥。完整的秘密仅在生成或轮换时显示,并在静态时加密存储。比较恒定时间内的十六进制签名,并拒绝接受的重播窗口之外的时间戳。 HMAC 时间戳特定于传输尝试;这 event_id 在重试中保持稳定。
交付、响应和重试
任何 HTTP 2xx 响应接受该事件。 HTTP协议 200 建议使用空体。传输错误、超时和每个非 2xx 响应都是失败。
每个事件最多有 总共 6 次尝试:初次尝试加上五次重试。失败的尝试 1-5 之后是 5秒、30秒、2分钟、10分钟、1小时。每一次尝试都充满艰辛 15秒 整体超时。第六次尝试失败后,事件终止 failed 并且不会进一步自动重试。过时的工作人员声明会自动返回到持久队列。
在响应之前不要执行长时间运行的工作。验证签名、持久化/重复数据删除 event_id, 返回 2xx,并异步处理。