feat: 余额预扣 reserve/capture、冷却兜底重试、Prometheus /metrics

- 预扣:每请求按 body 估算成本上界计入冻结额(1e-8 USD 原子计数),402 判定
  改为「余额 - 在途冻结 ≤ 0」,并发的长流式请求不再互相透支;OT_PROXY_RESERVE_MAX_TOKENS
  控制估算基数(默认 4096,0=关闭),handler defer 释放,失败/中断/panic 均覆盖
- 调度:全部候选都在运行期冷却时,剩余冷却 ≤ OT_PROXY_COOLDOWN_GRACE 的最早恢复渠道
  兜底重试一次而不是 503(429 Retry-After 语义);DB 层不可用的渠道不参与兜底
- 指标:openteam_proxy_requests_total / request_duration / channel_failures /
  usage_queue_depth / frozen_balance,/metrics 默认关闭(OT_METRICS_ENABLED 开启)
This commit is contained in:
Sakurasan committed 2026-11-09 01:04:40 +08:00
1 parent b2e500ff51
commit 0e10f0bbde
14 files changed
+493 -36

No files matched your search

+6
View File
@@ -8,6 +8,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/openteam/server/internal/api/middleware"
"github.com/openteam/server/internal/app"
"github.com/openteam/server/internal/pkg/metrics"
"github.com/openteam/server/internal/proxy"
)
@@ -149,5 +150,10 @@ func NewRouter(a *app.App, gw *proxy.Gateway) *gin.Engine {
r.GET("/healthz", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "ok"})
})
// Prometheus 指标端点:默认关闭——模型/渠道名与流量规模本身就是信息,
// 公网部署要开时建议在反代层做访问控制。
if a.Cfg.MetricsEnabled {
r.GET("/metrics", gin.WrapH(metrics.Handler()))
}
return r
}