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 e69de29bb2..79a9f33dd4 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 8638dc5740..528c092902 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 7978a6f980..767699a98a 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 ba8fd70487..551b0dca5d 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 cd4f03fb93..a08bf3fdd3 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 65ab27fce4..0ba026a06f 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 e818fbdcfc..7f53a8e353 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 cbe0b30e4d..ba0f49b5fa 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 e8c362aeb6..9a5d14f3b5 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 dcb30238b0..6487e9a770 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 6c64533409..2ada412415 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 8340982efd..852bb81275 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 6e598e16f9..018b079d74 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 df660988c0..c009ba1728 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 8689e7ee63..afe02acfe0 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 2a42598418..4b67c17190 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 8495e30ae8..e637a56d3b 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 86bcf76c3b..f3abd774d2 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 027d6c8b4e..33dca6dc01 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 d0567c8533..711d17a102 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 7c41498467..f855efdaee 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