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 err

View on GitHub (pinned to 5cf97d0d15)

Solutions

  1. Run `ocr config set max_tokens 4096` with a plain positive integer
  2. To remove a custom limit, unset/delete the key from the config file rather than setting 0
  3. Check the shell quoting: quote the value if it contains spaces
  4. 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

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


AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02). Data as JSON: /api/errors/d7d6e16a2735631b. Report an issue: GitHub.