{"record":{"id":"b66082105c169da3","repo":"infiniflow/ragflow","slug":"unsupported-language-for-ssh-provider-language","errorCode":null,"errorMessage":"Unsupported language for SSH provider: {language}","messagePattern":"Unsupported language for SSH provider: (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"warning","filePath":"agent/sandbox/providers/ssh.py","lineNumber":547,"sourceCode":"            raise RuntimeError(\"Remote workspace creation did not return a path.\")\n        return remote_work_dir\n\n    def _upload_script(\n        self,\n        sftp: paramiko.SFTPClient,\n        remote_work_dir: str,\n        language: str,\n        code: str,\n        args_json: str,\n    ) -> tuple[str, str]:\n        if language == \"python\":\n            script_name = \"main.py\"\n            script_content = build_python_wrapper(code, args_json)\n        elif language in {\"javascript\", \"nodejs\"}:\n            script_name = \"main.js\"\n            script_content = build_javascript_wrapper(code, args_json)\n        else:\n            raise RuntimeError(f\"Unsupported language for SSH provider: {language}\")\n\n        remote_script_path = posixpath.join(remote_work_dir, script_name)\n        with sftp.file(remote_script_path, \"w\") as remote_file:\n            remote_file.write(script_content)\n\n        command = self._build_execution_command(remote_work_dir, remote_script_path, language)\n        return remote_script_path, command\n\n    def _build_execution_command(self, remote_work_dir: str, remote_script_path: str, language: str) -> str:\n        normalized_lang = self._normalize_language(language)\n        if normalized_lang == \"python\":\n            executable = self.python_bin\n        elif normalized_lang == \"nodejs\":\n            executable = self.node_bin\n        else:\n            raise RuntimeError(f\"Unsupported language for SSH provider: {language}\")\n\n        return f\"cd {shlex.quote(remote_work_dir)} && {shlex.quote(executable)} {shlex.quote(remote_script_path)}\"","sourceCodeStart":529,"sourceCodeEnd":565,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/agent/sandbox/providers/ssh.py#L529-L565","documentation":"Raised as RuntimeError by _upload_script when the language (already passed through _normalize_language) is not 'python' and not in {'javascript','nodejs'}. It selects the wrapper (build_python_wrapper vs build_javascript_wrapper) and script filename; anything else has no wrapper, so upload is rejected before any file is written. Supported set matches get_supported_languages(): python, javascript, nodejs.","triggerScenarios":"Calling execute_code with language='java', 'bash', 'go', etc.; passing an empty or None-ish language value that normalizes to something unexpected; language spelling like 'JavaScript' actually works (lowercased), but 'js' does not — it falls through and raises.","commonSituations":"Agent templates configured for languages this provider does not support; assuming 'js'/'node' aliases exist (only 'javascript' and 'nodejs' are accepted); language values coming from user input in a multi-language code node.","solutions":["Use one of: 'python', 'javascript', or 'nodejs' (case-insensitive)","Check provider.get_supported_languages() before dispatching, or pick a different sandbox provider for the language","Normalize your own language strings to these tokens before calling execute_code"],"exampleFix":"// before\nprovider.execute_code(instance_id, code, \"js\")\n\n// after\nprovider.execute_code(instance_id, code, \"javascript\")","handlingStrategy":"validation","validationCode":"language = provider._normalize_language(language or \"python\")\nif language not in {\"python\", \"javascript\", \"nodejs\"}:\n    raise ValueError(f\"unsupported language {language!r}; use python/javascript/nodejs\")\nresult = provider.execute_code(instance_id, code, language)","typeGuard":"SUPPORTED = {\"python\", \"javascript\", \"nodejs\"}\ndef is_supported_language(provider, language: str) -> bool:\n    return provider._normalize_language((language or \"\").lower()) in SUPPORTED","tryCatchPattern":null,"preventionTips":["Gate language values against get_supported_languages() before dispatch","Use 'javascript' or 'nodejs', not 'js'/'node'","Select interpreter versions via python_bin/node_bin config, not the language string"],"tags":["language-support","validation","ssh","sandbox"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}