From e3132a7efc2aee6b3b5f83490ec5318e0bcec583 Mon Sep 17 00:00:00 2001 From: William FH <13333726+hinthornw@users.noreply.github.com> Date: Fri, 15 Dec 2023 00:05:34 -0800 Subject: [PATCH] [Evals] End project (#14324) Also does some cleanup. Now that we support updating/ending projects, do this automatically. Then you can edit the name of the project in the app. --- .../smith/evaluation/runner_utils.py | 305 ++++++++++-------- libs/langchain/poetry.lock | 40 +-- libs/langchain/pyproject.toml | 2 +- 3 files changed, 180 insertions(+), 167 deletions(-) diff --git a/libs/langchain/langchain/smith/evaluation/runner_utils.py b/libs/langchain/langchain/smith/evaluation/runner_utils.py index c2dcf8de85..a2cbd535c3 100644 --- a/libs/langchain/langchain/smith/evaluation/runner_utils.py +++ b/libs/langchain/langchain/smith/evaluation/runner_utils.py @@ -2,10 +2,12 @@ from __future__ import annotations +import dataclasses import functools import inspect import logging import uuid +from datetime import datetime from enum import Enum from typing import ( TYPE_CHECKING, @@ -32,11 +34,12 @@ from langchain_core.tracers.evaluation import ( ) from langchain_core.tracers.langchain import LangChainTracer from langsmith.client import Client -from langsmith.evaluation import RunEvaluator +from langsmith.evaluation import EvaluationResult, RunEvaluator from langsmith.run_helpers import as_runnable, is_traceable_function -from langsmith.schemas import Dataset, DataType, Example +from langsmith.schemas import Dataset, DataType, Example, TracerSession from langsmith.utils import LangSmithError from requests import HTTPError +from typing_extensions import TypedDict from langchain.callbacks.manager import Callbacks from langchain.chains.base import Chain @@ -919,9 +922,12 @@ def _prepare_eval_run( project_name: str, project_metadata: Optional[Dict[str, Any]] = None, tags: Optional[List[str]] = None, -) -> Tuple[MCF, str, Dataset, List[Example]]: +) -> Tuple[MCF, TracerSession, Dataset, List[Example]]: wrapped_model = _wrap_in_chain_factory(llm_or_chain_factory, dataset_name) dataset = client.read_dataset(dataset_name=dataset_name) + examples = list(client.list_examples(dataset_id=dataset.id)) + if not examples: + raise ValueError(f"Dataset {dataset_name} has no example rows.") try: project_extra: dict = {"metadata": project_metadata} if project_metadata else {} @@ -953,111 +959,159 @@ run_on_dataset( f"View all tests for Dataset {dataset_name} at:\n{dataset.url}", flush=True, ) - examples = list(client.list_examples(dataset_id=dataset.id)) - if not examples: - raise ValueError(f"Dataset {dataset_name} has no example rows.") - return wrapped_model, project_name, dataset, examples + return wrapped_model, project, dataset, examples -def _prepare_run_on_dataset( - client: Client, - dataset_name: str, - llm_or_chain_factory: MODEL_OR_CHAIN_FACTORY, - project_name: Optional[str], - evaluation: Optional[smith_eval.RunEvalConfig] = None, - tags: Optional[List[str]] = None, - input_mapper: Optional[Callable[[Dict], Any]] = None, - concurrency_level: int = 5, - project_metadata: Optional[Dict[str, Any]] = None, -) -> Tuple[MCF, str, List[Example], List[RunnableConfig]]: - project_name = project_name or name_generation.random_name() - wrapped_model, project_name, dataset, examples = _prepare_eval_run( - client, - dataset_name, - llm_or_chain_factory, - project_name, - project_metadata=project_metadata, - tags=tags, - ) - wrapped_model = _wrap_in_chain_factory(llm_or_chain_factory) - run_evaluators = _setup_evaluation( - wrapped_model, examples, evaluation, dataset.data_type or DataType.kv - ) - _validate_example_inputs(examples[0], wrapped_model, input_mapper) - progress_bar = progress.ProgressBarCallback(len(examples)) - configs = [ - RunnableConfig( - callbacks=[ - LangChainTracer( - project_name=project_name, - client=client, - use_threading=False, - example_id=example.id, - ), - EvaluatorCallbackHandler( - evaluators=run_evaluators or [], - client=client, - example_id=example.id, - max_concurrency=0, - ), - progress_bar, - ], - tags=tags or [], - max_concurrency=concurrency_level, - ) - for example in examples - ] - return wrapped_model, project_name, examples, configs +class _RowResult(TypedDict, total=False): + """A dictionary of the results for a single example row.""" + feedback: Optional[List[EvaluationResult]] + execution_time: Optional[float] + run_id: Optional[str] -def _collect_test_results( - examples: List[Example], - batch_results: List[Union[dict, str, LLMResult, ChatResult]], - configs: List[RunnableConfig], - project_name: str, -) -> TestResult: - wait_for_all_evaluators() - all_eval_results = {} - all_execution_time = {} - all_run_ids = {} - for c in configs: - for callback in cast(list, c["callbacks"]): - if isinstance(callback, EvaluatorCallbackHandler): - eval_results = callback.logged_eval_results - all_eval_results.update( - {example_id: v for (_, example_id), v in eval_results.items()} - ) - elif isinstance(callback, LangChainTracer): - run = callback.latest_run - example_id = callback.example_id - run_id = str(run.id) if run else None - execution_time = ( - (run.end_time - run.start_time).total_seconds() - if run and run.end_time - else None - ) - all_execution_time[str(example_id)] = execution_time - all_run_ids[str(example_id)] = run_id - - results: dict = {} - for example, output in zip(examples, batch_results): - feedback = all_eval_results.get(str(example.id), []) - results[str(example.id)] = { - "input": example.inputs, - "feedback": feedback, - "execution_time": all_execution_time.get(str(example.id)), - "run_id": all_run_ids.get(str(example.id)), - } - if isinstance(output, EvalError): - results[str(example.id)]["Error"] = output.Error - else: - results[str(example.id)]["output"] = output - if example.outputs: - results[str(example.id)]["reference"] = example.outputs - return TestResult( - project_name=project_name, - results=results, - ) + +@dataclasses.dataclass +class _DatasetRunContainer: + """A container to help manage the state of a eval run.""" + + client: Client + project: TracerSession + wrapped_model: MCF + examples: List[Example] + configs: List[RunnableConfig] + + def _merge_test_outputs( + self, + batch_results: list, + all_eval_results: Dict[str, _RowResult], + ) -> dict: + results: dict = {} + for example, output in zip(self.examples, batch_results): + row_result = cast(_RowResult, all_eval_results.get(str(example.id), {})) + results[str(example.id)] = { + "input": example.inputs, + "feedback": row_result.get("feedback", []), + "execution_time": row_result.get("execution_time"), + "run_id": row_result.get("run_id"), + } + if isinstance(output, EvalError): + results[str(example.id)]["Error"] = output.Error + else: + results[str(example.id)]["output"] = output + if example.outputs: + results[str(example.id)]["reference"] = example.outputs + return results + + def _collect_metrics(self) -> Dict[str, _RowResult]: + all_eval_results: dict = {} + for c in self.configs: + for callback in cast(list, c["callbacks"]): + if isinstance(callback, EvaluatorCallbackHandler): + eval_results = callback.logged_eval_results + for (_, example_id), v in eval_results.items(): + all_eval_results.setdefault(str(example_id), {}).update( + {"feedback": v} + ) + elif isinstance(callback, LangChainTracer): + run = callback.latest_run + execution_time = ( + (run.end_time - run.start_time).total_seconds() + if run and run.end_time + else None + ) + run_id = str(run.id) if run else None + all_eval_results.setdefault(str(callback.example_id), {}).update( + { + "execution_time": execution_time, + "run_id": run_id, + } + ) + return cast(Dict[str, _RowResult], all_eval_results) + + def _collect_test_results( + self, + batch_results: List[Union[dict, str, LLMResult, ChatResult]], + ) -> TestResult: + wait_for_all_evaluators() + all_eval_results = self._collect_metrics() + results = self._merge_test_outputs(batch_results, all_eval_results) + return TestResult( + project_name=self.project.name, + results=results, + ) + + def finish(self, batch_results: list, verbose: bool = False) -> TestResult: + results = self._collect_test_results(batch_results) + if verbose: + try: + agg_feedback = results.get_aggregate_feedback() + _display_aggregate_results(agg_feedback) + except Exception as e: + logger.debug(f"Failed to print aggregate feedback: {repr(e)}") + try: + # Closing the project permits name changing and metric optimizations + self.client.update_project(self.project.id, end_time=datetime.utcnow()) + except Exception as e: + logger.debug(f"Failed to close project: {repr(e)}") + return results + + @classmethod + def prepare( + cls, + client: Client, + dataset_name: str, + llm_or_chain_factory: MODEL_OR_CHAIN_FACTORY, + project_name: Optional[str], + evaluation: Optional[smith_eval.RunEvalConfig] = None, + tags: Optional[List[str]] = None, + input_mapper: Optional[Callable[[Dict], Any]] = None, + concurrency_level: int = 5, + project_metadata: Optional[Dict[str, Any]] = None, + ) -> _DatasetRunContainer: + project_name = project_name or name_generation.random_name() + wrapped_model, project, dataset, examples = _prepare_eval_run( + client, + dataset_name, + llm_or_chain_factory, + project_name, + project_metadata=project_metadata, + tags=tags, + ) + wrapped_model = _wrap_in_chain_factory(llm_or_chain_factory) + run_evaluators = _setup_evaluation( + wrapped_model, examples, evaluation, dataset.data_type or DataType.kv + ) + _validate_example_inputs(examples[0], wrapped_model, input_mapper) + progress_bar = progress.ProgressBarCallback(len(examples)) + configs = [ + RunnableConfig( + callbacks=[ + LangChainTracer( + project_name=project.name, + client=client, + use_threading=False, + example_id=example.id, + ), + EvaluatorCallbackHandler( + evaluators=run_evaluators or [], + client=client, + example_id=example.id, + max_concurrency=0, + ), + progress_bar, + ], + tags=tags or [], + max_concurrency=concurrency_level, + ) + for example in examples + ] + return cls( + client=client, + project=project, + wrapped_model=wrapped_model, + examples=examples, + configs=configs, + ) def _is_jupyter_environment() -> bool: @@ -1125,7 +1179,7 @@ async def arun_on_dataset( removal="0.0.305", ) client = client or Client() - wrapped_model, project_name, examples, configs = _prepare_run_on_dataset( + container = _DatasetRunContainer.prepare( client, dataset_name, llm_or_chain_factory, @@ -1137,26 +1191,18 @@ async def arun_on_dataset( project_metadata=project_metadata, ) batch_results = await runnable_utils.gather_with_concurrency( - configs[0].get("max_concurrency"), + container.configs[0].get("max_concurrency"), *map( functools.partial( _arun_llm_or_chain, - llm_or_chain_factory=wrapped_model, + llm_or_chain_factory=container.wrapped_model, input_mapper=input_mapper, ), - examples, - configs, + container.examples, + container.configs, ), ) - results = _collect_test_results(examples, batch_results, configs, project_name) - if verbose: - try: - agg_feedback = results.get_aggregate_feedback() - print("\n Eval quantiles:") - print(agg_feedback) - except Exception as e: - logger.debug(f"Failed to print aggregate feedback: {repr(e)}") - return results + return container.finish(batch_results, verbose=verbose) def run_on_dataset( @@ -1185,7 +1231,7 @@ def run_on_dataset( removal="0.0.305", ) client = client or Client() - wrapped_model, project_name, examples, configs = _prepare_run_on_dataset( + container = _DatasetRunContainer.prepare( client, dataset_name, llm_or_chain_factory, @@ -1201,33 +1247,26 @@ def run_on_dataset( _run_llm_or_chain( example, config, - llm_or_chain_factory=wrapped_model, + llm_or_chain_factory=container.wrapped_model, input_mapper=input_mapper, ) - for example, config in zip(examples, configs) + for example, config in zip(container.examples, container.configs) ] else: - with runnable_config.get_executor_for_config(configs[0]) as executor: + with runnable_config.get_executor_for_config(container.configs[0]) as executor: batch_results = list( executor.map( functools.partial( _run_llm_or_chain, - llm_or_chain_factory=wrapped_model, + llm_or_chain_factory=container.wrapped_model, input_mapper=input_mapper, ), - examples, - configs, + container.examples, + container.configs, ) ) - results = _collect_test_results(examples, batch_results, configs, project_name) - if verbose: - try: - agg_feedback = results.get_aggregate_feedback() - _display_aggregate_results(agg_feedback) - except Exception as e: - logger.debug(f"Failed to print aggregate feedback: {repr(e)}") - return results + return container.finish(batch_results, verbose=verbose) _RUN_ON_DATASET_DOCSTRING = """ diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index 0da142833d..2409e6a8d5 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -3133,7 +3133,6 @@ 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]] @@ -3447,7 +3446,7 @@ files = [ [[package]] name = "langchain-community" -version = "0.0.2" +version = "0.0.3" description = "Community contributed LangChain integrations." optional = false python-versions = ">=3.8.1,<4.0" @@ -3475,7 +3474,7 @@ url = "../community" [[package]] name = "langchain-core" -version = "0.1.0" +version = "0.1.1" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" @@ -3485,7 +3484,7 @@ develop = true [package.dependencies] anyio = ">=3,<5" jsonpatch = "^1.33" -langsmith = "~0.0.63" +langsmith = "~0.0.70" packaging = "^23.2" pydantic = ">=1,<3" PyYAML = ">=5.3" @@ -3501,13 +3500,13 @@ url = "../core" [[package]] name = "langsmith" -version = "0.0.63" +version = "0.0.70" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langsmith-0.0.63-py3-none-any.whl", hash = "sha256:43a521dd10d8405ac21a0b959e3de33e2270e4abe6c73cc4036232a6990a0793"}, - {file = "langsmith-0.0.63.tar.gz", hash = "sha256:ddb2dfadfad3e05151ed8ba1643d1c516024b80fbd0c6263024400ced06a3768"}, + {file = "langsmith-0.0.70-py3-none-any.whl", hash = "sha256:a0d4cac3af94fe44c2ef3814c32b6740f92aebe267e395d62e62040bc5bad343"}, + {file = "langsmith-0.0.70.tar.gz", hash = "sha256:3a546c45e67f6600d6669ef63f1f58b772e505703126338ad4f22fe0e2bbf677"}, ] [package.dependencies] @@ -3727,16 +3726,6 @@ 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"}, @@ -5262,8 +5251,6 @@ files = [ {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, - {file = "psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, - {file = "psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, @@ -5306,7 +5293,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -5315,8 +5301,6 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -6305,7 +6289,6 @@ 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"}, @@ -6313,15 +6296,8 @@ 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"}, @@ -6338,7 +6314,6 @@ 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"}, @@ -6346,7 +6321,6 @@ 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"}, @@ -9103,4 +9077,4 @@ text-helpers = ["chardet"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "0b232a037505cefcdf2203edc9d750e70e2e52a297475490022402994c3036a3" +content-hash = "e93141191088db7b4aec1a976ebd8cb20075e26d4a987bf97c0495ad865b7460" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index b49d8ef581..6dc4655314 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -80,7 +80,7 @@ cassio = {version = "^0.1.0", optional = true} sympy = {version = "^1.12", optional = true} rapidfuzz = {version = "^3.1.1", optional = true} jsonschema = {version = ">1", optional = true} -langsmith = "~0.0.63" +langsmith = "~0.0.70" rank-bm25 = {version = "^0.2.2", optional = true} geopandas = {version = "^0.13.1", optional = true} gitpython = {version = "^3.1.32", optional = true}