From 2673b3a314e07521bda2217c258ca36875a2bce4 Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Thu, 17 Aug 2023 00:19:31 -0400 Subject: [PATCH] Create pydantic v1 namespace in langchain (#9254) Create pydantic v1 namespace in langchain experimental --- .../langchain_experimental/__init__.py | 24 +++++++++++++++++++ .../autonomous_agents/autogpt/agent.py | 2 +- .../autonomous_agents/autogpt/memory.py | 2 +- .../autonomous_agents/autogpt/prompt.py | 2 +- .../autonomous_agents/baby_agi/baby_agi.py | 2 +- .../hugginggpt/task_planner.py | 2 +- .../langchain_experimental/cpal/models.py | 2 +- .../generative_agents/generative_agent.py | 2 +- .../llms/anthropic_functions.py | 2 +- .../llms/jsonformer_decoder.py | 2 +- .../llms/rellm_decoder.py | 2 +- .../langchain_experimental/pal_chain/base.py | 2 +- .../plan_and_execute/agent_executor.py | 2 +- .../plan_and_execute/executors/base.py | 2 +- .../plan_and_execute/planners/base.py | 2 +- .../plan_and_execute/schema.py | 2 +- .../langchain_experimental/smart_llm/base.py | 2 +- .../langchain_experimental/sql/base.py | 2 +- .../langchain_experimental/tot/base.py | 2 +- .../langchain_experimental/tot/thought.py | 2 +- .../tot/thought_generation.py | 2 +- 21 files changed, 44 insertions(+), 20 deletions(-) diff --git a/libs/experimental/langchain_experimental/__init__.py b/libs/experimental/langchain_experimental/__init__.py index e69de29bb2d..79a9f33dd41 100644 --- a/libs/experimental/langchain_experimental/__init__.py +++ b/libs/experimental/langchain_experimental/__init__.py @@ -0,0 +1,24 @@ +import importlib +import sys + +## Create namespaces for pydantic v1 and v2. +# This code must stay at the top of the file before other modules may +# attempt to import pydantic since it adds pydantic_v1 and pydantic_v2 to sys.modules. +# +# This hack is done for the following reasons: +# * Langchain will attempt to remain compatible with both pydantic v1 and v2 since +# both dependencies and dependents may be stuck on either version of v1 or v2. +# * Creating namespaces for pydantic v1 and v2 should allow us to write code that +# unambiguously uses either v1 or v2 API. +# * This change is easier to roll out and roll back. + +try: + pydantic_v1 = importlib.import_module("pydantic.v1") +except ImportError: + pydantic_v1 = importlib.import_module("pydantic") + +if "pydantic_v1" not in sys.modules: + # Use a conditional because langchain experimental + # will use the same strategy to add pydantic_v1 to sys.modules + # and may run prior to langchain core package. + sys.modules["pydantic_v1"] = pydantic_v1 diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py index 8638dc5740b..528c092902a 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py @@ -13,7 +13,7 @@ from langchain.schema.messages import AIMessage, HumanMessage, SystemMessage from langchain.tools.base import BaseTool from langchain.tools.human.tool import HumanInputRun from langchain.vectorstores.base import VectorStoreRetriever -from pydantic import ValidationError +from pydantic_v1 import ValidationError from langchain_experimental.autonomous_agents.autogpt.output_parser import ( AutoGPTOutputParser, diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py index 7978a6f9804..767699a98ae 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py @@ -2,7 +2,7 @@ from typing import Any, Dict, List from langchain.memory.chat_memory import BaseChatMemory, get_prompt_input_key from langchain.vectorstores.base import VectorStoreRetriever -from pydantic import Field +from pydantic_v1 import Field class AutoGPTMemory(BaseChatMemory): diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py index ba8fd704878..551b0dca5dc 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py @@ -7,7 +7,7 @@ from langchain.prompts.chat import ( from langchain.schema.messages import BaseMessage, HumanMessage, SystemMessage from langchain.tools.base import BaseTool from langchain.vectorstores.base import VectorStoreRetriever -from pydantic import BaseModel +from pydantic_v1 import BaseModel from langchain_experimental.autonomous_agents.autogpt.prompt_generator import get_prompt diff --git a/libs/experimental/langchain_experimental/autonomous_agents/baby_agi/baby_agi.py b/libs/experimental/langchain_experimental/autonomous_agents/baby_agi/baby_agi.py index cd4f03fb935..a08bf3fdd36 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/baby_agi/baby_agi.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/baby_agi/baby_agi.py @@ -6,7 +6,7 @@ from langchain.callbacks.manager import CallbackManagerForChainRun from langchain.chains.base import Chain from langchain.schema.language_model import BaseLanguageModel from langchain.vectorstores.base import VectorStore -from pydantic import BaseModel, Field +from pydantic_v1 import BaseModel, Field from langchain_experimental.autonomous_agents.baby_agi.task_creation import ( TaskCreationChain, diff --git a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py index 65ab27fce46..0ba026a06f2 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py @@ -13,7 +13,7 @@ from langchain.prompts.chat import ( SystemMessagePromptTemplate, ) from langchain.tools.base import BaseTool -from pydantic import BaseModel +from pydantic_v1 import BaseModel DEMONSTRATIONS = [ { diff --git a/libs/experimental/langchain_experimental/cpal/models.py b/libs/experimental/langchain_experimental/cpal/models.py index e818fbdcfc1..7f53a8e3535 100644 --- a/libs/experimental/langchain_experimental/cpal/models.py +++ b/libs/experimental/langchain_experimental/cpal/models.py @@ -6,7 +6,7 @@ from typing import Any, Optional, Union import duckdb import pandas as pd from langchain.graphs.networkx_graph import NetworkxEntityGraph -from pydantic import BaseModel, Field, PrivateAttr, root_validator, validator +from pydantic_v1 import BaseModel, Field, PrivateAttr, root_validator, validator from langchain_experimental.cpal.constants import Constant diff --git a/libs/experimental/langchain_experimental/generative_agents/generative_agent.py b/libs/experimental/langchain_experimental/generative_agents/generative_agent.py index cbe0b30e4d3..ba0f49b5fab 100644 --- a/libs/experimental/langchain_experimental/generative_agents/generative_agent.py +++ b/libs/experimental/langchain_experimental/generative_agents/generative_agent.py @@ -5,7 +5,7 @@ from typing import Any, Dict, List, Optional, Tuple from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from langchain.schema.language_model import BaseLanguageModel -from pydantic import BaseModel, Field +from pydantic_v1 import BaseModel, Field from langchain_experimental.generative_agents.memory import GenerativeAgentMemory diff --git a/libs/experimental/langchain_experimental/llms/anthropic_functions.py b/libs/experimental/langchain_experimental/llms/anthropic_functions.py index e8c362aeb6d..9a5d14f3b52 100644 --- a/libs/experimental/langchain_experimental/llms/anthropic_functions.py +++ b/libs/experimental/langchain_experimental/llms/anthropic_functions.py @@ -19,7 +19,7 @@ from langchain.schema.messages import ( BaseMessage, SystemMessage, ) -from pydantic import root_validator +from pydantic_v1 import root_validator prompt = """In addition to responding, you can use tools. \ You have access to the following tools. diff --git a/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py b/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py index dcb30238b0a..6487e9a770f 100644 --- a/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py +++ b/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, List, Optional, cast from langchain.callbacks.manager import CallbackManagerForLLMRun from langchain.llms.huggingface_pipeline import HuggingFacePipeline -from pydantic import Field, root_validator +from pydantic_v1 import Field, root_validator if TYPE_CHECKING: import jsonformer diff --git a/libs/experimental/langchain_experimental/llms/rellm_decoder.py b/libs/experimental/langchain_experimental/llms/rellm_decoder.py index 6c64533409c..2ada412415f 100644 --- a/libs/experimental/langchain_experimental/llms/rellm_decoder.py +++ b/libs/experimental/langchain_experimental/llms/rellm_decoder.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, List, Optional, cast from langchain.callbacks.manager import CallbackManagerForLLMRun from langchain.llms.huggingface_pipeline import HuggingFacePipeline from langchain.llms.utils import enforce_stop_tokens -from pydantic import Field, root_validator +from pydantic_v1 import Field, root_validator if TYPE_CHECKING: import rellm diff --git a/libs/experimental/langchain_experimental/pal_chain/base.py b/libs/experimental/langchain_experimental/pal_chain/base.py index 8340982efd6..852bb812751 100644 --- a/libs/experimental/langchain_experimental/pal_chain/base.py +++ b/libs/experimental/langchain_experimental/pal_chain/base.py @@ -15,7 +15,7 @@ from langchain.chains.base import Chain from langchain.chains.llm import LLMChain from langchain.schema.language_model import BaseLanguageModel from langchain.utilities import PythonREPL -from pydantic import Extra, Field +from pydantic_v1 import Extra, Field from langchain_experimental.pal_chain.colored_object_prompt import COLORED_OBJECT_PROMPT from langchain_experimental.pal_chain.math_prompt import MATH_PROMPT diff --git a/libs/experimental/langchain_experimental/plan_and_execute/agent_executor.py b/libs/experimental/langchain_experimental/plan_and_execute/agent_executor.py index 6e598e16f9b..018b079d749 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/agent_executor.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/agent_executor.py @@ -5,7 +5,7 @@ from langchain.callbacks.manager import ( CallbackManagerForChainRun, ) from langchain.chains.base import Chain -from pydantic import Field +from pydantic_v1 import Field from langchain_experimental.plan_and_execute.executors.base import BaseExecutor from langchain_experimental.plan_and_execute.planners.base import BasePlanner diff --git a/libs/experimental/langchain_experimental/plan_and_execute/executors/base.py b/libs/experimental/langchain_experimental/plan_and_execute/executors/base.py index df660988c0e..c009ba17283 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/executors/base.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/executors/base.py @@ -3,7 +3,7 @@ from typing import Any from langchain.callbacks.manager import Callbacks from langchain.chains.base import Chain -from pydantic import BaseModel +from pydantic_v1 import BaseModel from langchain_experimental.plan_and_execute.schema import StepResponse diff --git a/libs/experimental/langchain_experimental/plan_and_execute/planners/base.py b/libs/experimental/langchain_experimental/plan_and_execute/planners/base.py index 8689e7ee631..afe02acfe09 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/planners/base.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/planners/base.py @@ -3,7 +3,7 @@ from typing import Any, List, Optional from langchain.callbacks.manager import Callbacks from langchain.chains.llm import LLMChain -from pydantic import BaseModel +from pydantic_v1 import BaseModel from langchain_experimental.plan_and_execute.schema import Plan, PlanOutputParser diff --git a/libs/experimental/langchain_experimental/plan_and_execute/schema.py b/libs/experimental/langchain_experimental/plan_and_execute/schema.py index 2a42598418e..4b67c17190d 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/schema.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/schema.py @@ -2,7 +2,7 @@ from abc import abstractmethod from typing import List, Tuple from langchain.schema import BaseOutputParser -from pydantic import BaseModel, Field +from pydantic_v1 import BaseModel, Field class Step(BaseModel): diff --git a/libs/experimental/langchain_experimental/smart_llm/base.py b/libs/experimental/langchain_experimental/smart_llm/base.py index 8495e30ae87..e637a56d3ba 100644 --- a/libs/experimental/langchain_experimental/smart_llm/base.py +++ b/libs/experimental/langchain_experimental/smart_llm/base.py @@ -13,7 +13,7 @@ from langchain.prompts.chat import ( HumanMessagePromptTemplate, ) from langchain.schema import LLMResult, PromptValue -from pydantic import Extra, root_validator +from pydantic_v1 import Extra, root_validator class SmartLLMChain(Chain): diff --git a/libs/experimental/langchain_experimental/sql/base.py b/libs/experimental/langchain_experimental/sql/base.py index 86bcf76c3bb..f3abd774d24 100644 --- a/libs/experimental/langchain_experimental/sql/base.py +++ b/libs/experimental/langchain_experimental/sql/base.py @@ -13,7 +13,7 @@ from langchain.schema import BasePromptTemplate from langchain.schema.language_model import BaseLanguageModel from langchain.tools.sql_database.prompt import QUERY_CHECKER from langchain.utilities.sql_database import SQLDatabase -from pydantic import Extra, Field, root_validator +from pydantic_v1 import Extra, Field, root_validator INTERMEDIATE_STEPS_KEY = "intermediate_steps" diff --git a/libs/experimental/langchain_experimental/tot/base.py b/libs/experimental/langchain_experimental/tot/base.py index 027d6c8b4e4..33dca6dc01b 100644 --- a/libs/experimental/langchain_experimental/tot/base.py +++ b/libs/experimental/langchain_experimental/tot/base.py @@ -20,7 +20,7 @@ from langchain.callbacks.manager import ( CallbackManagerForChainRun, ) from langchain.chains.base import Chain -from pydantic import Extra +from pydantic_v1 import Extra from langchain_experimental.tot.checker import ToTChecker from langchain_experimental.tot.controller import ToTController diff --git a/libs/experimental/langchain_experimental/tot/thought.py b/libs/experimental/langchain_experimental/tot/thought.py index d0567c85332..711d17a102b 100644 --- a/libs/experimental/langchain_experimental/tot/thought.py +++ b/libs/experimental/langchain_experimental/tot/thought.py @@ -3,7 +3,7 @@ from __future__ import annotations from enum import Enum from typing import Set -from pydantic import BaseModel, Field +from pydantic_v1 import BaseModel, Field class ThoughtValidity(Enum): diff --git a/libs/experimental/langchain_experimental/tot/thought_generation.py b/libs/experimental/langchain_experimental/tot/thought_generation.py index 7c41498467e..f855efdaee8 100644 --- a/libs/experimental/langchain_experimental/tot/thought_generation.py +++ b/libs/experimental/langchain_experimental/tot/thought_generation.py @@ -11,7 +11,7 @@ from typing import Any, Dict, List, Tuple from langchain.chains.llm import LLMChain from langchain.prompts.base import BasePromptTemplate -from pydantic import Field +from pydantic_v1 import Field from langchain_experimental.tot.prompts import COT_PROMPT, PROPOSE_PROMPT