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
- Pass 0 to use the saved-config/template default instead of a negative number
- Set a positive integer limit (e.g. --max-tokens 20000)
- 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
- Use 0, not a negative number, to request defaults
- Quote/interpolate shell variables carefully so flags don't consume each other's values
- Add shell completion or flag validation in wrapper scripts
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
- background file %q is a directory, not a file
- background file %q is %d bytes, exceeding the maximum of %d
- invalid scan template: %w
- %w (run 'ocr session list' to see available sessions)
- sessions belong to different repositories: %s was recorded i
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/af45b5083f3fa615.
Report an issue: GitHub.