alibaba/open-code-review · error

--max-tokens must be a non-negative integer

Error message

--max-tokens must be a non-negative integer

What it means

resolveMaxTokens rejects a negative --max-tokens CLI override: 0 means 'use defaults' and positive values are taken literally, so any negative value is invalid input. Thrown before any config or template lookup.

Source

Thrown at cmd/opencodereview/shared.go:51

// LLM session: a validated template, the resolved repo path, review rules,
// and a shared git subprocess limiter.
type commonContext struct {
	Template   *template.Template
	RepoDir    string
	Resolver   rules.Resolver
	FileFilter *rules.FileFilter
	GitRunner  *gitcmd.Runner
	// IsGitRepo reports whether RepoDir is inside a git repository. Always
	// true when requireGit was set; may be false when scan accepts non-git
	// directories.
	IsGitRepo bool
}

// resolveMaxTokens applies the per-run CLI override, then the saved setting,
// and finally the embedded task-template default.
func resolveMaxTokens(templateDefault int, cfg *Config, cliOverride int) (int, error) {
	if cliOverride < 0 {
		return 0, fmt.Errorf("--max-tokens must be a non-negative integer")
	}
	if cliOverride > 0 {
		return cliOverride, nil
	}
	if cfg == nil || cfg.MaxTokens == 0 {
		return templateDefault, nil
	}
	if cfg.MaxTokens < 0 {
		return 0, fmt.Errorf("invalid max_tokens in app config: must be a positive integer")
	}
	return cfg.MaxTokens, nil
}

// resolveEffort applies the standard precedence for the review effort preset:
// CLI flag > saved app config > EffortDefault.
func resolveEffort(cfg *Config, cliOverride string) (template.Effort, error) {
	if cliOverride != "" {
		return template.ParseEffort(cliOverride)

View on GitHub (pinned to 5cf97d0d15)

Solutions

  1. Pass 0 to use the saved-config/template default instead of a negative number
  2. Set a positive integer limit (e.g. --max-tokens 20000)
  3. Check flag ordering so the negative value is not accidentally swallowed

Example fix

// before
ocr review --max-tokens -1
// after
ocr review --max-tokens 0      # fall back to default
ocr review --max-tokens 20000  # explicit positive limit
Defensive patterns

Strategy: validation

Validate before calling

// validate before invoking the CLI
func validMaxTokens(n int) bool { return n >= 0 }
if !validMaxTokens(flagMaxTokens) {
    return errors.New("--max-tokens must be >= 0 (0 = use default)")
}

Type guard

func nonNegative(n int) bool { return n >= 0 }

Try / catch

limit, err := resolveMaxTokens(def, cfg, cli)
if err != nil {
    return fmt.Errorf("usage: %w (0 means default)", err)
}

Prevention

When it happens

Trigger: Passing a negative number, e.g. `ocr review --max-tokens -1` (often a shell arg-parsing accident like `--max-tokens -5000` intended as another flag's value).

Common situations: Typo or missing value between two flags so the next flag's negative number is consumed as the token limit; scripting that interpolates an unset variable as negative.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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