alibaba/open-code-review · error
invalid max_tokens %q: must be a positive integer
Error message
invalid max_tokens %q: must be a positive integer
What it means
Fires when the value passed to `ocr config set max_tokens` cannot be parsed as a decimal integer or parses to zero or a negative number. setConfigValue's max_tokens case uses strconv.Atoi on the raw CLI argument; since max_tokens controls the LLM completion budget, a non-positive value would make the API call invalid downstream, so the setter rejects it at input time rather than letting a bad config reach the provider.
Source
Thrown at cmd/opencodereview/config_cmd.go:501
}
entry := cfg.Providers[cfg.Provider]
entry.Model = value
cfg.Providers[cfg.Provider] = entry
} else {
if cfg.CustomProviders == nil {
cfg.CustomProviders = make(map[string]ProviderEntry)
}
entry := cfg.CustomProviders[cfg.Provider]
entry.Model = value
cfg.CustomProviders[cfg.Provider] = entry
}
} else {
cfg.Model = value
}
case "max_tokens":
maxTokens, err := strconv.Atoi(value)
if err != nil || maxTokens <= 0 {
return fmt.Errorf("invalid max_tokens %q: must be a positive integer", value)
}
cfg.MaxTokens = maxTokens
case "effort":
e, err := template.ParseEffort(value)
if err != nil {
return err
}
cfg.Effort = string(e)
case "llm.url", "llm.URL":
cfg.Llm.URL = value
case "llm.auth_token", "llm.AuthToken":
cfg.Llm.AuthToken = value
case "llm.auth_token_cmd", "llm.AuthTokenCmd":
cfg.Llm.AuthTokenCmd = value
case "llm.auth_header", "llm.AuthHeader":
normalized, err := llm.NormalizeAuthHeader(value)
if err != nil {
return errView on GitHub (pinned to 5cf97d0d15)
Solutions
- Run `ocr config set max_tokens 4096` with a plain positive integer
- To remove a custom limit, unset/delete the key from the config file rather than setting 0
- Check the shell quoting: quote the value if it contains spaces
- Inspect the current value with `ocr config get max_tokens`
Example fix
// before ocr config set max_tokens 4k // after ocr config set max_tokens 4096
Defensive patterns
Strategy: validation
Validate before calling
n, err := strconv.Atoi(value)
if err != nil || n <= 0 {
return fmt.Errorf("max_tokens must be a positive integer, got %q", value)
}
_ = runConfigSet("max_tokens", value) Try / catch
if err := runConfigSet("max_tokens", v); err != nil {
if strings.Contains(err.Error(), "invalid max_tokens") {
fmt.Fprintf(os.Stderr, "%q is not a positive integer; e.g. 4096\n", v)
}
} Prevention
- Always pass plain integers, never "4k" or "4096.0"
- Remember 0 and negatives are rejected — there is no "unlimited" via max_tokens
- Quote values in shell to avoid splitting
- Re-check the value after setting with `ocr config get`
When it happens
Trigger: `ocr config set max_tokens <value>` where value is non-numeric ("4096k", ""), a float ("4096.5"), or a non-positive integer (0, -1).
Common situations: Typo like `max_tokens=4 096`; trying to disable the limit with 0 or -1 assuming it means unlimited; shell quoting stripping digits; pasting a value with a unit suffix ("4k").
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- unknown config key: %s Supported keys: %s Provider fields: a
- invalid URL for %s: %w
- invalid model list for %s: %w
- invalid retry codes for %s: %w
- invalid %s for %s: %q contains whitespace
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/d7d6e16a2735631b.
Report an issue: GitHub.