oraios/serena · error · ValueError

Invalid language server identifier: {request_remove_language

Error message

Invalid language server identifier: {request_remove_language.language}

What it means

The remove-language endpoint parses `request_remove_language.language` into a `LanguageServerId` enum. An unknown or misspelled identifier makes the enum constructor raise ValueError, which `_remove_language` re-raises as ValueError('Invalid language server identifier: ...'). The language server is not touched.

Source

Thrown at src/serena/dashboard.py:793

        return {}

    def _add_language(self, request_add_language: RequestAddLanguage) -> None:
        from solidlsp.ls_config import LanguageServerId

        try:
            language = LanguageServerId(request_add_language.language)
        except ValueError:
            raise ValueError(f"Invalid language server identifier: {request_add_language.language}")
        # add_language is already thread-safe
        self._agent.add_language_server(language)

    def _remove_language(self, request_remove_language: RequestRemoveLanguage) -> None:
        from solidlsp.ls_config import LanguageServerId

        try:
            language = LanguageServerId(request_remove_language.language)
        except ValueError:
            raise ValueError(f"Invalid language server identifier: {request_remove_language.language}")
        # remove_language is already thread-safe
        self._agent.remove_language_server(language)

    @staticmethod
    def _find_first_free_port(start_port: int, host: str) -> int:
        port = start_port
        while port <= 65535:
            try:
                with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
                    sock.bind((host, port))
                    return port
            except OSError:
                port += 1

        raise RuntimeError(f"No free ports found starting from {start_port}")

    def run(self, port: int) -> int:
        """

View on GitHub (pinned to 7fcbca7e62)

Solutions

  1. Pass the exact LanguageServerId enum name as it was accepted by /add_language (list members from solidlsp/ls_config.py to confirm).
  2. Correct casing/spelling in the request body.
  3. Upgrade solidlsp if the identifier is only defined in newer versions.
  4. Echo back the valid identifier list in the error handler so callers self-correct.

Example fix

// before
await fetch(`${dashboard}/remove_language`, {method: "POST", body: JSON.stringify({language: "Python"})});
// after
await fetch(`${dashboard}/remove_language`, {method: "POST", body: JSON.stringify({language: "python"})});
Defensive patterns

Strategy: try-catch

Validate before calling

from solidlsp.ls_config import LanguageServerId
valid = {m.value for m in LanguageServerId}
if lang not in valid:
    raise ValueError(f"Cannot remove {lang!r}; valid: {sorted(valid)}")

Type guard

def is_valid_language(name: str) -> bool:
    try:
        LanguageServerId(name)
        return True
    except ValueError:
        return False

Try / catch

try:
    requests.post(f"{dashboard}/remove_language", json={"language": lang})
except ValueError:
    logger.error("Invalid language identifier %r; use an exact LanguageServerId value", lang)

Prevention

When it happens

Trigger: Calling the dashboard /remove_language endpoint with a language string not in the LanguageServerId enum — wrong casing ('Python'), abbreviations ('js' instead of 'javascript'), unsupported languages, or a name from a different solidlsp version.

Common situations: Cleanup scripts removing servers added earlier with a different spelling; config drift between the identifier used at add-time and remove-time; users guessing identifier names instead of reading the enum.

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/7ed520d8ada54bab. Report an issue: GitHub.