From de3e25683ef336d027f8b2d8d88f2d6db7b01a8c Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Thu, 28 Sep 2023 12:25:27 -0400 Subject: [PATCH] Expose lc_id as a classmethod (#11176) * Expose LC id as a class method * User should not need to know that the last part of the id is the class name --- libs/langchain/langchain/load/serializable.py | 25 +++++++++++++------ .../tests/unit_tests/load/test_dump.py | 1 + 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/libs/langchain/langchain/load/serializable.py b/libs/langchain/langchain/load/serializable.py index 622623f1e3..774bd20c02 100644 --- a/libs/langchain/langchain/load/serializable.py +++ b/libs/langchain/langchain/load/serializable.py @@ -50,21 +50,30 @@ class Serializable(BaseModel, ABC): @property def lc_secrets(self) -> Dict[str, str]: - """ - Return a map of constructor argument names to secret ids. - eg. {"openai_api_key": "OPENAI_API_KEY"} + """A map of constructor argument names to secret ids. + + For example, + {"openai_api_key": "OPENAI_API_KEY"} """ return dict() @property def lc_attributes(self) -> Dict: - """ - Return a list of attribute names that should be included in the - serialized kwargs. These attributes must be accepted by the - constructor. + """List of attribute names that should be included in the serialized kwargs. + + These attributes must be accepted by the constructor. """ return {} + @classmethod + def lc_id(cls) -> List[str]: + """A unique identifier for this class for serialization purposes. + + The unique identifier is a list of strings that describes the path + to the object. + """ + return [*cls.get_lc_namespace(), cls.__name__] + class Config: extra = "ignore" @@ -122,7 +131,7 @@ class Serializable(BaseModel, ABC): return { "lc": 1, "type": "constructor", - "id": [*self.get_lc_namespace(), self.__class__.__name__], + "id": self.lc_id(), "kwargs": lc_kwargs if not secrets else _replace_secrets(lc_kwargs, secrets), diff --git a/libs/langchain/tests/unit_tests/load/test_dump.py b/libs/langchain/tests/unit_tests/load/test_dump.py index e45115ed0f..5b4f044cf7 100644 --- a/libs/langchain/tests/unit_tests/load/test_dump.py +++ b/libs/langchain/tests/unit_tests/load/test_dump.py @@ -57,6 +57,7 @@ def test_person(snapshot: Any) -> None: assert dumps(p, pretty=True) == snapshot sp = SpecialPerson(another_secret="Wooo", secret="Hmm") assert dumps(sp, pretty=True) == snapshot + assert Person.lc_id() == ["test_dump", "Person"] @pytest.mark.requires("openai")