opendataloader-project/opendataloader-pdf · error · IllegalArgumentException

Unsupported hybrid mode '%s'. Supported values: %s

Error message

Unsupported hybrid mode '%s'. Supported values: %s

What it means

Thrown when --hybrid-mode receives a non-empty value not in {auto, full}. The value is trimmed and lowercased, then checked via Config.isValidHybridMode. Any other string is rejected with the bad value and the dynamically generated supported list.

Source

Thrown at java/opendataloader-pdf-core/src/main/java/org/opendataloader/pdf/api/cli/CLIOptions.java:675

            }
            String hybrid = hybridValue.trim().toLowerCase(Locale.ROOT);
            if (!Config.isValidHybrid(hybrid)) {
                throw new IllegalArgumentException(
                        String.format("Unsupported hybrid backend '%s'. Supported values: %s",
                                hybrid, Config.getHybridOptions(", ")));
            }
            config.setHybrid(hybrid);
        }
        if (commandLine.hasOption(HYBRID_MODE_LONG_OPTION)) {
            String modeValue = commandLine.getOptionValue(HYBRID_MODE_LONG_OPTION);
            if (modeValue == null || modeValue.trim().isEmpty()) {
                throw new IllegalArgumentException(
                        String.format("Option --hybrid-mode requires a value. Supported values: %s",
                                Config.getHybridModeOptions(", ")));
            }
            String mode = modeValue.trim().toLowerCase(Locale.ROOT);
            if (!Config.isValidHybridMode(mode)) {
                throw new IllegalArgumentException(
                        String.format("Unsupported hybrid mode '%s'. Supported values: %s",
                                mode, Config.getHybridModeOptions(", ")));
            }
            config.getHybridConfig().setMode(mode);
        }
        if (commandLine.hasOption(HYBRID_OCR_LONG_OPTION)) {
            // Deprecated: OCR settings are now configured on the hybrid server
            System.err.println("Warning: --hybrid-ocr is deprecated. "
                    + "Configure OCR settings on the hybrid server instead (--ocr-lang, --force-ocr).");
        }
        if (commandLine.hasOption(HYBRID_URL_LONG_OPTION)) {
            String url = commandLine.getOptionValue(HYBRID_URL_LONG_OPTION);
            if (url != null && !url.trim().isEmpty()) {
                config.getHybridConfig().setUrl(url.trim());
            }
        }
        if (commandLine.hasOption(HYBRID_TIMEOUT_LONG_OPTION)) {
            String timeoutValue = commandLine.getOptionValue(HYBRID_TIMEOUT_LONG_OPTION);

View on GitHub (pinned to a7789b8e77)

Solutions

  1. Use `auto` or `full`.
  2. Use `full` to bypass triage and send every page to the backend.
  3. Use `auto` (default) for dynamic triage.

Example fix

// before
opendataloader-pdf doc.pdf --hybrid hancom-ai --hybrid-mode smart
// after
opendataloader-pdf doc.pdf --hybrid hancom-ai --hybrid-mode full
Defensive patterns

Strategy: type-guard

Validate before calling

String m = userValue.trim().toLowerCase(Locale.ROOT);
if (!Config.isValidHybridMode(m)) {
    throw new IllegalArgumentException(
        "Unsupported hybrid mode '" + userValue + "'. Use: " + Config.getHybridModeOptions(", "));
}

Type guard

boolean isAcceptableHybridMode(String v) {
    return v != null && Config.isValidHybridMode(v.trim().toLowerCase(Locale.ROOT));
}

Try / catch

try {
    config.getHybridConfig().setMode(m);
} catch (IllegalArgumentException e) {
    config.getHybridConfig().setMode(Config.HYBRID_MODE_AUTO);
}

Prevention

When it happens

Trigger: Pass `--hybrid-mode smart`, `--hybrid-mode triage`, or a typo like `ful`. There are only two valid modes.

Common situations: Guessing a mode name; assuming a partial or all mode exists; typos.

Related errors


AI-assisted analysis of opendataloader-project/opendataloader-pdf@a7789b8e77 (2026-08-14). Data as JSON: /api/errors/f2ea22e276059a7e. Report an issue: GitHub.