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 fields

View on GitHub (pinned to 073e92d171)

Solutions

  1. Set rate_multiplier to 0 or a positive value, or remove the field entirely to use the default.
  2. Add min="0" validation on the input that produces the value.
  3. 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

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


AI-assisted analysis of Wei-Shaw/sub2api@073e92d171 (2026-08-15). Data as JSON: /api/errors/a9f0560337ece04e. Report an issue: GitHub.