fix(rate-limits): treat empty policies as unlimited
This commit is contained in:
@@ -476,16 +476,17 @@ func discountTitle(label string, discount float64) string {
|
||||
}
|
||||
|
||||
func effectiveModelRateLimits(model store.PlatformModel, platform store.Platform, runtimePolicyMap map[string]store.RuntimePolicySet) ModelCatalogRateLimits {
|
||||
overridePolicy := objectValue(model.RuntimePolicyOverride["rateLimitPolicy"])
|
||||
overridePolicyRaw, hasOverridePolicy := model.RuntimePolicyOverride["rateLimitPolicy"]
|
||||
overridePolicy := objectValue(overridePolicyRaw)
|
||||
runtimePolicy := map[string]any(nil)
|
||||
if model.RuntimePolicySetID != "" {
|
||||
runtimePolicy = runtimePolicyMap[model.RuntimePolicySetID].RateLimitPolicy
|
||||
}
|
||||
policies := []map[string]any{
|
||||
overridePolicy,
|
||||
model.RateLimitPolicy,
|
||||
runtimePolicy,
|
||||
platform.RateLimitPolicy,
|
||||
policies := []rateLimitPolicySource{
|
||||
{policy: overridePolicy, authoritative: hasOverridePolicy},
|
||||
{policy: model.RateLimitPolicy, authoritative: len(model.RateLimitPolicy) > 0},
|
||||
{policy: runtimePolicy, authoritative: strings.TrimSpace(model.RuntimePolicySetID) != ""},
|
||||
{policy: platform.RateLimitPolicy},
|
||||
}
|
||||
limits := ModelCatalogRateLimits{
|
||||
RPM: firstRateLimit(policies, "rpm"),
|
||||
@@ -496,18 +497,26 @@ func effectiveModelRateLimits(model store.PlatformModel, platform store.Platform
|
||||
return limits
|
||||
}
|
||||
|
||||
func firstRateLimit(policies []map[string]any, metric string) *float64 {
|
||||
for _, policy := range policies {
|
||||
if value := readRateLimit(policy, metric); value != nil {
|
||||
return value
|
||||
type rateLimitPolicySource struct {
|
||||
policy map[string]any
|
||||
authoritative bool
|
||||
}
|
||||
|
||||
func firstRateLimit(policies []rateLimitPolicySource, metric string) *float64 {
|
||||
for _, source := range policies {
|
||||
if value, ok := readRateLimit(source.policy, metric); ok {
|
||||
return floatPointer(value)
|
||||
}
|
||||
if source.authoritative {
|
||||
return floatPointer(0)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func readRateLimit(policy map[string]any, metric string) *float64 {
|
||||
func readRateLimit(policy map[string]any, metric string) (float64, bool) {
|
||||
if len(policy) == 0 {
|
||||
return nil
|
||||
return 0, false
|
||||
}
|
||||
if rules, ok := policy["rules"].([]any); ok {
|
||||
for _, item := range rules {
|
||||
@@ -516,22 +525,22 @@ func readRateLimit(policy map[string]any, metric string) *float64 {
|
||||
continue
|
||||
}
|
||||
if limit, ok := numberValue(rule["limit"]); ok {
|
||||
return &limit
|
||||
return limit, true
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, key := range rateLimitKeys(metric) {
|
||||
if value, ok := numberValue(policy[key]); ok {
|
||||
return &value
|
||||
return value, true
|
||||
}
|
||||
}
|
||||
platformLimits := objectValue(policy["platformLimits"])
|
||||
for _, key := range rateLimitKeys(metric) {
|
||||
if value, ok := numberValue(platformLimits[key]); ok {
|
||||
return &value
|
||||
return value, true
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return 0, false
|
||||
}
|
||||
|
||||
func rateLimitKeys(metric string) []string {
|
||||
@@ -1367,12 +1376,16 @@ func numberValue(value any) (float64, bool) {
|
||||
}
|
||||
|
||||
func formatOptionalNumber(value *float64) string {
|
||||
if value == nil {
|
||||
return "-"
|
||||
if value == nil || *value <= 0 {
|
||||
return "不限"
|
||||
}
|
||||
return formatLimitNumber(*value)
|
||||
}
|
||||
|
||||
func floatPointer(value float64) *float64 {
|
||||
return &value
|
||||
}
|
||||
|
||||
func formatLimitNumber(value float64) string {
|
||||
switch {
|
||||
case absFloat(value) >= 10000:
|
||||
|
||||
Reference in New Issue
Block a user