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
- Pass the exact LanguageServerId enum name as it was accepted by /add_language (list members from solidlsp/ls_config.py to confirm).
- Correct casing/spelling in the request body.
- Upgrade solidlsp if the identifier is only defined in newer versions.
- 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
- Use the exact same identifier string that add_language accepted.
- List LanguageServerId members before writing remove calls.
- Keep add/remove language identifiers in a shared constant in automation code.
- Check casing and avoid abbreviations ('js', 'ts') — use full enum names.
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
- Invalid language server identifier: {request_add_language.la
- Invalid language server: '{orig_language_str}'.\nValid value
- Config overview not yet available
- No active project
- Serena config file not found
AI-assisted analysis of oraios/serena@7fcbca7e62 (2026-08-29).
Data as JSON: /api/errors/7ed520d8ada54bab.
Report an issue: GitHub.