diff --git a/nemoguardrails/eval/models.py b/nemoguardrails/eval/models.py index f55152a3c..61a1af6cf 100644 --- a/nemoguardrails/eval/models.py +++ b/nemoguardrails/eval/models.py @@ -16,7 +16,7 @@ import os from typing import Any, Dict, List, Optional, Union -from pydantic import BaseModel, Field, root_validator +from pydantic import BaseModel, Field, model_validator from nemoguardrails.eval.utils import load_dict_from_path from nemoguardrails.logging.explain import LLMCallInfo @@ -107,7 +107,7 @@ class InteractionSet(BaseModel): description="A list of tags that should be associated with the interactions. Useful for filtering when reporting.", ) - @root_validator(pre=True) + @model_validator(mode="before") def instantiate_expected_output(cls, values: Any): """Creates the right instance of the expected output.""" type_mapping = { @@ -147,11 +147,11 @@ class EvalConfig(BaseModel): description="The prompts that should be used for the various LLM tasks.", ) - @root_validator(pre=False, skip_on_failure=True) - def validate_policy_ids(cls, values: Any): + @model_validator(mode="after") + def validate_policy_ids(cls, values: "EvalConfig") -> "EvalConfig": """Validates the policy ids used in the interactions.""" - policy_ids = {policy.id for policy in values.get("policies")} - for interaction_set in values.get("interactions"): + policy_ids = {policy.id for policy in values.policies} + for interaction_set in values.interactions: for expected_output in interaction_set.expected_output: if expected_output.policy not in policy_ids: raise ValueError( @@ -180,7 +180,7 @@ def from_path( else: raise ValueError(f"Invalid config path {config_path}.") - return cls.parse_obj(config_obj) + return cls.model_validate(config_obj) class ComplianceCheckLog(BaseModel): @@ -361,4 +361,4 @@ def from_path( else: raise ValueError(f"Invalid config path {output_path}.") - return cls.parse_obj(output_obj) + return cls.model_validate(output_obj) diff --git a/nemoguardrails/library/factchecking/align_score/requirements.txt b/nemoguardrails/library/factchecking/align_score/requirements.txt index 6577a6315..1fb3cfc19 100644 --- a/nemoguardrails/library/factchecking/align_score/requirements.txt +++ b/nemoguardrails/library/factchecking/align_score/requirements.txt @@ -1,5 +1,5 @@ # The minimal set of requirements for the AlignScore server to run. -pydantic>=1.10 +pydantic>=2.10.6 fastapi>=0.109.1 starlette>=0.36.2 typer>=0.7.0 diff --git a/nemoguardrails/library/jailbreak_detection/requirements.txt b/nemoguardrails/library/jailbreak_detection/requirements.txt index d970b083f..886ecefbd 100644 --- a/nemoguardrails/library/jailbreak_detection/requirements.txt +++ b/nemoguardrails/library/jailbreak_detection/requirements.txt @@ -1,5 +1,5 @@ # The minimal set of requirements for the jailbreak detection server to run. -pydantic>=1.10.9 +pydantic>=2.10.6 fastapi>=0.103.1 starlette>=0.27.0 typer>=0.7.0 diff --git a/nemoguardrails/llm/providers/_langchain_nvidia_ai_endpoints_patch.py b/nemoguardrails/llm/providers/_langchain_nvidia_ai_endpoints_patch.py index d547a40b6..6f39fdb21 100644 --- a/nemoguardrails/llm/providers/_langchain_nvidia_ai_endpoints_patch.py +++ b/nemoguardrails/llm/providers/_langchain_nvidia_ai_endpoints_patch.py @@ -22,7 +22,7 @@ from langchain_core.messages import BaseMessage from langchain_core.outputs import ChatResult from langchain_nvidia_ai_endpoints import ChatNVIDIA as ChatNVIDIAOriginal -from pydantic.v1 import Field +from pydantic import Field log = logging.getLogger(__name__) diff --git a/nemoguardrails/llm/providers/nemollm.py b/nemoguardrails/llm/providers/nemollm.py index 0d51c7746..6996b40fc 100644 --- a/nemoguardrails/llm/providers/nemollm.py +++ b/nemoguardrails/llm/providers/nemollm.py @@ -27,7 +27,7 @@ from langchain.schema import Generation from langchain.schema.output import GenerationChunk, LLMResult from langchain_core.language_models.llms import BaseLLM -from pydantic.v1 import root_validator +from pydantic import model_validator log = logging.getLogger(__name__) @@ -52,7 +52,7 @@ class NeMoLLM(BaseLLM): streaming: bool = False check_api_host_version: bool = True - @root_validator(pre=True, allow_reuse=True) + @model_validator(mode="before") def check_env_variables(cls, values): for field in ["api_host", "api_key", "organization_id"]: # If it's an explicit environment variable, we use that diff --git a/nemoguardrails/llm/providers/trtllm/llm.py b/nemoguardrails/llm/providers/trtllm/llm.py index aa57b2df6..fc6967e3d 100644 --- a/nemoguardrails/llm/providers/trtllm/llm.py +++ b/nemoguardrails/llm/providers/trtllm/llm.py @@ -22,7 +22,7 @@ from langchain.callbacks.manager import CallbackManagerForLLMRun from langchain_core.language_models.llms import BaseLLM -from pydantic.v1 import Field, root_validator +from pydantic import Field, model_validator from nemoguardrails.llm.providers.trtllm.client import TritonClient @@ -61,12 +61,12 @@ class TRTLLM(BaseLLM): client: Any streaming: Optional[bool] = True - @root_validator(allow_reuse=True) + @model_validator(mode="after") @classmethod - def validate_environment(cls, values: Dict[str, Any]) -> Dict[str, Any]: + def validate_environment(cls, values: "TRTLLM") -> "TRTLLM": """Validate that python package exists in environment.""" try: - values["client"] = TritonClient(values["server_url"]) + values.client = TritonClient(values.server_url) except ImportError as err: raise ImportError( diff --git a/nemoguardrails/rails/llm/config.py b/nemoguardrails/rails/llm/config.py index ba508d405..182c40dc9 100644 --- a/nemoguardrails/rails/llm/config.py +++ b/nemoguardrails/rails/llm/config.py @@ -23,8 +23,7 @@ from typing import Any, Dict, List, Optional, Set, Tuple, Union import yaml -from pydantic import BaseModel, ConfigDict, ValidationError, root_validator -from pydantic.fields import Field +from pydantic import BaseModel, ConfigDict, Field, ValidationError, model_validator from nemoguardrails import utils from nemoguardrails.colang import parse_colang_file, parse_flow_elements @@ -253,7 +252,7 @@ class TaskPrompt(BaseModel): description="The maximum number of tokens that can be generated in the chat completion.", ) - @root_validator(pre=True, allow_reuse=True) + @model_validator(mode="before") def check_fields(cls, values): if not values.get("content") and not values.get("messages"): raise ValidationError("One of `content` or `messages` must be provided.") @@ -947,16 +946,15 @@ class RailsConfig(BaseModel): description="The list of bot messages that should be used for the rails.", ) - # NOTE: the Any below is used to get rid of a warning with pydantic 1.10.x; - # The correct typing should be List[Dict, Flow]. To be updated when - # support for pydantic 1.10.x is dropped. - flows: List[Union[Dict, Any]] = Field( + flows: List[Union[Dict, Flow]] = Field( default_factory=list, description="The list of flows that should be used for the rails.", ) instructions: Optional[List[Instruction]] = Field( - default=[Instruction.parse_obj(obj) for obj in _default_config["instructions"]], + default=[ + Instruction.model_validate(obj) for obj in _default_config["instructions"] + ], description="List of instructions in natural language that the LLM should use.", ) @@ -1061,7 +1059,7 @@ class RailsConfig(BaseModel): description="Configuration for tracing.", ) - @root_validator(pre=True, allow_reuse=True) + @model_validator(mode="before") def check_prompt_exist_for_self_check_rails(cls, values): rails = values.get("rails", {}) @@ -1115,7 +1113,7 @@ def check_prompt_exist_for_self_check_rails(cls, values): return values - @root_validator(pre=True, allow_reuse=True) + @model_validator(mode="before") def check_output_parser_exists(cls, values): tasks_requiring_output_parser = [ "self_check_input", @@ -1148,7 +1146,7 @@ def check_output_parser_exists(cls, values): ) return values - @root_validator(pre=True, allow_reuse=True) + @model_validator(mode="before") def fill_in_default_values_for_v2_x(cls, values): instructions = values.get("instructions", {}) sample_conversation = values.get("sample_conversation") @@ -1277,7 +1275,7 @@ def parse_object(cls, obj): ): flow_data["elements"] = parse_flow_elements(flow_data["elements"]) - return cls.parse_obj(obj) + return cls.model_validate(obj) @property def streaming_supported(self): diff --git a/nemoguardrails/rails/llm/options.py b/nemoguardrails/rails/llm/options.py index 51c712f03..ad02a5618 100644 --- a/nemoguardrails/rails/llm/options.py +++ b/nemoguardrails/rails/llm/options.py @@ -78,7 +78,7 @@ """ from typing import Any, Dict, List, Optional, Union -from pydantic import BaseModel, Field, root_validator +from pydantic import BaseModel, Field, model_validator from nemoguardrails.logging.explain import LLMCallInfo, LLMCallSummary @@ -168,7 +168,7 @@ class GenerationOptions(BaseModel): description="Options about what to include in the log. By default, nothing is included. ", ) - @root_validator(pre=True, allow_reuse=True) + @model_validator(mode="before") def check_fields(cls, values): # Translate the `rails` generation option from List[str] to dict. if "rails" in values and isinstance(values["rails"], list): diff --git a/nemoguardrails/server/api.py b/nemoguardrails/server/api.py index d07cb63df..b1d9f3c15 100644 --- a/nemoguardrails/server/api.py +++ b/nemoguardrails/server/api.py @@ -26,7 +26,7 @@ from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware -from pydantic import BaseModel, Field, root_validator, validator +from pydantic import BaseModel, Field, field_validator, model_validator from starlette.responses import StreamingResponse from starlette.staticfiles import StaticFiles @@ -208,7 +208,7 @@ class RequestBody(BaseModel): description="A state object that should be used to continue the interaction.", ) - @root_validator(pre=True) + @model_validator(mode="before") def ensure_config_id(cls, data: Any) -> Any: if isinstance(data, dict): if data.get("config_id") is not None and data.get("config_ids") is not None: @@ -223,11 +223,15 @@ def ensure_config_id(cls, data: Any) -> Any: ) return data - @validator("config_ids", pre=True, always=True) + @field_validator("config_ids", mode="before") def ensure_config_ids(cls, v, values): - if v is None and values.get("config_id") and values.get("config_ids") is None: + if ( + v is None + and values.data.get("config_id") + and values.data.get("config_ids") is None + ): # populate config_ids with config_id if only config_id is provided - return [values["config_id"]] + return [values.data["config_id"]] return v diff --git a/poetry.lock b/poetry.lock index a1053cc50..15911e04d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4908,62 +4908,34 @@ description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444"}, {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2"}, {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03"}, - {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443"}, {file = "SQLAlchemy-2.0.38-cp310-cp310-win32.whl", hash = "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297"}, {file = "SQLAlchemy-2.0.38-cp310-cp310-win_amd64.whl", hash = "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2"}, {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6"}, {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c"}, - {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3"}, {file = "SQLAlchemy-2.0.38-cp311-cp311-win32.whl", hash = "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba"}, {file = "SQLAlchemy-2.0.38-cp311-cp311-win_amd64.whl", hash = "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32"}, {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e"}, {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579"}, - {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd"}, {file = "SQLAlchemy-2.0.38-cp312-cp312-win32.whl", hash = "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725"}, {file = "SQLAlchemy-2.0.38-cp312-cp312-win_amd64.whl", hash = "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b"}, {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096"}, {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a"}, - {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86"}, {file = "SQLAlchemy-2.0.38-cp313-cp313-win32.whl", hash = "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120"}, {file = "SQLAlchemy-2.0.38-cp313-cp313-win_amd64.whl", hash = "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40310db77a55512a18827488e592965d3dec6a3f1e3d8af3f8243134029daca3"}, {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3043375dd5bbcb2282894cbb12e6c559654c67b5fffb462fda815a55bf93f7"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70065dfabf023b155a9c2a18f573e47e6ca709b9e8619b2e04c54d5bcf193178"}, {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c058b84c3b24812c859300f3b5abf300daa34df20d4d4f42e9652a4d1c48c8a4"}, - {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0398361acebb42975deb747a824b5188817d32b5c8f8aba767d51ad0cc7bb08d"}, {file = "SQLAlchemy-2.0.38-cp37-cp37m-win32.whl", hash = "sha256:a2bc4e49e8329f3283d99840c136ff2cd1a29e49b5624a46a290f04dff48e079"}, {file = "SQLAlchemy-2.0.38-cp37-cp37m-win_amd64.whl", hash = "sha256:9cd136184dd5f58892f24001cdce986f5d7e96059d004118d5410671579834a4"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:665255e7aae5f38237b3a6eae49d2358d83a59f39ac21036413fab5d1e810578"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:92f99f2623ff16bd4aaf786ccde759c1f676d39c7bf2855eb0b540e1ac4530c8"}, {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa498d1392216fae47eaf10c593e06c34476ced9549657fca713d0d1ba5f7248"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9afbc3909d0274d6ac8ec891e30210563b2c8bdd52ebbda14146354e7a69373"}, {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:57dd41ba32430cbcc812041d4de8d2ca4651aeefad2626921ae2a23deb8cd6ff"}, - {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3e35d5565b35b66905b79ca4ae85840a8d40d31e0b3e2990f2e7692071b179ca"}, {file = "SQLAlchemy-2.0.38-cp38-cp38-win32.whl", hash = "sha256:f0d3de936b192980209d7b5149e3c98977c3810d401482d05fb6d668d53c1c63"}, {file = "SQLAlchemy-2.0.38-cp38-cp38-win_amd64.whl", hash = "sha256:3868acb639c136d98107c9096303d2d8e5da2880f7706f9f8c06a7f961961149"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50"}, {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68"}, {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9"}, - {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728"}, {file = "SQLAlchemy-2.0.38-cp39-cp39-win32.whl", hash = "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc"}, {file = "SQLAlchemy-2.0.38-cp39-cp39-win_amd64.whl", hash = "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1"}, - {file = "SQLAlchemy-2.0.38-py3-none-any.whl", hash = "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753"}, {file = "sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb"}, ] @@ -5968,4 +5940,4 @@ tracing = ["aiofiles", "opentelemetry-api", "opentelemetry-sdk"] [metadata] lock-version = "2.0" python-versions = ">=3.9,!=3.9.7,<3.13" -content-hash = "ffd97ea8a3a37e069593b4aaba92c2d2e62bd2a6db59e7dba1adbdc1d415700b" +content-hash = "d3d3e95b6f3e1e7be5432669c706f239bbb95f636ccbae0bf1f1296090c2b3e9" diff --git a/pyproject.toml b/pyproject.toml index 10a000b64..36d26280d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ langchain-community = ">=0.0.16,<0.4.0" lark = ">=1.1.7" nest-asyncio = ">=1.5.6," prompt-toolkit = ">=3.0" -pydantic = ">=1.10" +pydantic = ">=2.0" pyyaml = ">=6.0" rich = ">=13.5.2" simpleeval = ">=0.9.13,"