{"record":{"id":"eae6a72cfbdf70b9","repo":"langchain-ai/langchain","slug":"trying-to-deserialize-something-that-cannot-be-des","errorCode":null,"errorMessage":"Trying to deserialize something that cannot be deserialized in current version of langchain-core: {mapping_key}.","messagePattern":"Trying to deserialize something that cannot be deserialized in current version of langchain-core: (.+?)\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/core/langchain_core/load/load.py","lineNumber":538,"sourceCode":"            if (\n                namespace[0] not in self.valid_namespaces\n                # The root namespace [\"langchain\"] is not a valid identifier.\n                or namespace == [\"langchain\"]\n            ):\n                msg = f\"Invalid namespace: {value}\"\n                raise ValueError(msg)\n            # Determine explicit import path\n            if mapping_key in self.import_mappings:\n                import_path = self.import_mappings[mapping_key]\n                # Split into module and name\n                import_dir, name = import_path[:-1], import_path[-1]\n            elif namespace[0] in DISALLOW_LOAD_FROM_PATH:\n                msg = (\n                    \"Trying to deserialize something that cannot \"\n                    \"be deserialized in current version of langchain-core: \"\n                    f\"{mapping_key}.\"\n                )\n                raise ValueError(msg)\n            else:\n                # Otherwise, treat namespace as path.\n                import_dir = namespace\n\n            # Validate import path is in trusted namespaces before importing\n            if import_dir[0] not in self.valid_namespaces:\n                msg = f\"Invalid namespace: {value}\"\n                raise ValueError(msg)\n\n            # We don't need to recurse on kwargs\n            # as json.loads will do that for us.\n            kwargs = value.get(\"kwargs\", {})\n\n            # Run the init_validator (e.g., jinja2 blocking) before importing\n            # to fail fast on security violations.\n            if self.init_validator is not None:\n                self.init_validator(mapping_key, kwargs)\n","sourceCodeStart":520,"sourceCodeEnd":556,"githubUrl":"https://github.com/langchain-ai/langchain/blob/e32fa9a52eab3b61ad7a45399bfde59b3e580fc4/libs/core/langchain_core/load/load.py#L520-L556","documentation":"Raised when a serialized object's namespace root appears in DISALLOW_LOAD_FROM_PATH: namespaces (like the legacy 'langchain' root) whose modules cannot be imported by path in current langchain-core. Even if the namespace passes validation, these legacy roots deliberately refuse path-based imports, so deserialization fails.","triggerScenarios":"Loading old payloads with ids like ['langchain', 'chains', 'LLMChain'] where no import_mapping entry covers the class — the fallback import_dir = namespace path is disallowed. Typically seen with pre-0.1 serialized chains not present in the compat import_mappings.","commonSituations":"Restoring chains serialized under langchain <=0.0.x; loading exports from old LangSmith runs; class was removed or renamed so no mapping redirects it.","solutions":["Rebuild the object in the current version instead of loading the legacy payload","Provide an import mapping redirect: loads(text, import_mappings={('langchain','chains','LLMChain'): ('langchain_classic','chains','llm','LLMChain')})","Check langchain_core.load.mapping for existing compat mappings before adding your own"],"exampleFix":"# before\nobj = loads(legacy_payload)\n# after\nobj = loads(legacy_payload, import_mappings={('langchain','chains','LLMChain'): ('langchain_classic','chains','llm','LLMChain')})","handlingStrategy":"fallback","validationCode":"from langchain_core.load.load import DISALLOW_LOAD_FROM_PATH\nimport json\npayload = json.loads(text)\nbanned = {n['id'][0] for n in iter_constructor_nodes(payload)} & set(DISALLOW_LOAD_FROM_PATH)\nif banned:\n    raise ValueError(f'legacy roots {banned} need import_mappings redirects')","typeGuard":null,"tryCatchPattern":"try:\n    obj = loads(text)\nexcept ValueError as e:\n    if 'cannot be deserialized' in str(e):\n        obj = loads(text, import_mappings=LEGACY_REDIRECTS)\n    else:\n        raise","preventionTips":["Rebuild legacy chains from code instead of loading old JSON where possible","Maintain a versioned import_mappings table for legacy class paths you must support","Migrate archives once and re-dump with the current version"],"tags":["deserialization","legacy","namespace","migration"],"backgroundTag":null,"analyzedSha":"e32fa9a52eab3b61ad7a45399bfde59b3e580fc4","analyzedAt":"2026-08-14T18:42:09.092Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}