diff --git a/libs/core/langchain_core/load/load.py b/libs/core/langchain_core/load/load.py index 57b7851acf2..188aa45d61d 100644 --- a/libs/core/langchain_core/load/load.py +++ b/libs/core/langchain_core/load/load.py @@ -3,6 +3,7 @@ import json import os from typing import Any, Dict, List, Optional +from langchain_core.load.mapping import SERIALIZABLE_MAPPING from langchain_core.load.serializable import Serializable DEFAULT_NAMESPACES = ["langchain", "langchain_core", "langchain_community"] @@ -62,8 +63,21 @@ class Reviver: if len(namespace) == 1 and namespace[0] == "langchain": raise ValueError(f"Invalid namespace: {value}") - mod = importlib.import_module(".".join(namespace)) - cls = getattr(mod, name) + # Get the importable path + key = tuple(namespace + [name]) + if key not in SERIALIZABLE_MAPPING: + raise ValueError( + "Trying to deserialize something that cannot " + "be deserialized in current version of langchain-core: " + f"{key}" + ) + import_path = SERIALIZABLE_MAPPING[key] + # Split into module and name + import_dir, import_obj = import_path[:-1], import_path[-1] + # Import module + mod = importlib.import_module(".".join(import_dir)) + # Import class + cls = getattr(mod, import_obj) # The class must be a subclass of Serializable. if not issubclass(cls, Serializable):