oraios/serena · error · ValueError

Unknown language '{lang}'. Supported: {all_langs}

Error message

Unknown language '{lang}'. Supported: {all_langs}

What it means

serena's `serena project create` (and index) validates each `--language` value by constructing a LanguageServerId enum. If the string is not a registered language-server identifier, a ValueError is raised listing all supported values. This fails fast during project configuration rather than later at language-server startup.

Source

Thrown at src/serena/cli.py:716

        :param language: Tuple of language names
        :raises FileExistsError: If project.yml already exists
        :raises ValueError: If an unsupported language is specified
        :return: the RegisteredProject instance
        """
        project_root = Path(project_path).resolve()
        serena_config = SerenaConfig.from_config_file()
        yml_path = serena_config.get_project_yml_location(str(project_root))
        if os.path.exists(yml_path):
            raise FileExistsError(f"Project file {yml_path} already exists.")

        languages: list[LanguageServerId] = []
        if language:
            for lang in language:
                try:
                    languages.append(LanguageServerId(lang.lower()))
                except ValueError:
                    all_langs = [l.value for l in LanguageServerId]
                    raise ValueError(f"Unknown language '{lang}'. Supported: {all_langs}")

        generated_conf = ProjectConfig.autogenerate(
            project_root=project_path,
            serena_config=serena_config,
            project_name=name,
            languages=languages if languages else None,
            interactive=True,
        )
        languages_str = ", ".join([lang.value for lang in generated_conf.language_servers]) if generated_conf.language_servers else "N/A"
        click.echo(f"Generated project with language servers {{{languages_str}}} at {yml_path}.")
        registered_project = serena_config.get_registered_project(str(project_root))
        if registered_project is None:
            registered_project = RegisteredProject(str(project_root), generated_conf)
            serena_config.add_registered_project(registered_project)

        return registered_project

    @staticmethod

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Run the command again using an exact supported value from the printed Supported list (e.g. python, typescript, go).
  2. Pass each language as a separate --language flag instead of a comma-separated string.
  3. Omit --language entirely to let serena auto-detect languages from the project files.
  4. If the language you need is genuinely missing, upgrade serena or check LanguageServerId in the source for the current list.

Example fix

// before
serena project create . --language python3
// after
serena project create . --language python
// or omit to auto-detect:
serena project create .
Defensive patterns

Strategy: validation

Validate before calling

from serena.language_server import LanguageServerId
langs = [l.lower() for l in requested_languages]
valid = {l.value for l in LanguageServerId}
invalid = [l for l in langs if l not in valid]
if invalid:
    raise SystemExit(f"Unsupported languages: {invalid}. Supported: {sorted(valid)}")

Try / catch

try:
    create_project(root, languages=[lang])
except ValueError as e:
    if 'Unknown language' in str(e):
        print(f'{lang} unsupported; pick from: {[l.value for l in LanguageServerId]}')

Prevention

When it happens

Trigger: Calling `_create_project` (via `serena project create` or `serena project index`) with `--language` values that don't match a LanguageServerId enum value exactly, e.g. `--language python3`, `--language js`, or `--language TypeScript` when the enum value is lowercase.

Common situations: Typos or aliases not in the enum (python3 vs python, js vs typescript), capitalized language names, passing comma-joined strings instead of repeated flags, or following outdated documentation from an older serena version with different language IDs.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29). Data as JSON: /api/errors/b801870baa1d4b8c. Report an issue: GitHub.