Wei-Shaw/sub2api · error
rate_multiplier must be >= 0
Error message
rate_multiplier must be >= 0
What it means
Returned by validateDataAccount (backend/internal/handler/admin/account_data.go:697) when an accounts[] entry sets rate_multiplier to a negative number. The field is optional (nil passes) but when present must be >= 0; concurrency and priority have analogous non-negative checks immediately after.
Source
Thrown at backend/internal/handler/admin/account_data.go:697
if strings.TrimSpace(item.Name) == "" {
return errors.New("account name is required")
}
if strings.TrimSpace(item.Platform) == "" {
return errors.New("account platform is required")
}
if strings.TrimSpace(item.Type) == "" {
return errors.New("account type is required")
}
if len(item.Credentials) == 0 {
return errors.New("account credentials is required")
}
switch item.Type {
case service.AccountTypeOAuth, service.AccountTypeSetupToken, service.AccountTypeAPIKey, service.AccountTypeUpstream:
default:
return fmt.Errorf("account type is invalid: %s", item.Type)
}
if item.RateMultiplier != nil && *item.RateMultiplier < 0 {
return errors.New("rate_multiplier must be >= 0")
}
if item.Concurrency < 0 {
return errors.New("concurrency must be >= 0")
}
if item.Priority < 0 {
return errors.New("priority must be >= 0")
}
return nil
}
func defaultProxyName(name string) string {
if strings.TrimSpace(name) == "" {
return "imported-proxy"
}
return name
}
// enrichCredentialsFromIDToken performs best-effort extraction of user info fieldsView on GitHub (pinned to 073e92d171)
Solutions
- Set rate_multiplier to 0 or a positive value, or remove the field entirely to use the default.
- Add min="0" validation on the input that produces the value.
- If unset should mean default, omit the key instead of sending a sentinel like -1.
Example fix
// before
{ "name": "main", "platform": "openai", "type": "oauth", "credentials": { ... }, "rate_multiplier": -0.5 }
// after
{ "name": "main", "platform": "openai", "type": "oauth", "credentials": { ... }, "rate_multiplier": 0.5 } Defensive patterns
Strategy: validation
Validate before calling
function hasValidRateMultiplier(entry: Record<string, unknown>): boolean {
const r = entry.rate_multiplier
return r === undefined || r === null || (typeof r === 'number' && r >= 0)
} Type guard
function isOptionalNonNegative(n: unknown): n is number | undefined {
return n === undefined || n === null || (typeof n === 'number' && n >= 0)
} Prevention
- Use min=0 on numeric inputs; omit the field entirely for defaults.
- Normalize 'unset' by removing the key, never by sending a negative sentinel.
- Watch spreadsheet-derived values that can compute below zero.
When it happens
Trigger: An account entry with "rate_multiplier": -1 or any negative value — typically from a form, spreadsheet, or computed value that went below zero.
Common situations: Spreadsheet formulas producing negative multipliers; UI number inputs without min=0; copy-paste of a minus sign or dash character; treating 0 as 'unlimited' and normalizing unset to -1.
Related errors
- concurrency must be >= 0
- account name is required
- account platform is required
- account type is required
- account credentials is required
AI-assisted analysis of Wei-Shaw/sub2api@073e92d171 (2026-08-15).
Data as JSON: /api/errors/a9f0560337ece04e.
Report an issue: GitHub.