package billing_setting import ( "fmt" "github.com/QuantumNous/new-api/pkg/billingexpr" "github.com/QuantumNous/new-api/setting/config" ) const ( BillingModeRatio = "ratio" BillingModeTieredExpr = "tiered_expr" ) // BillingSetting is managed by config.GlobalConfig.Register. // DB keys: billing_setting.billing_mode, billing_setting.billing_expr type BillingSetting struct { BillingMode map[string]string `json:"billing_mode"` BillingExpr map[string]string `json:"billing_expr"` } var billingSetting = BillingSetting{ BillingMode: make(map[string]string), BillingExpr: make(map[string]string), } func init() { config.GlobalConfig.Register("billing_setting", &billingSetting) } // --------------------------------------------------------------------------- // Read accessors (hot path, must be fast) // --------------------------------------------------------------------------- func GetBillingMode(model string) string { if mode, ok := billingSetting.BillingMode[model]; ok { return mode } return BillingModeRatio } func GetBillingExpr(model string) (string, bool) { expr, ok := billingSetting.BillingExpr[model] return expr, ok } // --------------------------------------------------------------------------- // Smoke test (called externally for validation before save) // --------------------------------------------------------------------------- func SmokeTestExpr(exprStr string) error { return smokeTestExpr(exprStr) } func smokeTestExpr(exprStr string) error { vectors := []billingexpr.TokenParams{ {P: 0, C: 0, Len: 0}, {P: 1000, C: 1000, Len: 1000}, {P: 100000, C: 100000, Len: 100000}, {P: 1000000, C: 1000000, Len: 1000000}, } requests := []billingexpr.RequestInput{ {}, { Headers: map[string]string{ "anthropic-beta": "fast-mode-2026-02-01", }, Body: []byte(`{"service_tier":"fast","stream_options":{"include_usage":true},"messages":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]}`), }, } for _, v := range vectors { for _, request := range requests { result, _, err := billingexpr.RunExprWithRequest(exprStr, v, request) if err != nil { return fmt.Errorf("vector {p=%g, c=%g}: run failed: %w", v.P, v.C, err) } if result < 0 { return fmt.Errorf("vector {p=%g, c=%g}: result %f < 0", v.P, v.C, result) } } } return nil }