From 07ee41d28421334101596983baac1eaf8e2a4d8b Mon Sep 17 00:00:00 2001 From: Nuno Campos Date: Mon, 19 Feb 2024 13:26:42 -0800 Subject: [PATCH] Cache calls to create_model for get_input_schema and get_output_schema (#17755) Thank you for contributing to LangChain! - [ ] **PR title**: "package: description" - Where "package" is whichever of langchain, community, core, experimental, etc. is being modified. Use "docs: ..." for purely docs changes, "templates: ..." for template changes, "infra: ..." for CI changes. - Example: "community: add foobar LLM" - [ ] **PR message**: ***Delete this entire checklist*** and replace with - **Description:** a description of the change - **Issue:** the issue # it fixes, if applicable - **Dependencies:** any dependencies required for this change - **Twitter handle:** if your PR gets announced, and you'd like a mention, we'll gladly shout you out! - [ ] **Add tests and docs**: If you're adding a new integration, please include 1. a test for the integration, preferably unit tests that do not rely on network access, 2. an example notebook showing its use. It lives in `docs/docs/integrations` directory. - [ ] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ Additional guidelines: - Make sure optional dependencies are imported within a function. - Please do not add dependencies to pyproject.toml files (even optional ones) unless they are required for unit tests. - Most PRs should not touch more than one package. - Changes should be backwards compatible. - If you are adding something to community, do not re-import it in langchain. If no one reviews your PR within a few days, please @-mention one of baskaryan, efriis, eyurtsev, hwchase17. --- .gitignore | 4 +- libs/core/Makefile | 3 + libs/core/langchain_core/prompts/base.py | 3 +- libs/core/langchain_core/runnables/base.py | 22 +------- libs/core/langchain_core/runnables/history.py | 3 +- .../langchain_core/runnables/passthrough.py | 8 ++- libs/core/langchain_core/runnables/utils.py | 32 +++++++++++ libs/core/poetry.lock | 55 ++++++++++++++++++- libs/core/pyproject.toml | 1 + libs/langchain/langchain/chains/base.py | 9 +-- .../chains/combine_documents/base.py | 3 +- .../chains/combine_documents/map_reduce.py | 3 +- .../chains/combine_documents/map_rerank.py | 3 +- 13 files changed, 112 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 407a65571a..db21b91109 100644 --- a/.gitignore +++ b/.gitignore @@ -177,4 +177,6 @@ docs/docs/build docs/docs/node_modules docs/docs/yarn.lock _dist -docs/docs/templates \ No newline at end of file +docs/docs/templates + +prof diff --git a/libs/core/Makefile b/libs/core/Makefile index ab8e9cadf0..d577f66cc7 100644 --- a/libs/core/Makefile +++ b/libs/core/Makefile @@ -15,6 +15,9 @@ tests: test_watch: poetry run ptw --snapshot-update --now . -- -vv -x tests/unit_tests +test_profile: + poetry run pytest -vv tests/unit_tests/ --profile-svg + check_imports: $(shell find langchain_core -name '*.py') poetry run python ./scripts/check_imports.py $^ diff --git a/libs/core/langchain_core/prompts/base.py b/libs/core/langchain_core/prompts/base.py index 96cfbf6374..9f8ae5082f 100644 --- a/libs/core/langchain_core/prompts/base.py +++ b/libs/core/langchain_core/prompts/base.py @@ -25,9 +25,10 @@ from langchain_core.prompt_values import ( PromptValue, StringPromptValue, ) -from langchain_core.pydantic_v1 import BaseModel, Field, create_model, root_validator +from langchain_core.pydantic_v1 import BaseModel, Field, root_validator from langchain_core.runnables import RunnableConfig, RunnableSerializable from langchain_core.runnables.config import ensure_config +from langchain_core.runnables.utils import create_model if TYPE_CHECKING: from langchain_core.documents import Document diff --git a/libs/core/langchain_core/runnables/base.py b/libs/core/langchain_core/runnables/base.py index 4e4a79a50c..8c9f0b8b02 100644 --- a/libs/core/langchain_core/runnables/base.py +++ b/libs/core/langchain_core/runnables/base.py @@ -38,7 +38,7 @@ from typing_extensions import Literal, get_args from langchain_core._api import beta_decorator from langchain_core.load.dump import dumpd from langchain_core.load.serializable import Serializable -from langchain_core.pydantic_v1 import BaseConfig, BaseModel, Field, create_model +from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.runnables.config import ( RunnableConfig, acall_func_with_variable_args, @@ -65,6 +65,7 @@ from langchain_core.runnables.utils import ( accepts_config, accepts_context, accepts_run_manager, + create_model, gather_with_concurrency, get_function_first_arg_dict_keys, get_function_nonlocals, @@ -95,10 +96,6 @@ if TYPE_CHECKING: Other = TypeVar("Other") -class _SchemaConfig(BaseConfig): - arbitrary_types_allowed = True - - class Runnable(Generic[Input, Output], ABC): """A unit of work that can be invoked, batched, streamed, transformed and composed. @@ -301,7 +298,6 @@ class Runnable(Generic[Input, Output], ABC): return create_model( self.get_name("Input"), __root__=(root_type, None), - __config__=_SchemaConfig, ) @property @@ -334,7 +330,6 @@ class Runnable(Generic[Input, Output], ABC): return create_model( self.get_name("Output"), __root__=(root_type, None), - __config__=_SchemaConfig, ) @property @@ -371,7 +366,6 @@ class Runnable(Generic[Input, Output], ABC): ) for spec in config_specs }, - __config__=_SchemaConfig, ) if config_specs else None @@ -379,7 +373,6 @@ class Runnable(Generic[Input, Output], ABC): return create_model( # type: ignore[call-overload] self.get_name("Config"), - __config__=_SchemaConfig, **({"configurable": (configurable, None)} if configurable else {}), **{ field_name: (field_type, None) @@ -1691,7 +1684,6 @@ def _seq_input_schema( for k, v in next_input_schema.__fields__.items() if k not in first.mapper.steps }, - __config__=_SchemaConfig, ) elif isinstance(first, RunnablePick): return _seq_input_schema(steps[1:], config) @@ -1724,7 +1716,6 @@ def _seq_output_schema( for k, v in mapper_output_schema.__fields__.items() }, }, - __config__=_SchemaConfig, ) elif isinstance(last, RunnablePick): prev_output_schema = _seq_output_schema(steps[:-1], config) @@ -1738,14 +1729,12 @@ def _seq_output_schema( for k, v in prev_output_schema.__fields__.items() if k in last.keys }, - __config__=_SchemaConfig, ) else: field = prev_output_schema.__fields__[last.keys] return create_model( # type: ignore[call-overload] "RunnableSequenceOutput", __root__=(field.annotation, field.default), - __config__=_SchemaConfig, ) return last.get_output_schema(config) @@ -2598,7 +2587,6 @@ class RunnableParallel(RunnableSerializable[Input, Dict[str, Any]]): for k, v in step.get_input_schema(config).__fields__.items() if k != "__root__" }, - __config__=_SchemaConfig, ) return super().get_input_schema(config) @@ -2610,7 +2598,6 @@ class RunnableParallel(RunnableSerializable[Input, Dict[str, Any]]): return create_model( # type: ignore[call-overload] self.get_name("Output"), **{k: (v.OutputType, None) for k, v in self.steps.items()}, - __config__=_SchemaConfig, ) @property @@ -3250,13 +3237,11 @@ class RunnableLambda(Runnable[Input, Output]): return create_model( self.get_name("Input"), **{item[1:-1]: (Any, None) for item in items}, # type: ignore - __config__=_SchemaConfig, ) else: return create_model( self.get_name("Input"), __root__=(List[Any], None), - __config__=_SchemaConfig, ) if self.InputType != Any: @@ -3266,7 +3251,6 @@ class RunnableLambda(Runnable[Input, Output]): return create_model( self.get_name("Input"), **{key: (Any, None) for key in dict_keys}, # type: ignore - __config__=_SchemaConfig, ) return super().get_input_schema(config) @@ -3756,7 +3740,6 @@ class RunnableEachBase(RunnableSerializable[List[Input], List[Output]]): List[self.bound.get_input_schema(config)], # type: ignore None, ), - __config__=_SchemaConfig, ) @property @@ -3773,7 +3756,6 @@ class RunnableEachBase(RunnableSerializable[List[Input], List[Output]]): List[schema], # type: ignore None, ), - __config__=_SchemaConfig, ) @property diff --git a/libs/core/langchain_core/runnables/history.py b/libs/core/langchain_core/runnables/history.py index f9b68cd68e..5037d2d9f5 100644 --- a/libs/core/langchain_core/runnables/history.py +++ b/libs/core/langchain_core/runnables/history.py @@ -15,12 +15,13 @@ from typing import ( from langchain_core.chat_history import BaseChatMessageHistory from langchain_core.load.load import load -from langchain_core.pydantic_v1 import BaseModel, create_model +from langchain_core.pydantic_v1 import BaseModel from langchain_core.runnables.base import Runnable, RunnableBindingBase, RunnableLambda from langchain_core.runnables.config import run_in_executor from langchain_core.runnables.passthrough import RunnablePassthrough from langchain_core.runnables.utils import ( ConfigurableFieldSpec, + create_model, get_unique_config_specs, ) diff --git a/libs/core/langchain_core/runnables/passthrough.py b/libs/core/langchain_core/runnables/passthrough.py index 3e9277a7a2..17ddda9584 100644 --- a/libs/core/langchain_core/runnables/passthrough.py +++ b/libs/core/langchain_core/runnables/passthrough.py @@ -20,7 +20,7 @@ from typing import ( cast, ) -from langchain_core.pydantic_v1 import BaseModel, create_model +from langchain_core.pydantic_v1 import BaseModel from langchain_core.runnables.base import ( Other, Runnable, @@ -36,7 +36,11 @@ from langchain_core.runnables.config import ( patch_config, ) from langchain_core.runnables.graph import Graph -from langchain_core.runnables.utils import AddableDict, ConfigurableFieldSpec +from langchain_core.runnables.utils import ( + AddableDict, + ConfigurableFieldSpec, + create_model, +) from langchain_core.utils.aiter import atee, py_anext from langchain_core.utils.iter import safetee diff --git a/libs/core/langchain_core/runnables/utils.py b/libs/core/langchain_core/runnables/utils.py index 59d2c86203..8ff332173c 100644 --- a/libs/core/langchain_core/runnables/utils.py +++ b/libs/core/langchain_core/runnables/utils.py @@ -5,6 +5,7 @@ import ast import asyncio import inspect import textwrap +from functools import lru_cache from inspect import signature from itertools import groupby from typing import ( @@ -21,10 +22,13 @@ from typing import ( Protocol, Sequence, Set, + Type, TypeVar, Union, ) +from langchain_core.pydantic_v1 import BaseConfig, BaseModel +from langchain_core.pydantic_v1 import create_model as _create_model_base from langchain_core.runnables.schema import StreamEvent Input = TypeVar("Input", contravariant=True) @@ -489,3 +493,31 @@ class _RootEventFilter: ) return include + + +class _SchemaConfig(BaseConfig): + arbitrary_types_allowed = True + frozen = True + + +def create_model( + __model_name: str, + **field_definitions: Any, +) -> Type[BaseModel]: + try: + return _create_model_cached(__model_name, **field_definitions) + except TypeError: + # something in field definitions is not hashable + return _create_model_base( + __model_name, __config__=_SchemaConfig, **field_definitions + ) + + +@lru_cache(maxsize=256) +def _create_model_cached( + __model_name: str, + **field_definitions: Any, +) -> Type[BaseModel]: + return _create_model_base( + __model_name, __config__=_SchemaConfig, **field_definitions + ) diff --git a/libs/core/poetry.lock b/libs/core/poetry.lock index ed548c2f62..3078c2ae55 100644 --- a/libs/core/poetry.lock +++ b/libs/core/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -555,6 +555,17 @@ files = [ [package.dependencies] python-dateutil = ">=2.7" +[[package]] +name = "gprof2dot" +version = "2022.7.29" +description = "Generate a dot graph from the output of several profilers." +optional = false +python-versions = ">=2.7" +files = [ + {file = "gprof2dot-2022.7.29-py2.py3-none-any.whl", hash = "sha256:f165b3851d3c52ee4915eb1bd6cca571e5759823c2cd0f71a79bda93c2dc85d6"}, + {file = "gprof2dot-2022.7.29.tar.gz", hash = "sha256:45b4d298bd36608fccf9511c3fd88a773f7a1abc04d6cd39445b11ba43133ec5"}, +] + [[package]] name = "grandalf" version = "0.8" @@ -810,6 +821,7 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, ] [[package]] @@ -1163,6 +1175,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -1841,6 +1863,25 @@ pytest = ">=5.0" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] +[[package]] +name = "pytest-profiling" +version = "1.7.0" +description = "Profiling plugin for py.test" +optional = false +python-versions = "*" +files = [ + {file = "pytest-profiling-1.7.0.tar.gz", hash = "sha256:93938f147662225d2b8bd5af89587b979652426a8a6ffd7e73ec4a23e24b7f29"}, + {file = "pytest_profiling-1.7.0-py2.py3-none-any.whl", hash = "sha256:999cc9ac94f2e528e3f5d43465da277429984a1c237ae9818f8cfd0b06acb019"}, +] + +[package.dependencies] +gprof2dot = "*" +pytest = "*" +six = "*" + +[package.extras] +tests = ["pytest-virtualenv"] + [[package]] name = "pytest-watcher" version = "0.3.4" @@ -1942,6 +1983,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1949,8 +1991,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1967,6 +2016,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1974,6 +2024,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2744,4 +2795,4 @@ extended-testing = ["jinja2"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "8a8ec249b5b3843aaec58c5da0041f0c3846b2671ac64be80b981cef2840dc11" +content-hash = "8fe07123109b62d7210542d8aff20df6df00819e5b0f36bc12f02206c5161c43" diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index b87a95dd7d..fba2679af6 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -57,6 +57,7 @@ syrupy = "^4.0.2" pytest-watcher = "^0.3.4" pytest-asyncio = "^0.21.1" grandalf = "^0.8" +pytest-profiling = "^1.7.0" [tool.poetry.group.test_integration] diff --git a/libs/langchain/langchain/chains/base.py b/libs/langchain/langchain/chains/base.py index 5c5bd1aadf..2f15d1fcc8 100644 --- a/libs/langchain/langchain/chains/base.py +++ b/libs/langchain/langchain/chains/base.py @@ -20,19 +20,14 @@ from langchain_core.callbacks import ( from langchain_core.load.dump import dumpd from langchain_core.memory import BaseMemory from langchain_core.outputs import RunInfo -from langchain_core.pydantic_v1 import ( - BaseModel, - Field, - create_model, - root_validator, - validator, -) +from langchain_core.pydantic_v1 import BaseModel, Field, root_validator, validator from langchain_core.runnables import ( RunnableConfig, RunnableSerializable, ensure_config, run_in_executor, ) +from langchain_core.runnables.utils import create_model from langchain.schema import RUN_KEY diff --git a/libs/langchain/langchain/chains/combine_documents/base.py b/libs/langchain/langchain/chains/combine_documents/base.py index 6fbd22f3f1..89ad181dac 100644 --- a/libs/langchain/langchain/chains/combine_documents/base.py +++ b/libs/langchain/langchain/chains/combine_documents/base.py @@ -9,8 +9,9 @@ from langchain_core.callbacks import ( ) from langchain_core.documents import Document from langchain_core.prompts import BasePromptTemplate, PromptTemplate -from langchain_core.pydantic_v1 import BaseModel, Field, create_model +from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.runnables.config import RunnableConfig +from langchain_core.runnables.utils import create_model from langchain.chains.base import Chain from langchain.text_splitter import RecursiveCharacterTextSplitter, TextSplitter diff --git a/libs/langchain/langchain/chains/combine_documents/map_reduce.py b/libs/langchain/langchain/chains/combine_documents/map_reduce.py index 18be6d4cf2..cdeeda3302 100644 --- a/libs/langchain/langchain/chains/combine_documents/map_reduce.py +++ b/libs/langchain/langchain/chains/combine_documents/map_reduce.py @@ -6,8 +6,9 @@ from typing import Any, Dict, List, Optional, Tuple, Type from langchain_core.callbacks import Callbacks from langchain_core.documents import Document -from langchain_core.pydantic_v1 import BaseModel, Extra, create_model, root_validator +from langchain_core.pydantic_v1 import BaseModel, Extra, root_validator from langchain_core.runnables.config import RunnableConfig +from langchain_core.runnables.utils import create_model from langchain.chains.combine_documents.base import BaseCombineDocumentsChain from langchain.chains.combine_documents.reduce import ReduceDocumentsChain diff --git a/libs/langchain/langchain/chains/combine_documents/map_rerank.py b/libs/langchain/langchain/chains/combine_documents/map_rerank.py index 0466aac56b..8650828f9b 100644 --- a/libs/langchain/langchain/chains/combine_documents/map_rerank.py +++ b/libs/langchain/langchain/chains/combine_documents/map_rerank.py @@ -6,8 +6,9 @@ from typing import Any, Dict, List, Optional, Sequence, Tuple, Type, Union, cast from langchain_core.callbacks import Callbacks from langchain_core.documents import Document -from langchain_core.pydantic_v1 import BaseModel, Extra, create_model, root_validator +from langchain_core.pydantic_v1 import BaseModel, Extra, root_validator from langchain_core.runnables.config import RunnableConfig +from langchain_core.runnables.utils import create_model from langchain.chains.combine_documents.base import BaseCombineDocumentsChain from langchain.chains.llm import LLMChain