From 6c8d626d701b9a9e365270d06a80e3a82de19963 Mon Sep 17 00:00:00 2001 From: ccurme Date: Mon, 9 Sep 2024 14:27:24 -0400 Subject: [PATCH] experimental[major]: upgrade pydantic (#26228) --- .../autonomous_agents/autogpt/agent.py | 2 +- .../autonomous_agents/autogpt/memory.py | 3 +- .../autonomous_agents/autogpt/prompt.py | 2 +- .../autonomous_agents/baby_agi/baby_agi.py | 7 +++-- .../hugginggpt/task_planner.py | 3 +- .../amazon_comprehend_moderation.py | 7 +++-- .../langchain_experimental/cpal/base.py | 2 +- .../langchain_experimental/cpal/models.py | 31 ++++++++++--------- .../fallacy_removal/models.py | 2 +- .../generative_agents/generative_agent.py | 7 +++-- .../graph_transformers/llm.py | 4 +-- .../langchain_experimental/llm_bash/base.py | 21 +++++++------ .../llm_symbolic_math/base.py | 8 +++-- .../llms/anthropic_functions.py | 8 ++--- .../llms/jsonformer_decoder.py | 10 +++--- .../llms/lmformatenforcer_decoder.py | 3 +- .../llms/ollama_functions.py | 18 +++++------ .../llms/rellm_decoder.py | 10 +++--- .../open_clip/open_clip.py | 9 ++++-- .../langchain_experimental/pal_chain/base.py | 18 ++++++----- .../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 | 3 +- .../hugging_face_identifier.py | 9 +++--- .../langchain_experimental/rl_chain/base.py | 18 ++++++----- .../langchain_experimental/smart_llm/base.py | 14 ++++----- .../langchain_experimental/sql/base.py | 15 ++++----- .../langchain_experimental/sql/vector_sql.py | 6 ++-- .../tabular_synthetic_data/base.py | 22 +++++++------ .../tabular_synthetic_data/openai.py | 2 +- .../tools/python/tool.py | 7 +++-- .../langchain_experimental/tot/base.py | 8 +++-- .../langchain_experimental/tot/thought.py | 2 +- .../tot/thought_generation.py | 2 +- .../utilities/python.py | 2 +- .../video_captioning/base.py | 8 +++-- libs/experimental/poetry.lock | 24 +++++++------- libs/experimental/pyproject.toml | 6 ++-- .../integration_tests/chains/test_cpal.py | 2 +- .../chains/test_synthetic_data_openai.py | 2 +- .../llms/test_ollama_functions.py | 2 +- .../experimental/tests/unit_tests/fake_llm.py | 14 ++++----- .../tests/unit_tests/test_ollama_functions.py | 2 +- .../experimental/tests/unit_tests/test_sql.py | 2 +- 45 files changed, 183 insertions(+), 170 deletions(-) diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py index 215b732f3c9..6d1d53fd17e 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/agent.py @@ -13,6 +13,7 @@ from langchain_core.language_models import BaseChatModel from langchain_core.messages import AIMessage, HumanMessage, SystemMessage from langchain_core.tools import BaseTool from langchain_core.vectorstores import VectorStoreRetriever +from pydantic import ValidationError from langchain_experimental.autonomous_agents.autogpt.output_parser import ( AutoGPTOutputParser, @@ -22,7 +23,6 @@ from langchain_experimental.autonomous_agents.autogpt.prompt import AutoGPTPromp from langchain_experimental.autonomous_agents.autogpt.prompt_generator import ( FINISH_NAME, ) -from langchain_experimental.pydantic_v1 import ValidationError class AutoGPT: diff --git a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py index be2b08f1540..a0029acd741 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/memory.py @@ -3,8 +3,7 @@ from typing import Any, Dict, List from langchain.memory.chat_memory import BaseChatMemory from langchain.memory.utils import get_prompt_input_key from langchain_core.vectorstores import VectorStoreRetriever - -from langchain_experimental.pydantic_v1 import Field +from pydantic 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 39ea5d60210..faabfca9295 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/autogpt/prompt.py @@ -7,9 +7,9 @@ from langchain_core.prompts.chat import ( ) from langchain_core.tools import BaseTool from langchain_core.vectorstores import VectorStoreRetriever +from pydantic import BaseModel from langchain_experimental.autonomous_agents.autogpt.prompt_generator import get_prompt -from langchain_experimental.pydantic_v1 import BaseModel # This class has a metaclass conflict: both `BaseChatPromptTemplate` and `BaseModel` 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 ade9537dd6d..d6c101ae598 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 @@ -7,6 +7,7 @@ from langchain.chains.base import Chain from langchain_core.callbacks.manager import CallbackManagerForChainRun from langchain_core.language_models import BaseLanguageModel from langchain_core.vectorstores import VectorStore +from pydantic import BaseModel, ConfigDict, Field from langchain_experimental.autonomous_agents.baby_agi.task_creation import ( TaskCreationChain, @@ -17,7 +18,6 @@ from langchain_experimental.autonomous_agents.baby_agi.task_execution import ( from langchain_experimental.autonomous_agents.baby_agi.task_prioritization import ( TaskPrioritizationChain, ) -from langchain_experimental.pydantic_v1 import BaseModel, Field # This class has a metaclass conflict: both `Chain` and `BaseModel` define a metaclass @@ -51,8 +51,9 @@ class BabyAGI(Chain, BaseModel): # type: ignore[misc] vectorstore: VectorStore = Field(init=False) max_iterations: Optional[int] = None - class Config: - arbitrary_types_allowed = True + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) def add_task(self, task: Dict) -> None: self.task_list.append(task) 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 9d2f09ff8cf..c6519ed7de4 100644 --- a/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py +++ b/libs/experimental/langchain_experimental/autonomous_agents/hugginggpt/task_planner.py @@ -13,8 +13,7 @@ from langchain_core.prompts.chat import ( SystemMessagePromptTemplate, ) from langchain_core.tools import BaseTool - -from langchain_experimental.pydantic_v1 import BaseModel +from pydantic import BaseModel DEMONSTRATIONS = [ { diff --git a/libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py b/libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py index 4f76ba7db07..a30ea7f4391 100644 --- a/libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py +++ b/libs/experimental/langchain_experimental/comprehend_moderation/amazon_comprehend_moderation.py @@ -2,6 +2,7 @@ from typing import Any, Dict, List, Optional from langchain.chains.base import Chain from langchain_core.callbacks.manager import CallbackManagerForChainRun +from pydantic import model_validator from langchain_experimental.comprehend_moderation.base_moderation import BaseModeration from langchain_experimental.comprehend_moderation.base_moderation_callbacks import ( @@ -10,7 +11,6 @@ from langchain_experimental.comprehend_moderation.base_moderation_callbacks impo from langchain_experimental.comprehend_moderation.base_moderation_config import ( BaseModerationConfig, ) -from langchain_experimental.pydantic_v1 import root_validator class AmazonComprehendModerationChain(Chain): @@ -54,8 +54,9 @@ class AmazonComprehendModerationChain(Chain): unique_id: Optional[str] = None """A unique id that can be used to identify or group a user or session""" - @root_validator(pre=True) - def create_client(cls, values: Dict[str, Any]) -> Dict[str, Any]: + @model_validator(mode="before") + @classmethod + def create_client(cls, values: Dict[str, Any]) -> Any: """ Creates an Amazon Comprehend client. diff --git a/libs/experimental/langchain_experimental/cpal/base.py b/libs/experimental/langchain_experimental/cpal/base.py index e2f452920ae..e4755654697 100644 --- a/libs/experimental/langchain_experimental/cpal/base.py +++ b/libs/experimental/langchain_experimental/cpal/base.py @@ -7,6 +7,7 @@ from __future__ import annotations import json from typing import Any, ClassVar, Dict, List, Optional, Type +import pydantic from langchain.base_language import BaseLanguageModel from langchain.chains.base import Chain from langchain.chains.llm import LLMChain @@ -14,7 +15,6 @@ from langchain.output_parsers import PydanticOutputParser from langchain_core.callbacks.manager import CallbackManagerForChainRun from langchain_core.prompts.prompt import PromptTemplate -from langchain_experimental import pydantic_v1 as pydantic from langchain_experimental.cpal.constants import Constant from langchain_experimental.cpal.models import ( CausalModel, diff --git a/libs/experimental/langchain_experimental/cpal/models.py b/libs/experimental/langchain_experimental/cpal/models.py index b31954fd769..485bd928a93 100644 --- a/libs/experimental/langchain_experimental/cpal/models.py +++ b/libs/experimental/langchain_experimental/cpal/models.py @@ -4,16 +4,17 @@ import re from typing import Any, List, Optional, Union from langchain_community.graphs.networkx_graph import NetworkxEntityGraph - -from langchain_experimental.cpal.constants import Constant -from langchain_experimental.pydantic_v1 import ( +from pydantic import ( BaseModel, + ConfigDict, Field, PrivateAttr, - root_validator, - validator, + field_validator, + model_validator, ) +from langchain_experimental.cpal.constants import Constant + class NarrativeModel(BaseModel): """ @@ -24,7 +25,7 @@ class NarrativeModel(BaseModel): story_hypothetical: str story_plot: str # causal stack of operations - @validator("*", pre=True) + @field_validator("*", mode="before") def empty_str_to_none(cls, v: str) -> Union[str, None]: """Empty strings are not allowed""" if v == "": @@ -43,10 +44,11 @@ class EntityModel(BaseModel): # TODO: generalize to multivariate math # TODO: acyclic graph - class Config: - validate_assignment = True + model_config = ConfigDict( + validate_assignment=True, + ) - @validator("name") + @field_validator("name") def lower_case_name(cls, v: str) -> str: v = v.lower() return v @@ -73,7 +75,7 @@ class EntitySettingModel(BaseModel): attribute: str = Field(description="name of the attribute to be calculated") value: float = Field(description="entity's attribute value (calculated)") - @validator("name") + @field_validator("name") def lower_case_transform(cls, v: str) -> str: v = v.lower() return v @@ -107,7 +109,7 @@ class InterventionModel(BaseModel): entity_settings: List[EntitySettingModel] system_settings: Optional[List[SystemSettingModel]] = None - @validator("system_settings") + @field_validator("system_settings") def lower_case_name(cls, v: str) -> Union[str, None]: if v is not None: raise NotImplementedError("system_setting is not implemented yet") @@ -152,10 +154,9 @@ class StoryModel(BaseModel): # TODO: when langchain adopts pydantic.v2 replace w/ `__post_init__` # misses hints github.com/pydantic/pydantic/issues/1729#issuecomment-1300576214 - # TODO: move away from `root_validator` since it is deprecated in pydantic v2 - # and causes mypy type-checking failures (hence the `type: ignore`) - @root_validator # type: ignore[call-overload] - def check_intervention_is_valid(cls, values: dict) -> dict: + @model_validator(mode="before") + @classmethod + def check_intervention_is_valid(cls, values: dict) -> Any: valid_names = [e.name for e in values["causal_operations"].entities] for setting in values["intervention"].entity_settings: if setting.name not in valid_names: diff --git a/libs/experimental/langchain_experimental/fallacy_removal/models.py b/libs/experimental/langchain_experimental/fallacy_removal/models.py index a7656b4f5a7..042de0897b6 100644 --- a/libs/experimental/langchain_experimental/fallacy_removal/models.py +++ b/libs/experimental/langchain_experimental/fallacy_removal/models.py @@ -1,6 +1,6 @@ """Models for the Logical Fallacy Chain""" -from langchain_experimental.pydantic_v1 import BaseModel +from pydantic import BaseModel class LogicalFallacy(BaseModel): diff --git a/libs/experimental/langchain_experimental/generative_agents/generative_agent.py b/libs/experimental/langchain_experimental/generative_agents/generative_agent.py index 95247e68242..bfa9f52e697 100644 --- a/libs/experimental/langchain_experimental/generative_agents/generative_agent.py +++ b/libs/experimental/langchain_experimental/generative_agents/generative_agent.py @@ -5,9 +5,9 @@ from typing import Any, Dict, List, Optional, Tuple from langchain.chains import LLMChain from langchain_core.language_models import BaseLanguageModel from langchain_core.prompts import PromptTemplate +from pydantic import BaseModel, ConfigDict, Field from langchain_experimental.generative_agents.memory import GenerativeAgentMemory -from langchain_experimental.pydantic_v1 import BaseModel, Field class GenerativeAgent(BaseModel): @@ -35,8 +35,9 @@ class GenerativeAgent(BaseModel): daily_summaries: List[str] = Field(default_factory=list) # : :meta private: """Summary of the events in the plan that the agent took.""" - class Config: - arbitrary_types_allowed = True + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) # LLM-related methods @staticmethod diff --git a/libs/experimental/langchain_experimental/graph_transformers/llm.py b/libs/experimental/langchain_experimental/graph_transformers/llm.py index 24b8bff5d13..e6b3496be18 100644 --- a/libs/experimental/langchain_experimental/graph_transformers/llm.py +++ b/libs/experimental/langchain_experimental/graph_transformers/llm.py @@ -12,8 +12,8 @@ from langchain_core.prompts import ( HumanMessagePromptTemplate, PromptTemplate, ) -from langchain_core.pydantic_v1 import BaseModel, Field, create_model from langchain_core.runnables import RunnableConfig +from pydantic import BaseModel, Field, create_model examples = [ { @@ -159,7 +159,7 @@ def optional_enum_field( if enum_values and llm_type == "openai-chat": return Field( ..., - enum=enum_values, + enum=enum_values, # type: ignore[call-arg] description=f"{description}. Available options are {enum_values}", **field_kwargs, ) diff --git a/libs/experimental/langchain_experimental/llm_bash/base.py b/libs/experimental/langchain_experimental/llm_bash/base.py index 9b54a747c38..bd9e0eed3e1 100644 --- a/libs/experimental/langchain_experimental/llm_bash/base.py +++ b/libs/experimental/langchain_experimental/llm_bash/base.py @@ -11,10 +11,10 @@ from langchain.chains.llm import LLMChain from langchain.schema import BasePromptTemplate, OutputParserException from langchain_core.callbacks.manager import CallbackManagerForChainRun from langchain_core.language_models import BaseLanguageModel +from pydantic import ConfigDict, Field, model_validator from langchain_experimental.llm_bash.bash import BashProcess from langchain_experimental.llm_bash.prompt import PROMPT -from langchain_experimental.pydantic_v1 import Field, root_validator logger = logging.getLogger(__name__) @@ -39,12 +39,14 @@ class LLMBashChain(Chain): """[Deprecated]""" bash_process: BashProcess = Field(default_factory=BashProcess) #: :meta private: - class Config: - arbitrary_types_allowed = True - extra = "forbid" + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="forbid", + ) - @root_validator(pre=True) - def raise_deprecation(cls, values: Dict) -> Dict: + @model_validator(mode="before") + @classmethod + def raise_deprecation(cls, values: Dict) -> Any: if "llm" in values: warnings.warn( "Directly instantiating an LLMBashChain with an llm is deprecated. " @@ -55,10 +57,9 @@ class LLMBashChain(Chain): values["llm_chain"] = LLMChain(llm=values["llm"], prompt=prompt) return values - # TODO: move away from `root_validator` since it is deprecated in pydantic v2 - # and causes mypy type-checking failures (hence the `type: ignore`) - @root_validator # type: ignore[call-overload] - def validate_prompt(cls, values: Dict) -> Dict: + @model_validator(mode="before") + @classmethod + def validate_prompt(cls, values: Dict) -> Any: if values["llm_chain"].prompt.output_parser is None: raise ValueError( "The prompt used by llm_chain is expected to have an output_parser." diff --git a/libs/experimental/langchain_experimental/llm_symbolic_math/base.py b/libs/experimental/langchain_experimental/llm_symbolic_math/base.py index 8c671038be1..3f107d0d913 100644 --- a/libs/experimental/langchain_experimental/llm_symbolic_math/base.py +++ b/libs/experimental/langchain_experimental/llm_symbolic_math/base.py @@ -13,6 +13,7 @@ from langchain_core.callbacks.manager import ( CallbackManagerForChainRun, ) from langchain_core.prompts.base import BasePromptTemplate +from pydantic import ConfigDict from langchain_experimental.llm_symbolic_math.prompt import PROMPT @@ -36,9 +37,10 @@ class LLMSymbolicMathChain(Chain): input_key: str = "question" #: :meta private: output_key: str = "answer" #: :meta private: - class Config: - arbitrary_types_allowed = True - extra = "forbid" + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="forbid", + ) @property def input_keys(self) -> List[str]: diff --git a/libs/experimental/langchain_experimental/llms/anthropic_functions.py b/libs/experimental/langchain_experimental/llms/anthropic_functions.py index ec3d465a403..e9e62ca6e42 100644 --- a/libs/experimental/langchain_experimental/llms/anthropic_functions.py +++ b/libs/experimental/langchain_experimental/llms/anthropic_functions.py @@ -18,8 +18,7 @@ from langchain_core.messages import ( BaseMessage, SystemMessage, ) - -from langchain_experimental.pydantic_v1 import root_validator +from pydantic import model_validator prompt = """In addition to responding, you can use tools. \ You have access to the following tools. @@ -134,8 +133,9 @@ class AnthropicFunctions(BaseChatModel): llm: BaseChatModel - @root_validator(pre=True) - def validate_environment(cls, values: Dict) -> Dict: + @model_validator(mode="before") + @classmethod + def validate_environment(cls, values: Dict) -> Any: values["llm"] = values.get("llm") or ChatAnthropic(**values) return values diff --git a/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py b/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py index 7040c5db0b2..97410118b89 100644 --- a/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py +++ b/libs/experimental/langchain_experimental/llms/jsonformer_decoder.py @@ -7,8 +7,7 @@ from typing import TYPE_CHECKING, Any, List, Optional, cast from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline from langchain_core.callbacks.manager import CallbackManagerForLLMRun - -from langchain_experimental.pydantic_v1 import Field, root_validator +from pydantic import Field, model_validator if TYPE_CHECKING: import jsonformer @@ -38,10 +37,9 @@ class JsonFormer(HuggingFacePipeline): ) debug: bool = Field(default=False, description="Debug mode.") - # TODO: move away from `root_validator` since it is deprecated in pydantic v2 - # and causes mypy type-checking failures (hence the `type: ignore`) - @root_validator # type: ignore[call-overload] - def check_jsonformer_installation(cls, values: dict) -> dict: + @model_validator(mode="before") + @classmethod + def check_jsonformer_installation(cls, values: dict) -> Any: import_jsonformer() return values diff --git a/libs/experimental/langchain_experimental/llms/lmformatenforcer_decoder.py b/libs/experimental/langchain_experimental/llms/lmformatenforcer_decoder.py index 06913e1c7b4..82cf28d2a65 100644 --- a/libs/experimental/langchain_experimental/llms/lmformatenforcer_decoder.py +++ b/libs/experimental/langchain_experimental/llms/lmformatenforcer_decoder.py @@ -7,8 +7,7 @@ from typing import TYPE_CHECKING, Any, List, Optional from langchain.schema import LLMResult from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline from langchain_core.callbacks.manager import CallbackManagerForLLMRun - -from langchain_experimental.pydantic_v1 import Field +from pydantic import Field if TYPE_CHECKING: import lmformatenforcer diff --git a/libs/experimental/langchain_experimental/llms/ollama_functions.py b/libs/experimental/langchain_experimental/llms/ollama_functions.py index 6bab4242097..e41635be88c 100644 --- a/libs/experimental/langchain_experimental/llms/ollama_functions.py +++ b/libs/experimental/langchain_experimental/llms/ollama_functions.py @@ -31,14 +31,14 @@ from langchain_core.output_parsers.json import JsonOutputParser from langchain_core.output_parsers.pydantic import PydanticOutputParser from langchain_core.outputs import ChatGeneration, ChatResult from langchain_core.prompts import SystemMessagePromptTemplate -from langchain_core.pydantic_v1 import ( - BaseModel, -) from langchain_core.runnables import Runnable, RunnableLambda from langchain_core.runnables.base import RunnableMap from langchain_core.runnables.passthrough import RunnablePassthrough from langchain_core.tools import BaseTool from langchain_core.utils.pydantic import is_basemodel_instance, is_basemodel_subclass +from pydantic import ( + BaseModel, +) DEFAULT_SYSTEM_TEMPLATE = """You have access to the following tools: @@ -83,14 +83,14 @@ def convert_to_ollama_tool(tool: Any) -> Dict: """Convert a tool to an Ollama tool.""" description = None if _is_pydantic_class(tool): - schema = tool.construct().schema() + schema = tool.model_construct().model_json_schema() name = schema["title"] elif isinstance(tool, BaseTool): - schema = tool.tool_call_schema.schema() + schema = tool.tool_call_schema.model_json_schema() name = tool.get_name() description = tool.description elif is_basemodel_instance(tool): - schema = tool.get_input_schema().schema() + schema = tool.get_input_schema().model_json_schema() name = tool.get_name() description = tool.description elif isinstance(tool, dict) and "name" in tool and "parameters" in tool: @@ -192,7 +192,7 @@ class OllamaFunctions(ChatOllama): .. code-block:: python from langchain_experimental.llms import OllamaFunctions - from langchain_core.pydantic_v1 import BaseModel + from pydantic import BaseModel class AnswerWithJustification(BaseModel): '''An answer to the user question along with justification for the answer.''' @@ -213,7 +213,7 @@ class OllamaFunctions(ChatOllama): .. code-block:: python from langchain_experimental.llms import OllamaFunctions - from langchain_core.pydantic_v1 import BaseModel + from pydantic import BaseModel class AnswerWithJustification(BaseModel): '''An answer to the user question along with justification for the answer.''' @@ -234,7 +234,7 @@ class OllamaFunctions(ChatOllama): .. code-block:: python from langchain_experimental.llms import OllamaFunctions, convert_to_ollama_tool - from langchain_core.pydantic_v1 import BaseModel + from pydantic import BaseModel class AnswerWithJustification(BaseModel): '''An answer to the user question along with justification for the answer.''' diff --git a/libs/experimental/langchain_experimental/llms/rellm_decoder.py b/libs/experimental/langchain_experimental/llms/rellm_decoder.py index c0b8d6a2828..2d911d038d6 100644 --- a/libs/experimental/langchain_experimental/llms/rellm_decoder.py +++ b/libs/experimental/langchain_experimental/llms/rellm_decoder.py @@ -7,8 +7,7 @@ from typing import TYPE_CHECKING, Any, List, Optional, cast from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline from langchain_community.llms.utils import enforce_stop_tokens from langchain_core.callbacks.manager import CallbackManagerForLLMRun - -from langchain_experimental.pydantic_v1 import Field, root_validator +from pydantic import Field, model_validator if TYPE_CHECKING: import rellm @@ -40,10 +39,9 @@ class RELLM(HuggingFacePipeline): default=200, description="Maximum number of new tokens to generate." ) - # TODO: move away from `root_validator` since it is deprecated in pydantic v2 - # and causes mypy type-checking failures (hence the `type: ignore`) - @root_validator # type: ignore[call-overload] - def check_rellm_installation(cls, values: dict) -> dict: + @model_validator(mode="before") + @classmethod + def check_rellm_installation(cls, values: dict) -> Any: import_rellm() return values diff --git a/libs/experimental/langchain_experimental/open_clip/open_clip.py b/libs/experimental/langchain_experimental/open_clip/open_clip.py index e5e3ed1099b..33d18b6e9b1 100644 --- a/libs/experimental/langchain_experimental/open_clip/open_clip.py +++ b/libs/experimental/langchain_experimental/open_clip/open_clip.py @@ -1,8 +1,8 @@ from typing import Any, Dict, List -from langchain.pydantic_v1 import BaseModel, root_validator from langchain_core.embeddings import Embeddings from langchain_core.utils.pydantic import get_fields +from pydantic import BaseModel, ConfigDict, model_validator class OpenCLIPEmbeddings(BaseModel, Embeddings): @@ -15,8 +15,11 @@ class OpenCLIPEmbeddings(BaseModel, Embeddings): model_name: str = "ViT-H-14" checkpoint: str = "laion2b_s32b_b79k" - @root_validator() - def validate_environment(cls, values: Dict) -> Dict: + model_config = ConfigDict(protected_namespaces=()) + + @model_validator(mode="before") + @classmethod + def validate_environment(cls, values: Dict) -> Any: """Validate that open_clip and torch libraries are installed.""" try: import open_clip diff --git a/libs/experimental/langchain_experimental/pal_chain/base.py b/libs/experimental/langchain_experimental/pal_chain/base.py index 77109118af5..9311420e856 100644 --- a/libs/experimental/langchain_experimental/pal_chain/base.py +++ b/libs/experimental/langchain_experimental/pal_chain/base.py @@ -14,10 +14,11 @@ from langchain.chains.base import Chain from langchain.chains.llm import LLMChain from langchain_core.callbacks.manager import CallbackManagerForChainRun from langchain_core.language_models import BaseLanguageModel +from pydantic import ConfigDict, Field, model_validator +from typing_extensions import Self from langchain_experimental.pal_chain.colored_object_prompt import COLORED_OBJECT_PROMPT from langchain_experimental.pal_chain.math_prompt import MATH_PROMPT -from langchain_experimental.pydantic_v1 import Field, root_validator from langchain_experimental.utilities import PythonREPL COMMAND_EXECUTION_FUNCTIONS = [ @@ -154,9 +155,9 @@ class PALChain(Chain): incidents. """ - @root_validator(pre=False, skip_on_failure=True) - def post_init(cls, values: Dict) -> Dict: - if not values["allow_dangerous_code"]: + @model_validator(mode="after") + def post_init(self) -> Self: + if not self.allow_dangerous_code: raise ValueError( "This chain relies on the execution of generated code, " "which can be dangerous. " @@ -166,11 +167,12 @@ class PALChain(Chain): "`allow_dangerous_code` to `True`." ) - return values + return self - class Config: - arbitrary_types_allowed = True - extra = "forbid" + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="forbid", + ) @property def input_keys(self) -> List[str]: 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 2ec74339381..d3084282930 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/agent_executor.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/agent_executor.py @@ -5,6 +5,7 @@ from langchain_core.callbacks.manager import ( AsyncCallbackManagerForChainRun, CallbackManagerForChainRun, ) +from pydantic import Field from langchain_experimental.plan_and_execute.executors.base import BaseExecutor from langchain_experimental.plan_and_execute.planners.base import BasePlanner @@ -12,7 +13,6 @@ from langchain_experimental.plan_and_execute.schema import ( BaseStepContainer, ListStepContainer, ) -from langchain_experimental.pydantic_v1 import Field class PlanAndExecute(Chain): 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 f50c1b7fd96..e95f1657a63 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/executors/base.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/executors/base.py @@ -3,9 +3,9 @@ from typing import Any from langchain.chains.base import Chain from langchain_core.callbacks.manager import Callbacks +from pydantic import BaseModel from langchain_experimental.plan_and_execute.schema import StepResponse -from langchain_experimental.pydantic_v1 import BaseModel class BaseExecutor(BaseModel): 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 9ec4da73536..3c86eb15ec0 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/planners/base.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/planners/base.py @@ -3,9 +3,9 @@ from typing import Any, List, Optional from langchain.chains.llm import LLMChain from langchain_core.callbacks.manager import Callbacks +from pydantic import BaseModel from langchain_experimental.plan_and_execute.schema import Plan, PlanOutputParser -from langchain_experimental.pydantic_v1 import BaseModel class BasePlanner(BaseModel): diff --git a/libs/experimental/langchain_experimental/plan_and_execute/schema.py b/libs/experimental/langchain_experimental/plan_and_execute/schema.py index 2c37f92c916..66586c56905 100644 --- a/libs/experimental/langchain_experimental/plan_and_execute/schema.py +++ b/libs/experimental/langchain_experimental/plan_and_execute/schema.py @@ -2,8 +2,7 @@ from abc import abstractmethod from typing import List, Tuple from langchain_core.output_parsers import BaseOutputParser - -from langchain_experimental.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field class Step(BaseModel): diff --git a/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py b/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py index 36ba27cc4de..92159f2f932 100644 --- a/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py +++ b/libs/experimental/langchain_experimental/prompt_injection_identifier/hugging_face_identifier.py @@ -2,10 +2,10 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Any, Union -from langchain.pydantic_v1 import Field, root_validator from langchain_core.tools import BaseTool +from pydantic import Field, model_validator if TYPE_CHECKING: from transformers import Pipeline @@ -81,8 +81,9 @@ class HuggingFaceInjectionIdentifier(BaseTool): Defaults to ``INJECTION``. Value depends on the model used.""" - @root_validator(pre=True) - def validate_environment(cls, values: dict) -> dict: + @model_validator(mode="before") + @classmethod + def validate_environment(cls, values: dict) -> Any: if isinstance(values.get("model"), str): values["model"] = _model_default_factory(model_name=values["model"]) return values diff --git a/libs/experimental/langchain_experimental/rl_chain/base.py b/libs/experimental/langchain_experimental/rl_chain/base.py index ca11686da7e..2bd538f458d 100644 --- a/libs/experimental/langchain_experimental/rl_chain/base.py +++ b/libs/experimental/langchain_experimental/rl_chain/base.py @@ -25,8 +25,8 @@ from langchain_core.prompts import ( HumanMessagePromptTemplate, SystemMessagePromptTemplate, ) +from pydantic import BaseModel, ConfigDict, model_validator -from langchain_experimental.pydantic_v1 import BaseModel, root_validator from langchain_experimental.rl_chain.helpers import _Embed from langchain_experimental.rl_chain.metrics import ( MetricsTrackerAverage, @@ -279,8 +279,9 @@ class AutoSelectionScorer(SelectionScorer[Event], BaseModel): ) return chat_prompt - @root_validator(pre=True) - def set_prompt_and_llm_chain(cls, values: Dict[str, Any]) -> Dict[str, Any]: + @model_validator(mode="before") + @classmethod + def set_prompt_and_llm_chain(cls, values: Dict[str, Any]) -> Any: llm = values.get("llm") prompt = values.get("prompt") scoring_criteria_template_str = values.get("scoring_criteria_template_str") @@ -358,8 +359,8 @@ class RLChain(Chain, Generic[TEvent]): active_policy: Policy = _NoOpPolicy() auto_embed: bool = False selection_scorer_activated: bool = True - selected_input_key = "rl_chain_selected" - selected_based_on_input_key = "rl_chain_selected_based_on" + selected_input_key: str = "rl_chain_selected" + selected_based_on_input_key: str = "rl_chain_selected_based_on" metrics: Optional[Union[MetricsTrackerRollingWindow, MetricsTrackerAverage]] = None def __init__( @@ -400,9 +401,10 @@ class RLChain(Chain, Generic[TEvent]): else: self.metrics = MetricsTrackerAverage(step=metrics_step) - class Config: - arbitrary_types_allowed = True - extra = "forbid" + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="forbid", + ) @property def input_keys(self) -> List[str]: diff --git a/libs/experimental/langchain_experimental/smart_llm/base.py b/libs/experimental/langchain_experimental/smart_llm/base.py index 6e25027a2c9..379e29fa7ae 100644 --- a/libs/experimental/langchain_experimental/smart_llm/base.py +++ b/libs/experimental/langchain_experimental/smart_llm/base.py @@ -14,8 +14,7 @@ from langchain_core.prompts.chat import ( ChatPromptTemplate, HumanMessagePromptTemplate, ) - -from langchain_experimental.pydantic_v1 import root_validator +from pydantic import ConfigDict, model_validator class SmartLLMChain(Chain): @@ -83,14 +82,13 @@ class SmartLLMChain(Chain): """Whether to return ideas and critique, in addition to resolution.""" history: SmartLLMChainHistory = SmartLLMChainHistory() - class Config: - extra = "forbid" + model_config = ConfigDict( + extra="forbid", + ) - # TODO: move away from `root_validator` since it is deprecated in pydantic v2 - # and causes mypy type-checking failures (hence the `type: ignore`) - @root_validator # type: ignore[call-overload] + @model_validator(mode="before") @classmethod - def validate_inputs(cls, values: Dict[str, Any]) -> Dict[str, Any]: + def validate_inputs(cls, values: Dict[str, Any]) -> Any: """Ensure we have an LLM for each step.""" llm = values.get("llm") ideation_llm = values.get("ideation_llm") diff --git a/libs/experimental/langchain_experimental/sql/base.py b/libs/experimental/langchain_experimental/sql/base.py index cae029f7092..91a05c64770 100644 --- a/libs/experimental/langchain_experimental/sql/base.py +++ b/libs/experimental/langchain_experimental/sql/base.py @@ -14,8 +14,7 @@ from langchain_community.utilities.sql_database import SQLDatabase from langchain_core.callbacks.manager import CallbackManagerForChainRun from langchain_core.language_models import BaseLanguageModel from langchain_core.prompts.prompt import PromptTemplate - -from langchain_experimental.pydantic_v1 import Field, root_validator +from pydantic import ConfigDict, Field, model_validator INTERMEDIATE_STEPS_KEY = "intermediate_steps" SQL_QUERY = "SQLQuery:" @@ -66,12 +65,14 @@ class SQLDatabaseChain(Chain): query_checker_prompt: Optional[BasePromptTemplate] = None """The prompt template that should be used by the query checker""" - class Config: - arbitrary_types_allowed = True - extra = "forbid" + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="forbid", + ) - @root_validator(pre=True) - def raise_deprecation(cls, values: Dict) -> Dict: + @model_validator(mode="before") + @classmethod + def raise_deprecation(cls, values: Dict) -> Any: if "llm" in values: warnings.warn( "Directly instantiating an SQLDatabaseChain with an llm is deprecated. " diff --git a/libs/experimental/langchain_experimental/sql/vector_sql.py b/libs/experimental/langchain_experimental/sql/vector_sql.py index a82f7b51822..bea736b667d 100644 --- a/libs/experimental/langchain_experimental/sql/vector_sql.py +++ b/libs/experimental/langchain_experimental/sql/vector_sql.py @@ -14,6 +14,7 @@ from langchain_core.language_models import BaseLanguageModel from langchain_core.output_parsers import BaseOutputParser from langchain_core.prompts import BasePromptTemplate from langchain_core.prompts.prompt import PromptTemplate +from pydantic import ConfigDict from langchain_experimental.sql.base import INTERMEDIATE_STEPS_KEY, SQLDatabaseChain @@ -30,8 +31,9 @@ class VectorSQLOutputParser(BaseOutputParser[str]): distance_func_name: str = "distance" """Distance name for Vector SQL""" - class Config: - arbitrary_types_allowed = 1 + model_config = ConfigDict( + arbitrary_types_allowed=True, + ) @property def _type(self) -> str: diff --git a/libs/experimental/langchain_experimental/tabular_synthetic_data/base.py b/libs/experimental/langchain_experimental/tabular_synthetic_data/base.py index 4fb6b382404..a35f59fe62d 100644 --- a/libs/experimental/langchain_experimental/tabular_synthetic_data/base.py +++ b/libs/experimental/langchain_experimental/tabular_synthetic_data/base.py @@ -3,10 +3,11 @@ from typing import Any, Dict, List, Optional, Union, cast from langchain.chains.base import Chain from langchain.chains.llm import LLMChain -from langchain.pydantic_v1 import BaseModel, root_validator from langchain_core.language_models import BaseLanguageModel from langchain_core.prompts.few_shot import FewShotPromptTemplate from langchain_core.utils.pydantic import is_basemodel_instance +from pydantic import BaseModel, ConfigDict, model_validator +from typing_extensions import Self class SyntheticDataGenerator(BaseModel): @@ -34,14 +35,15 @@ class SyntheticDataGenerator(BaseModel): llm_chain: Optional[Chain] = None example_input_key: str = "example" - class Config: - validate_assignment = True + model_config = ConfigDict( + validate_assignment=True, + ) - @root_validator(pre=False, skip_on_failure=True) - def set_llm_chain(cls, values: Dict[str, Any]) -> Dict[str, Any]: - llm_chain = values.get("llm_chain") - llm = values.get("llm") - few_shot_template = values.get("template") + @model_validator(mode="after") + def set_llm_chain(self) -> Self: + llm_chain = self.llm_chain + llm = self.llm + few_shot_template = self.template if not llm_chain: # If llm_chain is None or not present if llm is None or few_shot_template is None: @@ -49,9 +51,9 @@ class SyntheticDataGenerator(BaseModel): "Both llm and few_shot_template must be provided if llm_chain is " "not given." ) - values["llm_chain"] = LLMChain(llm=llm, prompt=few_shot_template) + self.llm_chain = LLMChain(llm=llm, prompt=few_shot_template) - return values + return self @staticmethod def _format_dict_to_string(input_dict: Dict) -> str: diff --git a/libs/experimental/langchain_experimental/tabular_synthetic_data/openai.py b/libs/experimental/langchain_experimental/tabular_synthetic_data/openai.py index 33f33e27d4b..efa9b298248 100644 --- a/libs/experimental/langchain_experimental/tabular_synthetic_data/openai.py +++ b/libs/experimental/langchain_experimental/tabular_synthetic_data/openai.py @@ -1,10 +1,10 @@ from typing import Any, Dict, Optional, Type, Union from langchain.chains.openai_functions import create_structured_output_chain -from langchain.pydantic_v1 import BaseModel from langchain.schema import BaseLLMOutputParser, BasePromptTemplate from langchain_community.chat_models import ChatOpenAI from langchain_core.prompts import PromptTemplate +from pydantic import BaseModel from langchain_experimental.tabular_synthetic_data.base import SyntheticDataGenerator diff --git a/libs/experimental/langchain_experimental/tools/python/tool.py b/libs/experimental/langchain_experimental/tools/python/tool.py index 7c5b367169e..4d51e3eed4e 100644 --- a/libs/experimental/langchain_experimental/tools/python/tool.py +++ b/libs/experimental/langchain_experimental/tools/python/tool.py @@ -7,13 +7,13 @@ from contextlib import redirect_stdout from io import StringIO from typing import Any, Dict, Optional, Type -from langchain.pydantic_v1 import BaseModel, Field, root_validator from langchain_core.callbacks.manager import ( AsyncCallbackManagerForToolRun, CallbackManagerForToolRun, ) from langchain_core.runnables.config import run_in_executor from langchain_core.tools import BaseTool +from pydantic import BaseModel, Field, model_validator from langchain_experimental.utilities.python import PythonREPL @@ -97,8 +97,9 @@ class PythonAstREPLTool(BaseTool): sanitize_input: bool = True args_schema: Type[BaseModel] = PythonInputs - @root_validator(pre=True) - def validate_python_version(cls, values: Dict) -> Dict: + @model_validator(mode="before") + @classmethod + def validate_python_version(cls, values: Dict) -> Any: """Validate valid python version.""" if sys.version_info < (3, 9): raise ValueError( diff --git a/libs/experimental/langchain_experimental/tot/base.py b/libs/experimental/langchain_experimental/tot/base.py index 7de31381960..b7ae696075f 100644 --- a/libs/experimental/langchain_experimental/tot/base.py +++ b/libs/experimental/langchain_experimental/tot/base.py @@ -9,6 +9,7 @@ from langchain_core.callbacks.manager import ( AsyncCallbackManagerForChainRun, CallbackManagerForChainRun, ) +from pydantic import ConfigDict from langchain_experimental.tot.checker import ToTChecker from langchain_experimental.tot.controller import ToTController @@ -42,9 +43,10 @@ class ToTChain(Chain): tot_strategy_class: Type[BaseThoughtGenerationStrategy] = ProposePromptStrategy verbose_llm: bool = False - class Config: - arbitrary_types_allowed = True - extra = "forbid" + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="forbid", + ) @classmethod def from_llm(cls, llm: BaseLanguageModel, **kwargs: Any) -> ToTChain: diff --git a/libs/experimental/langchain_experimental/tot/thought.py b/libs/experimental/langchain_experimental/tot/thought.py index 88344e51674..c68cab56d69 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 langchain_experimental.pydantic_v1 import BaseModel, Field +from pydantic 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 32e58f9fed6..9997789d440 100644 --- a/libs/experimental/langchain_experimental/tot/thought_generation.py +++ b/libs/experimental/langchain_experimental/tot/thought_generation.py @@ -12,8 +12,8 @@ from typing import Any, Dict, List, Tuple from langchain.chains.llm import LLMChain from langchain_core.prompts.base import BasePromptTemplate +from pydantic import Field -from langchain_experimental.pydantic_v1 import Field from langchain_experimental.tot.prompts import get_cot_prompt, get_propose_prompt diff --git a/libs/experimental/langchain_experimental/utilities/python.py b/libs/experimental/langchain_experimental/utilities/python.py index 66779d0bbdd..b29164fc6f9 100644 --- a/libs/experimental/langchain_experimental/utilities/python.py +++ b/libs/experimental/langchain_experimental/utilities/python.py @@ -6,7 +6,7 @@ import sys from io import StringIO from typing import Dict, Optional -from langchain.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field logger = logging.getLogger(__name__) diff --git a/libs/experimental/langchain_experimental/video_captioning/base.py b/libs/experimental/langchain_experimental/video_captioning/base.py index 2cbbdbb8422..66d54b39f17 100644 --- a/libs/experimental/langchain_experimental/video_captioning/base.py +++ b/libs/experimental/langchain_experimental/video_captioning/base.py @@ -4,6 +4,7 @@ from langchain.chains.base import Chain from langchain_core.callbacks import CallbackManagerForChainRun from langchain_core.language_models import BaseLanguageModel from langchain_core.prompts import PromptTemplate +from pydantic import ConfigDict from langchain_experimental.video_captioning.services.audio_service import ( AudioProcessor, @@ -36,9 +37,10 @@ class VideoCaptioningChain(Chain): closed_caption_similarity_threshold: int = 80 use_unclustered_video_models: bool = False - class Config: - arbitrary_types_allowed = True - extra = "allow" + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="allow", + ) @property def input_keys(self) -> List[str]: diff --git a/libs/experimental/poetry.lock b/libs/experimental/poetry.lock index f3755836c36..b730e018145 100644 --- a/libs/experimental/poetry.lock +++ b/libs/experimental/poetry.lock @@ -1532,7 +1532,7 @@ files = [ [[package]] name = "langchain" -version = "0.2.16" +version = "0.3.0.dev1" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -1542,8 +1542,8 @@ develop = true [package.dependencies] aiohttp = "^3.8.3" async-timeout = {version = "^4.0.0", markers = "python_version < \"3.11\""} -langchain-core = "^0.3.0.dev" -langchain-text-splitters = "^0.2.0" +langchain-core = "^0.3.0.dev2" +langchain-text-splitters = "^0.3.0.dev1" langsmith = "^0.1.17" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, @@ -1571,9 +1571,9 @@ develop = true [package.dependencies] aiohttp = "^3.8.3" dataclasses-json = ">= 0.5.7, < 0.7" -langchain = "^0.2.16" -langchain-core = "^0.3.0.dev" -langsmith = "^0.1.0" +langchain = "^0.3.0.dev1" +langchain-core = "^0.3.0.dev2" +langsmith = "^0.1.112" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, @@ -1590,7 +1590,7 @@ url = "../community" [[package]] name = "langchain-core" -version = "0.3.0.dev1" +version = "0.3.0.dev4" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -1599,7 +1599,7 @@ develop = true [package.dependencies] jsonpatch = "^1.33" -langsmith = "^0.1.75" +langsmith = "^0.1.112" packaging = ">=23.2,<25" pydantic = "^2.7.4" PyYAML = ">=5.3" @@ -1612,7 +1612,7 @@ url = "../core" [[package]] name = "langchain-openai" -version = "0.1.23" +version = "0.2.0.dev2" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = ">=3.9,<4.0" @@ -1620,7 +1620,7 @@ files = [] develop = true [package.dependencies] -langchain-core = "^0.3.0.dev" +langchain-core = "^0.3.0.dev1" openai = "^1.40.0" tiktoken = ">=0.7,<1" @@ -1630,7 +1630,7 @@ url = "../partners/openai" [[package]] name = "langchain-text-splitters" -version = "0.2.4" +version = "0.3.0.dev1" description = "LangChain text splitting utilities" optional = false python-versions = ">=3.9,<4.0" @@ -3771,4 +3771,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "636a7291000f4f38d392d3e04a2f9902cf4a9dcf7d7f55e5bd8f1f8335673704" +content-hash = "4ee22c79e316e5e2fadd726f715b4cb8ace00e7f24d361d2e24e0c53288bdc89" diff --git a/libs/experimental/pyproject.toml b/libs/experimental/pyproject.toml index 72274cb738f..235beb9924b 100644 --- a/libs/experimental/pyproject.toml +++ b/libs/experimental/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-experimental" -version = "0.0.65" +version = "0.3.0.dev1" description = "Building applications with LLMs through composability" authors = [] license = "MIT" @@ -22,8 +22,8 @@ exclude = ["notebooks", "examples", "example_data"] [tool.poetry.dependencies] python = ">=3.9,<4.0" -langchain-core = "^0.3.0.dev" -langchain-community = "^0.3.0.dev" +langchain-core = "^0.3.0.dev4" +langchain-community = "^0.3.0.dev1" [tool.ruff.lint] select = ["E", "F", "I", "T201"] diff --git a/libs/experimental/tests/integration_tests/chains/test_cpal.py b/libs/experimental/tests/integration_tests/chains/test_cpal.py index b550ea036f4..caa33787564 100644 --- a/libs/experimental/tests/integration_tests/chains/test_cpal.py +++ b/libs/experimental/tests/integration_tests/chains/test_cpal.py @@ -5,12 +5,12 @@ import unittest from typing import Type from unittest import mock +import pydantic import pytest from langchain.output_parsers import PydanticOutputParser from langchain_community.llms import OpenAI from langchain_core.prompts.prompt import PromptTemplate -from langchain_experimental import pydantic_v1 as pydantic from langchain_experimental.cpal.base import ( CausalChain, CPALChain, diff --git a/libs/experimental/tests/integration_tests/chains/test_synthetic_data_openai.py b/libs/experimental/tests/integration_tests/chains/test_synthetic_data_openai.py index 3fcc8f60ee2..9570042dfc4 100644 --- a/libs/experimental/tests/integration_tests/chains/test_synthetic_data_openai.py +++ b/libs/experimental/tests/integration_tests/chains/test_synthetic_data_openai.py @@ -1,7 +1,7 @@ import pytest -from langchain.pydantic_v1 import BaseModel from langchain_community.chat_models import ChatOpenAI from langchain_core.prompts.few_shot import FewShotPromptTemplate +from pydantic import BaseModel from langchain_experimental.tabular_synthetic_data.base import SyntheticDataGenerator from langchain_experimental.tabular_synthetic_data.openai import ( diff --git a/libs/experimental/tests/integration_tests/llms/test_ollama_functions.py b/libs/experimental/tests/integration_tests/llms/test_ollama_functions.py index 871362ccfc1..58fbff7c130 100644 --- a/libs/experimental/tests/integration_tests/llms/test_ollama_functions.py +++ b/libs/experimental/tests/integration_tests/llms/test_ollama_functions.py @@ -5,7 +5,7 @@ import unittest from langchain_community.tools import DuckDuckGoSearchResults from langchain_community.tools.pubmed.tool import PubmedQueryRun from langchain_core.messages import AIMessage -from langchain_core.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field from langchain_experimental.llms.ollama_functions import ( OllamaFunctions, diff --git a/libs/experimental/tests/unit_tests/fake_llm.py b/libs/experimental/tests/unit_tests/fake_llm.py index fc22ba6e060..f1c0652ab9c 100644 --- a/libs/experimental/tests/unit_tests/fake_llm.py +++ b/libs/experimental/tests/unit_tests/fake_llm.py @@ -4,8 +4,7 @@ from typing import Any, Dict, List, Mapping, Optional, cast from langchain_core.callbacks.manager import CallbackManagerForLLMRun from langchain_core.language_models import LLM - -from langchain_experimental.pydantic_v1 import validator +from pydantic import model_validator class FakeLLM(LLM): @@ -15,15 +14,14 @@ class FakeLLM(LLM): sequential_responses: Optional[bool] = False response_index: int = 0 - @validator("queries", always=True) - def check_queries_required( - cls, queries: Optional[Mapping], values: Mapping[str, Any] - ) -> Optional[Mapping]: - if values.get("sequential_response") and not queries: + @model_validator(mode="before") + @classmethod + def check_queries_required(cls, values: dict) -> dict: + if values.get("sequential_response") and not values.get("queries"): raise ValueError( "queries is required when sequential_response is set to True" ) - return queries + return values def get_num_tokens(self, text: str) -> int: """Return number of tokens.""" diff --git a/libs/experimental/tests/unit_tests/test_ollama_functions.py b/libs/experimental/tests/unit_tests/test_ollama_functions.py index 1404473d501..c6e9352d82a 100644 --- a/libs/experimental/tests/unit_tests/test_ollama_functions.py +++ b/libs/experimental/tests/unit_tests/test_ollama_functions.py @@ -3,7 +3,7 @@ from typing import Any from unittest.mock import patch from langchain_core.prompts import ChatPromptTemplate -from langchain_core.pydantic_v1 import BaseModel +from pydantic import BaseModel from langchain_experimental.llms.ollama_functions import OllamaFunctions diff --git a/libs/experimental/tests/unit_tests/test_sql.py b/libs/experimental/tests/unit_tests/test_sql.py index 8514e5ce2ad..e9ad12c421e 100644 --- a/libs/experimental/tests/unit_tests/test_sql.py +++ b/libs/experimental/tests/unit_tests/test_sql.py @@ -1,6 +1,6 @@ from langchain.memory import ConversationBufferMemory from langchain.output_parsers.list import CommaSeparatedListOutputParser -from langchain.sql_database import SQLDatabase +from langchain_community.utilities import SQLDatabase from langchain_core.prompts import PromptTemplate from langchain_experimental.sql.base import SQLDatabaseChain, SQLDatabaseSequentialChain