{"record":{"id":"9e2b454e278fddfa","repo":"infiniflow/ragflow","slug":"unsupported-language-for-local-provider-language","errorCode":null,"errorMessage":"Unsupported language for local provider: {language}","messagePattern":"Unsupported language for local provider: (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"agent/sandbox/providers/local.py","lineNumber":279,"sourceCode":"        if self.max_memory_mb <= 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_MEMORY_MB must be greater than 0.\")\n        if self.max_output_bytes <= 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_OUTPUT_BYTES must be greater than 0.\")\n        if self.max_artifacts < 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_ARTIFACTS must be greater than or equal to 0.\")\n        if self.max_artifact_bytes <= 0:\n            raise SandboxProviderConfigError(\"SANDBOX_LOCAL_MAX_ARTIFACT_BYTES must be greater than 0.\")\n\n    def _prepare_script(self, instance_dir: Path, language: str, code: str, args_json: str) -> tuple[list[str], Path]:\n        if language == \"python\":\n            script_path = instance_dir / \"main.py\"\n            script_path.write_text(build_python_wrapper(code, args_json), encoding=\"utf-8\")\n            return [self.python_bin, str(script_path)], script_path\n        if language in {\"javascript\", \"nodejs\"}:\n            script_path = instance_dir / \"main.js\"\n            script_path.write_text(build_javascript_wrapper(code, args_json), encoding=\"utf-8\")\n            return [self.node_bin, str(script_path)], script_path\n        raise RuntimeError(f\"Unsupported language for local provider: {language}\")\n\n    def _build_child_env(self, instance_dir: Path) -> dict[str, str]:\n        env = {\n            \"HOME\": str(instance_dir),\n            \"MPLBACKEND\": \"Agg\",\n            \"PATH\": os.environ.get(\"PATH\", \"\"),\n            \"PYTHONUNBUFFERED\": \"1\",\n            \"TMPDIR\": str(instance_dir),\n        }\n        for name in LOCAL_PYTHON_THREAD_ENV_VARS:\n            value = os.environ.get(name)\n            if value is not None:\n                env[name] = value\n        return env\n\n    def _limit_child_process(self) -> None:\n        import resource\n","sourceCodeStart":261,"sourceCodeEnd":297,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/agent/sandbox/providers/local.py#L261-L297","documentation":"Raised by LocalProvider._prepare_script() when the normalized language is neither 'python' nor in {'javascript', 'nodejs'}. The provider only knows how to build a wrapper script for those languages (build_python_wrapper / build_javascript_wrapper), so any other language string reaches the trailing RuntimeError. Note _normalize_language() runs first, so only genuinely unsupported languages get here.","triggerScenarios":"Calling execute_code(instance_id, code, language='bash'|'go'|'java'|'ruby'|''); passing a template string to create_instance() that normalizes to something outside the supported set. Check get_supported_languages() — it returns ['python', 'javascript', 'nodejs'].","commonSituations":"An LLM-generated agent tool call specifying an unsupported language; version skew where a caller assumes a language added in a newer release; typos like 'js' if _normalize_language does not map them; passing a template name (e.g. 'python:3.11') instead of a bare language.","solutions":["Pass one of the supported languages exactly: 'python', 'javascript', or 'nodejs'.","Before executing, check language in provider.get_supported_languages() and reject/fallback in the caller for anything else.","If you need another runtime, use a different provider (self_managed / SSH) or extend the provider with a new wrapper — do not retry with the same string.","Print get_supported_languages() at startup in integrations to catch mismatches early."],"exampleFix":"// before\nresult = provider.execute_code(instance_id, code, language=\"bash\")\n\n// after\nsupported = provider.get_supported_languages()\nif language not in supported:\n    raise ValueError(f\"Unsupported language {language!r}; supported: {supported}\")\nresult = provider.execute_code(instance_id, code, language=\"python\")","handlingStrategy":"type-guard","validationCode":"language = provider._normalize_language(language)\nif language not in provider.get_supported_languages():\n    raise ValueError(f\"Unsupported language: {language}\")","typeGuard":"from typing import Final\n\nSUPPORTED: Final[frozenset[str]] = frozenset({\"python\", \"javascript\", \"nodejs\"})\n\ndef is_supported_language(lang: str) -> bool:\n    \"\"\"True when LocalProvider can execute this language.\"\"\"\n    return isinstance(lang, str) and lang.strip().lower() in SUPPORTED","tryCatchPattern":"try:\n    provider.execute_code(instance_id, code, language)\nexcept RuntimeError as e:\n    if \"Unsupported language\" in str(e):\n        # re-dispatch as python or reject the request\n        raise ValueError(str(e)) from e\n    raise","preventionTips":["Whitelist languages from get_supported_languages() at the API/tool boundary before reaching the provider.","For LLM-driven calls, constrain the language parameter in the tool schema (enum)."],"tags":["sandbox","local-provider","language","runtime"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}