From 95a87291fd821bb02fe1bb0f3e9cb65f3e75e39b Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Tue, 1 Oct 2024 09:18:07 -0700 Subject: [PATCH 01/62] community: deprecate community ollama integrations (#26733) --- libs/community/langchain_community/chat_models/ollama.py | 5 +++++ libs/community/langchain_community/embeddings/ollama.py | 6 ++++++ libs/community/langchain_community/llms/ollama.py | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/libs/community/langchain_community/chat_models/ollama.py b/libs/community/langchain_community/chat_models/ollama.py index 298bfca97f6..0a3788b48d5 100644 --- a/libs/community/langchain_community/chat_models/ollama.py +++ b/libs/community/langchain_community/chat_models/ollama.py @@ -47,6 +47,11 @@ def _chat_stream_response_to_chat_generation_chunk( ) +@deprecated( + since="0.3.1", + removal="1.0.0", + alternative_import="langchain_ollama.ChatOllama", +) class ChatOllama(BaseChatModel, _OllamaCommon): """Ollama locally runs large language models. diff --git a/libs/community/langchain_community/embeddings/ollama.py b/libs/community/langchain_community/embeddings/ollama.py index b55cff9b6fa..ddec6fe39b8 100644 --- a/libs/community/langchain_community/embeddings/ollama.py +++ b/libs/community/langchain_community/embeddings/ollama.py @@ -2,12 +2,18 @@ import logging from typing import Any, Dict, List, Mapping, Optional import requests +from langchain_core._api.deprecation import deprecated from langchain_core.embeddings import Embeddings from pydantic import BaseModel, ConfigDict logger = logging.getLogger(__name__) +@deprecated( + since="0.3.1", + removal="1.0.0", + alternative_import="langchain_ollama.OllamaEmbeddings", +) class OllamaEmbeddings(BaseModel, Embeddings): """Ollama locally runs large language models. diff --git a/libs/community/langchain_community/llms/ollama.py b/libs/community/langchain_community/llms/ollama.py index 580ed68b330..72b6107967d 100644 --- a/libs/community/langchain_community/llms/ollama.py +++ b/libs/community/langchain_community/llms/ollama.py @@ -16,6 +16,7 @@ from typing import ( import aiohttp import requests +from langchain_core._api.deprecation import deprecated from langchain_core.callbacks import ( AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun, @@ -389,6 +390,11 @@ class _OllamaCommon(BaseLanguageModel): return final_chunk +@deprecated( + since="0.3.1", + removal="1.0.0", + alternative_import="langchain_ollama.OllamaLLM", +) class Ollama(BaseLLM, _OllamaCommon): """Ollama locally runs large language models. To use, follow the instructions at https://ollama.ai/. From f7583194de604a2ad78bd63bc000565f8d5332a8 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Tue, 1 Oct 2024 09:18:54 -0700 Subject: [PATCH 02/62] docs: build new api docs (#26951) --- docs/Makefile | 6 +++--- docs/package.json | 2 +- docs/vercel_build.sh | 17 ----------------- 3 files changed, 4 insertions(+), 21 deletions(-) delete mode 100755 docs/vercel_build.sh diff --git a/docs/Makefile b/docs/Makefile index 1c2811dae9d..532df0c4579 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -82,9 +82,9 @@ vercel-build: install-vercel-deps build generate-references mv $(OUTPUT_NEW_DOCS_DIR) docs rm -rf build mkdir static/api_reference - git clone --depth=1 https://github.com/baskaryan/langchain-api-docs-build.git - mv langchain-api-docs-build/api_reference_build/html/* static/api_reference/ - rm -rf langchain-api-docs-build + git clone --depth=1 https://github.com/langchain-ai/langchain-api-docs-html.git + mv langchain-api-docs-html/api_reference_build/html/* static/api_reference/ + rm -rf langchain-api-docs-html NODE_OPTIONS="--max-old-space-size=5000" yarn run docusaurus build start: diff --git a/docs/package.json b/docs/package.json index 9a15b0ad02a..ec1391dafcc 100644 --- a/docs/package.json +++ b/docs/package.json @@ -19,7 +19,7 @@ "format:check": "prettier --check \"**/*.{js,jsx,ts,tsx,md,mdx}\"", "gen": "yarn gen:supabase", "gen:supabase": "npx supabase gen types typescript --project-id 'xsqpnijvmbodcxyapnyq' --schema public > ./src/supabase.d.ts", - "check-broken-links": "bash vercel_build.sh && node ./scripts/check-broken-links.js" + "check-broken-links": "make vercel-build && node ./scripts/check-broken-links.js" }, "dependencies": { "@docusaurus/core": "3.5.2", diff --git a/docs/vercel_build.sh b/docs/vercel_build.sh deleted file mode 100755 index 80aaa5eaab9..00000000000 --- a/docs/vercel_build.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -e - -make install-vercel-deps - -make build - -rm -rf docs -mv build/output-new/docs ./ - -mkdir static/api_reference - -git clone --depth=1 https://github.com/baskaryan/langchain-api-docs-build.git - -mv -r langchain-api-docs-build/api_reference_build/html/* static/api_reference/ - From 9d101511233e7942794f8df8c742dfaa1ceed4c0 Mon Sep 17 00:00:00 2001 From: ccurme Date: Tue, 1 Oct 2024 14:21:54 -0400 Subject: [PATCH 03/62] core[patch]: fix init of RunnableAssign (#26903) Example in API ref currently raises ValidationError. Resolves https://github.com/langchain-ai/langchain/issues/26862 --- libs/core/langchain_core/runnables/passthrough.py | 2 +- .../core/tests/unit_tests/runnables/test_runnable.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libs/core/langchain_core/runnables/passthrough.py b/libs/core/langchain_core/runnables/passthrough.py index 3fc82ec9feb..7e7fa7b45bd 100644 --- a/libs/core/langchain_core/runnables/passthrough.py +++ b/libs/core/langchain_core/runnables/passthrough.py @@ -389,7 +389,7 @@ class RunnableAssign(RunnableSerializable[dict[str, Any], dict[str, Any]]): # returns {'input': 5, 'add_step': {'added': 15}} """ - mapper: RunnableParallel[dict[str, Any]] + mapper: RunnableParallel def __init__(self, mapper: RunnableParallel[dict[str, Any]], **kwargs: Any) -> None: super().__init__(mapper=mapper, **kwargs) # type: ignore[call-arg] diff --git a/libs/core/tests/unit_tests/runnables/test_runnable.py b/libs/core/tests/unit_tests/runnables/test_runnable.py index 211fab46833..f9dff49c0b9 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable.py @@ -63,6 +63,7 @@ from langchain_core.runnables import ( ConfigurableFieldSingleOption, RouterRunnable, Runnable, + RunnableAssign, RunnableBinding, RunnableBranch, RunnableConfig, @@ -5413,3 +5414,14 @@ def test_schema_for_prompt_and_chat_model() -> None: "title": "PromptInput", "type": "object", } + + +def test_runnable_assign() -> None: + def add_ten(x: dict[str, int]) -> dict[str, int]: + return {"added": x["input"] + 10} + + mapper = RunnableParallel({"add_step": RunnableLambda(add_ten)}) + runnable_assign = RunnableAssign(mapper) + + result = runnable_assign.invoke({"input": 5}) + assert result == {"input": 5, "add_step": {"added": 15}} From b5e28d3a6d207a0fd7198cb4ab31d75e7cb10325 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Tue, 1 Oct 2024 13:16:10 -0700 Subject: [PATCH 04/62] huggingface[patch]: make HuggingFaceEndpoint serializable (#27027) --- .../llms/huggingface_endpoint.py | 61 +- libs/partners/huggingface/poetry.lock | 1555 +++++++++-------- libs/partners/huggingface/pyproject.toml | 4 +- 3 files changed, 829 insertions(+), 791 deletions(-) diff --git a/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py b/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py index 076cafd4de6..f6a8e9ba611 100644 --- a/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py +++ b/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py @@ -4,14 +4,19 @@ import logging import os from typing import Any, AsyncIterator, Dict, Iterator, List, Mapping, Optional +from huggingface_hub import ( # type: ignore[import-untyped] + AsyncInferenceClient, + InferenceClient, + login, +) from langchain_core.callbacks import ( AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun, ) from langchain_core.language_models.llms import LLM from langchain_core.outputs import GenerationChunk -from langchain_core.utils import from_env, get_pydantic_field_names -from pydantic import ConfigDict, Field, model_validator +from langchain_core.utils import get_pydantic_field_names, secret_from_env +from pydantic import ConfigDict, Field, SecretStr, model_validator from typing_extensions import Self logger = logging.getLogger(__name__) @@ -73,10 +78,12 @@ class HuggingFaceEndpoint(LLM): should be pass as env variable in `HF_INFERENCE_ENDPOINT`""" repo_id: Optional[str] = None """Repo to use. If endpoint_url is not specified then this needs to given""" - huggingfacehub_api_token: Optional[str] = Field( - default_factory=from_env("HUGGINGFACEHUB_API_TOKEN", default=None) + huggingfacehub_api_token: Optional[SecretStr] = Field( + default_factory=secret_from_env( + ["HUGGINGFACEHUB_API_TOKEN", "HF_TOKEN"], default=None + ) ) - max_new_tokens: int = 512 + max_new_tokens: int = Field(default=512, alias="max_tokens") """Maximum number of generated tokens""" top_k: Optional[int] = None """The number of highest probability vocabulary tokens to keep for @@ -116,14 +123,15 @@ class HuggingFaceEndpoint(LLM): model_kwargs: Dict[str, Any] = Field(default_factory=dict) """Holds any model parameters valid for `call` not explicitly specified""" model: str - client: Any = None #: :meta private: - async_client: Any = None #: :meta private: + client: Any = Field(default=None, exclude=True) #: :meta private: + async_client: Any = Field(default=None, exclude=True) #: :meta private: task: Optional[str] = None """Task to call the model with. Should be a task that returns `generated_text` or `summary_text`.""" model_config = ConfigDict( extra="forbid", + populate_by_name=True, ) @model_validator(mode="before") @@ -189,36 +197,23 @@ class HuggingFaceEndpoint(LLM): @model_validator(mode="after") def validate_environment(self) -> Self: """Validate that package is installed and that the API token is valid.""" - try: - from huggingface_hub import login # type: ignore[import] - - except ImportError: - raise ImportError( - "Could not import huggingface_hub python package. " - "Please install it with `pip install huggingface_hub`." - ) - - huggingfacehub_api_token = self.huggingfacehub_api_token or os.getenv( - "HF_TOKEN" - ) - - if huggingfacehub_api_token is not None: + if self.huggingfacehub_api_token is not None: try: - login(token=huggingfacehub_api_token) + login(token=self.huggingfacehub_api_token.get_secret_value()) except Exception as e: raise ValueError( "Could not authenticate with huggingface_hub. " "Please check your API token." ) from e - from huggingface_hub import AsyncInferenceClient, InferenceClient - # Instantiate clients with supported kwargs sync_supported_kwargs = set(inspect.signature(InferenceClient).parameters) self.client = InferenceClient( model=self.model, timeout=self.timeout, - token=huggingfacehub_api_token, + token=self.huggingfacehub_api_token.get_secret_value() + if self.huggingfacehub_api_token + else None, **{ key: value for key, value in self.server_kwargs.items() @@ -230,7 +225,9 @@ class HuggingFaceEndpoint(LLM): self.async_client = AsyncInferenceClient( model=self.model, timeout=self.timeout, - token=huggingfacehub_api_token, + token=self.huggingfacehub_api_token.get_secret_value() + if self.huggingfacehub_api_token + else None, **{ key: value for key, value in self.server_kwargs.items() @@ -426,3 +423,15 @@ class HuggingFaceEndpoint(LLM): # break if stop sequence found if stop_seq_found: break + + @classmethod + def is_lc_serializable(cls) -> bool: + return True + + @classmethod + def get_lc_namespace(cls) -> list[str]: + return ["langchain_huggingface", "llms"] + + @property + def lc_secrets(self) -> dict[str, str]: + return {"huggingfacehub_api_token": "HUGGINGFACEHUB_API_TOKEN"} diff --git a/libs/partners/huggingface/poetry.lock b/libs/partners/huggingface/poetry.lock index 6c8e24fce14..c7ee6ddc923 100644 --- a/libs/partners/huggingface/poetry.lock +++ b/libs/partners/huggingface/poetry.lock @@ -1,114 +1,114 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.8" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, + {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, + {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, + {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, + {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, + {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, + {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, + {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, + {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, + {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, + {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, + {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, + {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, ] [package.dependencies] @@ -118,7 +118,7 @@ async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -150,13 +150,13 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" +version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [package.dependencies] @@ -166,9 +166,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "appnope" @@ -480,33 +480,33 @@ typing-inspect = ">=0.4.0,<1" [[package]] name = "debugpy" -version = "1.8.5" +version = "1.8.6" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, - {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, - {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, - {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, - {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, - {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, - {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, - {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, - {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, - {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, - {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, - {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, - {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, - {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, - {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, - {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, - {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, - {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, - {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, - {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, - {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, - {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, + {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, + {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, + {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, + {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, + {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, + {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, + {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, + {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, + {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, + {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, + {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, + {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, + {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, + {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, + {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, + {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, + {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, + {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, + {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, + {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, + {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, + {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, ] [[package]] @@ -550,18 +550,18 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "filelock" -version = "3.16.0" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"}, - {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] @@ -691,77 +691,84 @@ tqdm = ["tqdm"] [[package]] name = "greenlet" -version = "3.1.0" +version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682"}, - {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1"}, - {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99"}, - {file = "greenlet-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54"}, - {file = "greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"}, - {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"}, - {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"}, - {file = "greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"}, - {file = "greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"}, - {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"}, - {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"}, - {file = "greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"}, - {file = "greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"}, - {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"}, - {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"}, - {file = "greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637"}, - {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954"}, - {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3"}, - {file = "greenlet-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00"}, - {file = "greenlet-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6"}, - {file = "greenlet-3.1.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b"}, - {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d"}, - {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0"}, - {file = "greenlet-3.1.0-cp38-cp38-win32.whl", hash = "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2"}, - {file = "greenlet-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910"}, - {file = "greenlet-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28"}, - {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b"}, - {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8"}, - {file = "greenlet-3.1.0-cp39-cp39-win32.whl", hash = "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc"}, - {file = "greenlet-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97"}, - {file = "greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"}, + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] @@ -781,13 +788,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -798,7 +805,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -827,13 +834,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.24.6" +version = "0.25.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970"}, - {file = "huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"}, + {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"}, + {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"}, ] [package.dependencies] @@ -861,33 +868,40 @@ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "t [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" -version = "8.4.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, - {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -1044,13 +1058,13 @@ files = [ [[package]] name = "jupyter-client" -version = "8.6.2" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, - {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -1087,20 +1101,20 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" [[package]] name = "langchain" -version = "0.3.0.dev2" +version = "0.3.1" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.0.dev2-py3-none-any.whl", hash = "sha256:f84d318aed04a01a700659c90063a8f3cb0cf2c055d312ad6aaae177ab709963"}, - {file = "langchain-0.3.0.dev2.tar.gz", hash = "sha256:08d6617518fee66163ae21f7dfb535bf336cfcfa9f3d91c25f0eace76355d50b"}, + {file = "langchain-0.3.1-py3-none-any.whl", hash = "sha256:94e5ee7464d4366e4b158aa5704953c39701ea237b9ed4b200096d49e83bb3ae"}, + {file = "langchain-0.3.1.tar.gz", hash = "sha256:54d6e3abda2ec056875a231a418a4130ba7576e629e899067e499bfc847b7586"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.0.dev5,<0.4.0" -langchain-text-splitters = ">=0.3.0.dev1,<0.4.0" +langchain-core = ">=0.3.6,<0.4.0" +langchain-text-splitters = ">=0.3.0,<0.4.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, @@ -1114,7 +1128,7 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-community" -version = "0.3.0.dev2" +version = "0.3.1" description = "Community contributed LangChain integrations." optional = false python-versions = ">=3.9,<4.0" @@ -1124,9 +1138,9 @@ develop = true [package.dependencies] aiohttp = "^3.8.3" dataclasses-json = ">= 0.5.7, < 0.7" -langchain = "^0.3.0.dev2" -langchain-core = "^0.3.0.dev5" -langsmith = "^0.1.112" +langchain = "^0.3.1" +langchain-core = "^0.3.6" +langsmith = "^0.1.125" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, @@ -1143,7 +1157,7 @@ url = "../../community" [[package]] name = "langchain-core" -version = "0.3.0" +version = "0.3.7" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -1152,7 +1166,7 @@ develop = true [package.dependencies] jsonpatch = "^1.33" -langsmith = "^0.1.117" +langsmith = "^0.1.125" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -1177,7 +1191,7 @@ develop = true [package.dependencies] httpx = "^0.27.0" -langchain-core = ">=0.3.0.dev1" +langchain-core = "^0.3.0" pytest = ">=7,<9" syrupy = "^4" @@ -1187,27 +1201,27 @@ url = "../../standard-tests" [[package]] name = "langchain-text-splitters" -version = "0.3.0.dev1" +version = "0.3.0" description = "LangChain text splitting utilities" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_text_splitters-0.3.0.dev1-py3-none-any.whl", hash = "sha256:85abe6ab1aa95e8cc3bf985cd9e53848de616c21d3590a25ac13a694d409f133"}, - {file = "langchain_text_splitters-0.3.0.dev1.tar.gz", hash = "sha256:5e13ca0f27719406c6c5575f48cdfb89755f02dd0f1c8af5d1f8a1a9f391f3a2"}, + {file = "langchain_text_splitters-0.3.0-py3-none-any.whl", hash = "sha256:e84243e45eaff16e5b776cd9c81b6d07c55c010ebcb1965deb3d1792b7358e83"}, + {file = "langchain_text_splitters-0.3.0.tar.gz", hash = "sha256:f9fe0b4d244db1d6de211e7343d4abc4aa90295aa22e1f0c89e51f33c55cd7ce"}, ] [package.dependencies] -langchain-core = ">=0.3.0.dev1,<0.4.0" +langchain-core = ">=0.3.0,<0.4.0" [[package]] name = "langsmith" -version = "0.1.117" +version = "0.1.129" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.117-py3-none-any.whl", hash = "sha256:e936ee9bcf8293b0496df7ba462a3702179fbe51f9dc28744b0fbec0dbf206ae"}, - {file = "langsmith-0.1.117.tar.gz", hash = "sha256:a1b532f49968b9339bcaff9118d141846d52ed3d803f342902e7448edf1d662b"}, + {file = "langsmith-0.1.129-py3-none-any.whl", hash = "sha256:31393fbbb17d6be5b99b9b22d530450094fab23c6c37281a6a6efb2143d05347"}, + {file = "langsmith-0.1.129.tar.gz", hash = "sha256:6c3ba66471bef41b9f87da247cc0b493268b3f54656f73648a256a205261b6a0"}, ] [package.dependencies] @@ -1697,14 +1711,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.6.68" +version = "12.6.77" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b3fd0779845f68b92063ab1393abab1ed0a23412fc520df79a8190d098b5cd6b"}, - {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_x86_64.whl", hash = "sha256:125a6c2a44e96386dda634e13d944e60b07a0402d391a070e8fb4104b34ea1ab"}, - {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-win_amd64.whl", hash = "sha256:a55744c98d70317c5e23db14866a8cc2b733f7324509e941fc96276f9f37801d"}, + {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3bf10d85bb1801e9c894c6e197e44dd137d2a0a9e43f8450e9ad13f2df0dd52d"}, + {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9ae346d16203ae4ea513be416495167a0101d33d2d14935aa9c1829a3fb45142"}, + {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:410718cd44962bed862a31dd0318620f6f9a8b28a6291967bcfcb446a6516771"}, ] [[package]] @@ -1923,13 +1937,13 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.3.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617"}, - {file = "platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] @@ -1954,13 +1968,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -2033,18 +2047,18 @@ files = [ [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, @@ -2056,100 +2070,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -2157,13 +2171,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.5.0" +version = "2.5.2" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.5.0-py3-none-any.whl", hash = "sha256:eae04a3dd9adf521a4c959dcefb984e0f3b1d841999daf02f961dcc4d31d2f7f"}, - {file = "pydantic_settings-2.5.0.tar.gz", hash = "sha256:204828c02481a2e7135466b26a7d65d9e15a17d52d1d8f59cacdf9ad625e1140"}, + {file = "pydantic_settings-2.5.2-py3-none-any.whl", hash = "sha256:2c912e55fd5794a59bf8c832b9de832dcfdf4778d79ff79b708744eed499a907"}, + {file = "pydantic_settings-2.5.2.tar.gz", hash = "sha256:f90b139682bee4d2065273d5185d71d37ea46cfe57e1b5ae184fc6a0b2484ca0"}, ] [package.dependencies] @@ -2480,90 +2494,105 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "regex" -version = "2024.7.24" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, - {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, - {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, - {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, - {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, - {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, - {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, - {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, - {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, - {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, - {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] @@ -2748,32 +2777,32 @@ torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "scikit-learn" -version = "1.5.1" +version = "1.5.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, - {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, - {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, - {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, - {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, + {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, + {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, ] [package.dependencies] @@ -2785,11 +2814,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -2885,43 +2914,42 @@ test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.3 [[package]] name = "sentence-transformers" -version = "3.0.1" -description = "Multilingual text embeddings" +version = "3.1.1" +description = "State-of-the-Art Text Embeddings" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.8" files = [ - {file = "sentence_transformers-3.0.1-py3-none-any.whl", hash = "sha256:01050cc4053c49b9f5b78f6980b5a72db3fd3a0abb9169b1792ac83875505ee6"}, - {file = "sentence_transformers-3.0.1.tar.gz", hash = "sha256:8a3d2c537cc4d1014ccc20ac92be3d6135420a3bc60ae29a3a8a9b4bb35fbff6"}, + {file = "sentence_transformers-3.1.1-py3-none-any.whl", hash = "sha256:c73bf6f17e3676bb9372a6133a254ebfb5907586b470f2bac5a840c64c3cf97e"}, + {file = "sentence_transformers-3.1.1.tar.gz", hash = "sha256:8f00020ef4ad6b918475c38af545c22f61403b67eb22d994860bab06902db160"}, ] [package.dependencies] -huggingface-hub = ">=0.15.1" -numpy = "*" +huggingface-hub = ">=0.19.3" Pillow = "*" scikit-learn = "*" scipy = "*" torch = ">=1.11.0" tqdm = "*" -transformers = ">=4.34.0,<5.0.0" +transformers = ">=4.38.0,<5.0.0" [package.extras] -dev = ["accelerate (>=0.20.3)", "datasets", "pre-commit", "pytest", "ruff (>=0.3.0)"] +dev = ["accelerate (>=0.20.3)", "datasets", "pre-commit", "pytest", "pytest-cov"] train = ["accelerate (>=0.20.3)", "datasets"] [[package]] name = "setuptools" -version = "74.1.2" +version = "75.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, - {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] @@ -2952,60 +2980,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.34" +version = "2.0.35" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea54f7300553af0a2a7235e9b85f4204e1fc21848f917a3213b0e0818de9a24"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:196958cde924a00488e3e83ff917be3b73cd4ed8352bbc0f2989333176d1c54d"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win32.whl", hash = "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win_amd64.whl", hash = "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win32.whl", hash = "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win_amd64.whl", hash = "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win32.whl", hash = "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win_amd64.whl", hash = "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60ed6ef0a35c6b76b7640fe452d0e47acc832ccbb8475de549a5cc5f90c2c06"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:25691f4adfb9d5e796fd48bf1432272f95f4bbe5f89c475a788f31232ea6afba"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win32.whl", hash = "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win_amd64.whl", hash = "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1e03db964e9d32f112bae36f0cc1dcd1988d096cfd75d6a588a3c3def9ab2b"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ae92bebca3b1e6bd203494e5ef919a60fb6dfe4d9a47ed2453211d3bd451b9f5"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win32.whl", hash = "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win_amd64.whl", hash = "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a17d8fac6df9835d8e2b4c5523666e7051d0897a93756518a1fe101c7f47f2f0"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e6965346fc1491a566e019a4a1d3dfc081ce7ac1a736536367ca305da6472a8"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win32.whl", hash = "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win_amd64.whl", hash = "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8"}, - {file = "SQLAlchemy-2.0.34-py3-none-any.whl", hash = "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f"}, - {file = "sqlalchemy-2.0.34.tar.gz", hash = "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, ] [package.dependencies] @@ -3058,13 +3086,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.13.2" +version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, - {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, + {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, + {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, ] [package.dependencies] @@ -3115,111 +3143,111 @@ files = [ [[package]] name = "tokenizers" -version = "0.19.1" +version = "0.20.0" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, - {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, - {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, - {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, - {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, - {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, - {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, - {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, - {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, - {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, - {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, - {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, - {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, - {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, - {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, - {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, - {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, - {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, - {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, - {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, - {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, - {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, - {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, - {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, - {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, - {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, - {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, - {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, - {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, - {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, - {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, - {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, - {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, + {file = "tokenizers-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6cff5c5e37c41bc5faa519d6f3df0679e4b37da54ea1f42121719c5e2b4905c0"}, + {file = "tokenizers-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:62a56bf75c27443432456f4ca5ca055befa95e25be8a28141cc495cac8ae4d6d"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68cc7de6a63f09c4a86909c2597b995aa66e19df852a23aea894929c74369929"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:053c37ecee482cc958fdee53af3c6534286a86f5d35aac476f7c246830e53ae5"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d7074aaabc151a6363fa03db5493fc95b423b2a1874456783989e96d541c7b6"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a11435780f2acd89e8fefe5e81cecf01776f6edb9b3ac95bcb76baee76b30b90"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a81cd2712973b007d84268d45fc3f6f90a79c31dfe7f1925e6732f8d2959987"}, + {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7dfd796ab9d909f76fb93080e1c7c8309f196ecb316eb130718cd5e34231c69"}, + {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8029ad2aa8cb00605c9374566034c1cc1b15130713e0eb5afcef6cface8255c9"}, + {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca4d54260ebe97d59dfa9a30baa20d0c4dd9137d99a8801700055c561145c24e"}, + {file = "tokenizers-0.20.0-cp310-none-win32.whl", hash = "sha256:95ee16b57cec11b86a7940174ec5197d506439b0f415ab3859f254b1dffe9df0"}, + {file = "tokenizers-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:0a61a11e93eeadbf02aea082ffc75241c4198e0608bbbac4f65a9026851dcf37"}, + {file = "tokenizers-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6636b798b3c4d6c9b1af1a918bd07c867808e5a21c64324e95318a237e6366c3"}, + {file = "tokenizers-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ec603e42eaf499ffd58b9258162add948717cf21372458132f14e13a6bc7172"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce124264903a8ea6f8f48e1cc7669e5ef638c18bd4ab0a88769d5f92debdf7f"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07bbeba0231cf8de07aa6b9e33e9779ff103d47042eeeb859a8c432e3292fb98"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:06c0ca8397b35d38b83a44a9c6929790c1692957d88541df061cb34d82ebbf08"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca6557ac3b83d912dfbb1f70ab56bd4b0594043916688e906ede09f42e192401"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a5ad94c9e80ac6098328bee2e3264dbced4c6faa34429994d473f795ec58ef4"}, + {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b5c7f906ee6bec30a9dc20268a8b80f3b9584de1c9f051671cb057dc6ce28f6"}, + {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:31e087e9ee1b8f075b002bfee257e858dc695f955b43903e1bb4aa9f170e37fe"}, + {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3124fb6f3346cb3d8d775375d3b429bf4dcfc24f739822702009d20a4297990"}, + {file = "tokenizers-0.20.0-cp311-none-win32.whl", hash = "sha256:a4bb8b40ba9eefa621fdcabf04a74aa6038ae3be0c614c6458bd91a4697a452f"}, + {file = "tokenizers-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:2b709d371f1fe60a28ef0c5c67815952d455ca7f34dbe7197eaaed3cc54b658e"}, + {file = "tokenizers-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:15c81a17d0d66f4987c6ca16f4bea7ec253b8c7ed1bb00fdc5d038b1bb56e714"}, + {file = "tokenizers-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a531cdf1fb6dc41c984c785a3b299cb0586de0b35683842a3afbb1e5207f910"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06caabeb4587f8404e0cd9d40f458e9cba3e815c8155a38e579a74ff3e2a4301"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8768f964f23f5b9f50546c0369c75ab3262de926983888bbe8b98be05392a79c"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:626403860152c816f97b649fd279bd622c3d417678c93b4b1a8909b6380b69a8"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c1b88fa9e5ff062326f4bf82681da5a96fca7104d921a6bd7b1e6fcf224af26"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7e559436a07dc547f22ce1101f26d8b2fad387e28ec8e7e1e3b11695d681d8"}, + {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48afb75e50449848964e4a67b0da01261dd3aa8df8daecf10db8fd7f5b076eb"}, + {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf5d0e1ff44710a95eefc196dd87666ffc609fd447c5e5b68272a7c3d342a1d"}, + {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e5e56df0e8ed23ba60ae3848c3f069a0710c4b197218fe4f89e27eba38510768"}, + {file = "tokenizers-0.20.0-cp312-none-win32.whl", hash = "sha256:ec53e5ecc142a82432f9c6c677dbbe5a2bfee92b8abf409a9ecb0d425ee0ce75"}, + {file = "tokenizers-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:f18661ece72e39c0dfaa174d6223248a15b457dbd4b0fc07809b8e6d3ca1a234"}, + {file = "tokenizers-0.20.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:f7065b1084d8d1a03dc89d9aad69bcbc8415d4bc123c367063eb32958cd85054"}, + {file = "tokenizers-0.20.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e5d4069e4714e3f7ba0a4d3d44f9d84a432cd4e4aa85c3d7dd1f51440f12e4a1"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:799b808529e54b7e1a36350bda2aeb470e8390e484d3e98c10395cee61d4e3c6"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f9baa027cc8a281ad5f7725a93c204d7a46986f88edbe8ef7357f40a23fb9c7"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:010ec7f3f7a96adc4c2a34a3ada41fa14b4b936b5628b4ff7b33791258646c6b"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98d88f06155335b14fd78e32ee28ca5b2eb30fced4614e06eb14ae5f7fba24ed"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e13eb000ef540c2280758d1b9cfa5fe424b0424ae4458f440e6340a4f18b2638"}, + {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fab3cf066ff426f7e6d70435dc28a9ff01b2747be83810e397cba106f39430b0"}, + {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:39fa3761b30a89368f322e5daf4130dce8495b79ad831f370449cdacfb0c0d37"}, + {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c8da0fba4d179ddf2607821575998df3c294aa59aa8df5a6646dc64bc7352bce"}, + {file = "tokenizers-0.20.0-cp37-none-win32.whl", hash = "sha256:fada996d6da8cf213f6e3c91c12297ad4f6cdf7a85c2fadcd05ec32fa6846fcd"}, + {file = "tokenizers-0.20.0-cp37-none-win_amd64.whl", hash = "sha256:7d29aad702279e0760c265fcae832e89349078e3418dd329732d4503259fd6bd"}, + {file = "tokenizers-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:099c68207f3ef0227ecb6f80ab98ea74de559f7b124adc7b17778af0250ee90a"}, + {file = "tokenizers-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:68012d8a8cddb2eab3880870d7e2086cb359c7f7a2b03f5795044f5abff4e850"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9253bdd209c6aee168deca7d0e780581bf303e0058f268f9bb06859379de19b6"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f868600ddbcb0545905ed075eb7218a0756bf6c09dae7528ea2f8436ebd2c93"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9643d9c8c5f99b6aba43fd10034f77cc6c22c31f496d2f0ee183047d948fa0"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c375c6a889aeab44734028bc65cc070acf93ccb0f9368be42b67a98e1063d3f6"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e359f852328e254f070bbd09a19a568421d23388f04aad9f2fb7da7704c7228d"}, + {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d98b01a309d4387f3b1c1dd68a8b8136af50376cf146c1b7e8d8ead217a5be4b"}, + {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:459f7537119554c2899067dec1ac74a00d02beef6558f4ee2e99513bf6d568af"}, + {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:392b87ec89452628c045c9f2a88bc2a827f4c79e7d84bc3b72752b74c2581f70"}, + {file = "tokenizers-0.20.0-cp38-none-win32.whl", hash = "sha256:55a393f893d2ed4dd95a1553c2e42d4d4086878266f437b03590d3f81984c4fe"}, + {file = "tokenizers-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:30ffe33c5c2f2aab8e9a3340d0110dd9f7ace7eec7362e20a697802306bd8068"}, + {file = "tokenizers-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aa2d4a6fed2a7e3f860c7fc9d48764bb30f2649d83915d66150d6340e06742b8"}, + {file = "tokenizers-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5ef0f814084a897e9071fc4a868595f018c5c92889197bdc4bf19018769b148"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1e1b791e8c3bf4c4f265f180dadaff1c957bf27129e16fdd5e5d43c2d3762c"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b69e55e481459c07885263743a0d3c18d52db19bae8226a19bcca4aaa213fff"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806b4d82e27a2512bc23057b2986bc8b85824914286975b84d8105ff40d03d9"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9859e9ef13adf5a473ccab39d31bff9c550606ae3c784bf772b40f615742a24f"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef703efedf4c20488a8eb17637b55973745b27997ff87bad88ed499b397d1144"}, + {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eec0061bab94b1841ab87d10831fdf1b48ebaed60e6d66d66dbe1d873f92bf5"}, + {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:980f3d0d7e73f845b69087f29a63c11c7eb924c4ad6b358da60f3db4cf24bdb4"}, + {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c157550a2f3851b29d7fdc9dc059fcf81ff0c0fc49a1e5173a89d533ed043fa"}, + {file = "tokenizers-0.20.0-cp39-none-win32.whl", hash = "sha256:8a3d2f4d08608ec4f9895ec25b4b36a97f05812543190a5f2c3cd19e8f041e5a"}, + {file = "tokenizers-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:d90188d12afd0c75e537f9a1d92f9c7375650188ee4f48fdc76f9e38afbd2251"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d68e15f1815357b059ec266062340c343ea7f98f7f330602df81ffa3474b6122"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:23f9ecec637b9bc80da5f703808d29ed5329e56b5aa8d791d1088014f48afadc"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f830b318ee599e3d0665b3e325f85bc75ee2d2ca6285f52e439dc22b64691580"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3dc750def789cb1de1b5a37657919545e1d9ffa667658b3fa9cb7862407a1b8"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e26e6c755ae884c2ea6135cd215bdd0fccafe4ee62405014b8c3cd19954e3ab9"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a1158c7174f427182e08baa2a8ded2940f2b4a3e94969a85cc9cfd16004cbcea"}, + {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:6324826287a3fc198898d3dcf758fe4a8479e42d6039f4c59e2cedd3cf92f64e"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d8653149405bb0c16feaf9cfee327fdb6aaef9dc2998349fec686f35e81c4e2"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a2dc1e402a155e97309287ca085c80eb1b7fab8ae91527d3b729181639fa51"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bef67b20aa6e5f7868c42c7c5eae4d24f856274a464ae62e47a0f2cccec3da"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da06e397182ff53789c506c7833220c192952c57e1581a53f503d8d953e2d67e"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:302f7e11a14814028b7fc88c45a41f1bbe9b5b35fd76d6869558d1d1809baa43"}, + {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:055ec46e807b875589dfbe3d9259f9a6ee43394fb553b03b3d1e9541662dbf25"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e3144b8acebfa6ae062e8f45f7ed52e4b50fb6c62f93afc8871b525ab9fdcab3"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b52aa3fd14b2a07588c00a19f66511cff5cca8f7266ca3edcdd17f3512ad159f"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b8cf52779ffc5d4d63a0170fbeb512372bad0dd014ce92bbb9149756c831124"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:983a45dd11a876124378dae71d6d9761822199b68a4c73f32873d8cdaf326a5b"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6b819c9a19831ebec581e71a7686a54ab45d90faf3842269a10c11d746de0c"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e738cfd80795fcafcef89c5731c84b05638a4ab3f412f97d5ed7765466576eb1"}, + {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c8842c7be2fadb9c9edcee233b1b7fe7ade406c99b0973f07439985c1c1d0683"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e47a82355511c373a4a430c4909dc1e518e00031207b1fec536c49127388886b"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9afbf359004551179a5db19424180c81276682773cff2c5d002f6eaaffe17230"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07eaa8799a92e6af6f472c21a75bf71575de2af3c0284120b7a09297c0de2f3"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0994b2e5fc53a301071806bc4303e4bc3bdc3f490e92a21338146a36746b0872"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6466e0355b603d10e3cc3d282d350b646341b601e50969464a54939f9848d0"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1e86594c2a433cb1ea09cfbe596454448c566e57ee8905bd557e489d93e89986"}, + {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3e14cdef1efa96ecead6ea64a891828432c3ebba128bdc0596e3059fea104ef3"}, + {file = "tokenizers-0.20.0.tar.gz", hash = "sha256:39d7acc43f564c274085cafcd1dae9d36f332456de1a31970296a6b8da4eac8d"}, ] [package.dependencies] @@ -3352,13 +3380,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.44.2" +version = "4.45.1" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" files = [ - {file = "transformers-4.44.2-py3-none-any.whl", hash = "sha256:1c02c65e7bfa5e52a634aff3da52138b583fc6f263c1f28d547dc144ba3d412d"}, - {file = "transformers-4.44.2.tar.gz", hash = "sha256:36aa17cc92ee154058e426d951684a2dab48751b35b49437896f898931270826"}, + {file = "transformers-4.45.1-py3-none-any.whl", hash = "sha256:21e3f47aa7256dbbfb5215937a3168a984c94432ce3a16b7908265807d62aee8"}, + {file = "transformers-4.45.1.tar.gz", hash = "sha256:9cace11072172df05ca6a694fcd1f5064a55b63285e492bd88f0ad1cec270f02"}, ] [package.dependencies] @@ -3370,21 +3398,21 @@ pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" safetensors = ">=0.4.1" -tokenizers = ">=0.19,<0.20" +tokenizers = ">=0.20,<0.21" tqdm = ">=4.27" [package.extras] -accelerate = ["accelerate (>=0.21.0)"] -agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +accelerate = ["accelerate (>=0.26.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -benchmark = ["optimum-benchmark (>=0.2.0)"] +benchmark = ["optimum-benchmark (>=0.3.0)"] codecarbon = ["codecarbon (==1.2.0)"] -deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.20,<0.21)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "libcst", "librosa", "nltk (<=3.8.1)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] @@ -3395,7 +3423,7 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "libcst", "rich", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] ruff = ["ruff (==0.5.1)"] @@ -3405,16 +3433,17 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +tiktoken = ["blobfile", "tiktoken"] timm = ["timm (<=0.9.16)"] -tokenizers = ["tokenizers (>=0.19,<0.20)"] -torch = ["accelerate (>=0.21.0)", "torch"] +tokenizers = ["tokenizers (>=0.20,<0.21)"] +torch = ["accelerate (>=0.26.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.20,<0.21)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] @@ -3468,13 +3497,13 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -3485,41 +3514,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "5.0.2" +version = "5.0.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -3538,103 +3567,103 @@ files = [ [[package]] name = "yarl" -version = "1.11.1" +version = "1.13.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, - {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, - {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, - {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, - {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, - {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, - {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, - {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, - {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, - {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, - {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, - {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, - {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, - {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, - {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -3643,13 +3672,13 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.20.1" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, - {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] @@ -3663,4 +3692,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "935cfcef42083ca2d00fab8dc58837c2911041ea1526c684a54c4a1404648d39" +content-hash = "3ff0e421de2a24d3c47165a540f21e8ca827740d4245da8260c2e64d82d8c72e" diff --git a/libs/partners/huggingface/pyproject.toml b/libs/partners/huggingface/pyproject.toml index 53c0dc204f4..3c203148c50 100644 --- a/libs/partners/huggingface/pyproject.toml +++ b/libs/partners/huggingface/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-huggingface" -version = "0.1.0" +version = "0.1.1" description = "An integration package connecting Hugging Face and LangChain" authors = [] readme = "README.md" @@ -20,7 +20,7 @@ disallow_untyped_defs = "True" [tool.poetry.dependencies] python = ">=3.9,<4.0" -langchain-core = ">=0.3.0,<0.4" +langchain-core = ">=0.3.7,<0.4" tokenizers = ">=0.19.1" transformers = ">=4.39.0" sentence-transformers = ">=2.6.0" From 5f2e93ffea2b017fee76d59cfeb8101c5db64d35 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:14:07 -0700 Subject: [PATCH 05/62] huggingface[patch]: xfail test (#27031) --- .../huggingface/tests/integration_tests/test_standard.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/partners/huggingface/tests/integration_tests/test_standard.py b/libs/partners/huggingface/tests/integration_tests/test_standard.py index 98a38ab7c5e..fd120f3f0f6 100644 --- a/libs/partners/huggingface/tests/integration_tests/test_standard.py +++ b/libs/partners/huggingface/tests/integration_tests/test_standard.py @@ -65,6 +65,10 @@ class TestHuggingFaceEndpoint(ChatModelIntegrationTests): def test_structured_output(self, model: BaseChatModel) -> None: super().test_structured_output(model) + @pytest.mark.xfail(reason=("Not implemented")) + def test_structured_output_async(self, model: BaseChatModel) -> None: # type: ignore[override] + super().test_structured_output(model) + @pytest.mark.xfail(reason=("Not implemented")) def test_structured_output_pydantic_2_v1(self, model: BaseChatModel) -> None: super().test_structured_output_pydantic_2_v1(model) From 099235da01055db898e4321381c2cee79cff8c6f Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:26:38 -0700 Subject: [PATCH 06/62] =?UTF-8?q?Revert=20"huggingface[patch]:=20make=20Hu?= =?UTF-8?q?ggingFaceEndpoint=20serializable=20(#2=E2=80=A6=20(#27032)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …7027)" This reverts commit b5e28d3a6d207a0fd7198cb4ab31d75e7cb10325. --- .../llms/huggingface_endpoint.py | 61 +- libs/partners/huggingface/poetry.lock | 1555 ++++++++--------- libs/partners/huggingface/pyproject.toml | 4 +- 3 files changed, 791 insertions(+), 829 deletions(-) diff --git a/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py b/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py index f6a8e9ba611..076cafd4de6 100644 --- a/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py +++ b/libs/partners/huggingface/langchain_huggingface/llms/huggingface_endpoint.py @@ -4,19 +4,14 @@ import logging import os from typing import Any, AsyncIterator, Dict, Iterator, List, Mapping, Optional -from huggingface_hub import ( # type: ignore[import-untyped] - AsyncInferenceClient, - InferenceClient, - login, -) from langchain_core.callbacks import ( AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun, ) from langchain_core.language_models.llms import LLM from langchain_core.outputs import GenerationChunk -from langchain_core.utils import get_pydantic_field_names, secret_from_env -from pydantic import ConfigDict, Field, SecretStr, model_validator +from langchain_core.utils import from_env, get_pydantic_field_names +from pydantic import ConfigDict, Field, model_validator from typing_extensions import Self logger = logging.getLogger(__name__) @@ -78,12 +73,10 @@ class HuggingFaceEndpoint(LLM): should be pass as env variable in `HF_INFERENCE_ENDPOINT`""" repo_id: Optional[str] = None """Repo to use. If endpoint_url is not specified then this needs to given""" - huggingfacehub_api_token: Optional[SecretStr] = Field( - default_factory=secret_from_env( - ["HUGGINGFACEHUB_API_TOKEN", "HF_TOKEN"], default=None - ) + huggingfacehub_api_token: Optional[str] = Field( + default_factory=from_env("HUGGINGFACEHUB_API_TOKEN", default=None) ) - max_new_tokens: int = Field(default=512, alias="max_tokens") + max_new_tokens: int = 512 """Maximum number of generated tokens""" top_k: Optional[int] = None """The number of highest probability vocabulary tokens to keep for @@ -123,15 +116,14 @@ class HuggingFaceEndpoint(LLM): model_kwargs: Dict[str, Any] = Field(default_factory=dict) """Holds any model parameters valid for `call` not explicitly specified""" model: str - client: Any = Field(default=None, exclude=True) #: :meta private: - async_client: Any = Field(default=None, exclude=True) #: :meta private: + client: Any = None #: :meta private: + async_client: Any = None #: :meta private: task: Optional[str] = None """Task to call the model with. Should be a task that returns `generated_text` or `summary_text`.""" model_config = ConfigDict( extra="forbid", - populate_by_name=True, ) @model_validator(mode="before") @@ -197,23 +189,36 @@ class HuggingFaceEndpoint(LLM): @model_validator(mode="after") def validate_environment(self) -> Self: """Validate that package is installed and that the API token is valid.""" - if self.huggingfacehub_api_token is not None: + try: + from huggingface_hub import login # type: ignore[import] + + except ImportError: + raise ImportError( + "Could not import huggingface_hub python package. " + "Please install it with `pip install huggingface_hub`." + ) + + huggingfacehub_api_token = self.huggingfacehub_api_token or os.getenv( + "HF_TOKEN" + ) + + if huggingfacehub_api_token is not None: try: - login(token=self.huggingfacehub_api_token.get_secret_value()) + login(token=huggingfacehub_api_token) except Exception as e: raise ValueError( "Could not authenticate with huggingface_hub. " "Please check your API token." ) from e + from huggingface_hub import AsyncInferenceClient, InferenceClient + # Instantiate clients with supported kwargs sync_supported_kwargs = set(inspect.signature(InferenceClient).parameters) self.client = InferenceClient( model=self.model, timeout=self.timeout, - token=self.huggingfacehub_api_token.get_secret_value() - if self.huggingfacehub_api_token - else None, + token=huggingfacehub_api_token, **{ key: value for key, value in self.server_kwargs.items() @@ -225,9 +230,7 @@ class HuggingFaceEndpoint(LLM): self.async_client = AsyncInferenceClient( model=self.model, timeout=self.timeout, - token=self.huggingfacehub_api_token.get_secret_value() - if self.huggingfacehub_api_token - else None, + token=huggingfacehub_api_token, **{ key: value for key, value in self.server_kwargs.items() @@ -423,15 +426,3 @@ class HuggingFaceEndpoint(LLM): # break if stop sequence found if stop_seq_found: break - - @classmethod - def is_lc_serializable(cls) -> bool: - return True - - @classmethod - def get_lc_namespace(cls) -> list[str]: - return ["langchain_huggingface", "llms"] - - @property - def lc_secrets(self) -> dict[str, str]: - return {"huggingfacehub_api_token": "HUGGINGFACEHUB_API_TOKEN"} diff --git a/libs/partners/huggingface/poetry.lock b/libs/partners/huggingface/poetry.lock index c7ee6ddc923..6c8e24fce14 100644 --- a/libs/partners/huggingface/poetry.lock +++ b/libs/partners/huggingface/poetry.lock @@ -1,114 +1,114 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" -version = "2.4.3" +version = "2.4.0" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, - {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, + {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, + {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, ] [[package]] name = "aiohttp" -version = "3.10.8" +version = "3.10.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, - {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, - {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, - {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, - {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, - {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, - {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, - {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, - {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, - {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, - {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, - {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, - {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, - {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, - {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, - {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, - {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, - {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, - {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, - {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, - {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, - {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, - {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, - {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, - {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, - {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, - {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, - {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, - {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, - {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, - {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, - {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, - {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, + {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, + {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, + {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, + {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, + {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, + {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, + {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, + {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, + {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, + {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, + {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, + {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, + {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, + {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, + {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, + {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, + {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, + {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, + {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, + {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, + {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, + {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, + {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, + {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, + {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, + {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, + {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, + {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, + {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, + {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, + {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, ] [package.dependencies] @@ -118,7 +118,7 @@ async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.12.0,<2.0" +yarl = ">=1.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -150,13 +150,13 @@ files = [ [[package]] name = "anyio" -version = "4.6.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, - {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] @@ -166,9 +166,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] -trio = ["trio (>=0.26.1)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "appnope" @@ -480,33 +480,33 @@ typing-inspect = ">=0.4.0,<1" [[package]] name = "debugpy" -version = "1.8.6" +version = "1.8.5" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, - {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, - {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, - {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, - {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, - {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, - {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, - {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, - {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, - {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, - {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, - {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, - {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, - {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, - {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, - {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, - {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, - {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, - {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, - {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, - {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, - {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, + {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, + {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, + {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, + {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, + {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, + {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, + {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, + {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, + {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, + {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, + {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, + {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, + {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, + {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, + {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, + {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, + {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, + {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, + {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, + {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, + {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, + {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, ] [[package]] @@ -550,18 +550,18 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "filelock" -version = "3.16.1" +version = "3.16.0" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, - {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, + {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"}, + {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] @@ -691,84 +691,77 @@ tqdm = ["tqdm"] [[package]] name = "greenlet" -version = "3.1.1" +version = "3.1.0" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" files = [ - {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, - {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, - {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, - {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, - {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, - {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, - {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, - {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, - {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, - {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, - {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, - {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, - {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, - {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, - {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, - {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, - {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, + {file = "greenlet-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25"}, + {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682"}, + {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1"}, + {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99"}, + {file = "greenlet-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54"}, + {file = "greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"}, + {file = "greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"}, + {file = "greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"}, + {file = "greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"}, + {file = "greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"}, + {file = "greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df"}, + {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637"}, + {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954"}, + {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3"}, + {file = "greenlet-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00"}, + {file = "greenlet-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6"}, + {file = "greenlet-3.1.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491"}, + {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b"}, + {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d"}, + {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0"}, + {file = "greenlet-3.1.0-cp38-cp38-win32.whl", hash = "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2"}, + {file = "greenlet-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910"}, + {file = "greenlet-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a"}, + {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28"}, + {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b"}, + {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8"}, + {file = "greenlet-3.1.0-cp39-cp39-win32.whl", hash = "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc"}, + {file = "greenlet-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97"}, + {file = "greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"}, ] [package.extras] @@ -788,13 +781,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.6" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, - {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] @@ -805,7 +798,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] +trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" @@ -834,13 +827,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.25.1" +version = "0.24.6" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"}, - {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"}, + {file = "huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970"}, + {file = "huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"}, ] [package.dependencies] @@ -868,40 +861,33 @@ typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "t [[package]] name = "idna" -version = "3.10" +version = "3.8" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, ] -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - [[package]] name = "importlib-metadata" -version = "8.5.0" +version = "8.4.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, - {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, + {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, + {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, ] [package.dependencies] -zipp = ">=3.20" +zipp = ">=0.5" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -1058,13 +1044,13 @@ files = [ [[package]] name = "jupyter-client" -version = "8.6.3" +version = "8.6.2" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, - {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, ] [package.dependencies] @@ -1101,20 +1087,20 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" [[package]] name = "langchain" -version = "0.3.1" +version = "0.3.0.dev2" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.1-py3-none-any.whl", hash = "sha256:94e5ee7464d4366e4b158aa5704953c39701ea237b9ed4b200096d49e83bb3ae"}, - {file = "langchain-0.3.1.tar.gz", hash = "sha256:54d6e3abda2ec056875a231a418a4130ba7576e629e899067e499bfc847b7586"}, + {file = "langchain-0.3.0.dev2-py3-none-any.whl", hash = "sha256:f84d318aed04a01a700659c90063a8f3cb0cf2c055d312ad6aaae177ab709963"}, + {file = "langchain-0.3.0.dev2.tar.gz", hash = "sha256:08d6617518fee66163ae21f7dfb535bf336cfcfa9f3d91c25f0eace76355d50b"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.6,<0.4.0" -langchain-text-splitters = ">=0.3.0,<0.4.0" +langchain-core = ">=0.3.0.dev5,<0.4.0" +langchain-text-splitters = ">=0.3.0.dev1,<0.4.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, @@ -1128,7 +1114,7 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-community" -version = "0.3.1" +version = "0.3.0.dev2" description = "Community contributed LangChain integrations." optional = false python-versions = ">=3.9,<4.0" @@ -1138,9 +1124,9 @@ develop = true [package.dependencies] aiohttp = "^3.8.3" dataclasses-json = ">= 0.5.7, < 0.7" -langchain = "^0.3.1" -langchain-core = "^0.3.6" -langsmith = "^0.1.125" +langchain = "^0.3.0.dev2" +langchain-core = "^0.3.0.dev5" +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\""}, @@ -1157,7 +1143,7 @@ url = "../../community" [[package]] name = "langchain-core" -version = "0.3.7" +version = "0.3.0" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -1166,7 +1152,7 @@ develop = true [package.dependencies] jsonpatch = "^1.33" -langsmith = "^0.1.125" +langsmith = "^0.1.117" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -1191,7 +1177,7 @@ develop = true [package.dependencies] httpx = "^0.27.0" -langchain-core = "^0.3.0" +langchain-core = ">=0.3.0.dev1" pytest = ">=7,<9" syrupy = "^4" @@ -1201,27 +1187,27 @@ url = "../../standard-tests" [[package]] name = "langchain-text-splitters" -version = "0.3.0" +version = "0.3.0.dev1" description = "LangChain text splitting utilities" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_text_splitters-0.3.0-py3-none-any.whl", hash = "sha256:e84243e45eaff16e5b776cd9c81b6d07c55c010ebcb1965deb3d1792b7358e83"}, - {file = "langchain_text_splitters-0.3.0.tar.gz", hash = "sha256:f9fe0b4d244db1d6de211e7343d4abc4aa90295aa22e1f0c89e51f33c55cd7ce"}, + {file = "langchain_text_splitters-0.3.0.dev1-py3-none-any.whl", hash = "sha256:85abe6ab1aa95e8cc3bf985cd9e53848de616c21d3590a25ac13a694d409f133"}, + {file = "langchain_text_splitters-0.3.0.dev1.tar.gz", hash = "sha256:5e13ca0f27719406c6c5575f48cdfb89755f02dd0f1c8af5d1f8a1a9f391f3a2"}, ] [package.dependencies] -langchain-core = ">=0.3.0,<0.4.0" +langchain-core = ">=0.3.0.dev1,<0.4.0" [[package]] name = "langsmith" -version = "0.1.129" +version = "0.1.117" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.129-py3-none-any.whl", hash = "sha256:31393fbbb17d6be5b99b9b22d530450094fab23c6c37281a6a6efb2143d05347"}, - {file = "langsmith-0.1.129.tar.gz", hash = "sha256:6c3ba66471bef41b9f87da247cc0b493268b3f54656f73648a256a205261b6a0"}, + {file = "langsmith-0.1.117-py3-none-any.whl", hash = "sha256:e936ee9bcf8293b0496df7ba462a3702179fbe51f9dc28744b0fbec0dbf206ae"}, + {file = "langsmith-0.1.117.tar.gz", hash = "sha256:a1b532f49968b9339bcaff9118d141846d52ed3d803f342902e7448edf1d662b"}, ] [package.dependencies] @@ -1711,14 +1697,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.6.77" +version = "12.6.68" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3bf10d85bb1801e9c894c6e197e44dd137d2a0a9e43f8450e9ad13f2df0dd52d"}, - {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9ae346d16203ae4ea513be416495167a0101d33d2d14935aa9c1829a3fb45142"}, - {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:410718cd44962bed862a31dd0318620f6f9a8b28a6291967bcfcb446a6516771"}, + {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b3fd0779845f68b92063ab1393abab1ed0a23412fc520df79a8190d098b5cd6b"}, + {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_x86_64.whl", hash = "sha256:125a6c2a44e96386dda634e13d944e60b07a0402d391a070e8fb4104b34ea1ab"}, + {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-win_amd64.whl", hash = "sha256:a55744c98d70317c5e23db14866a8cc2b733f7324509e941fc96276f9f37801d"}, ] [[package]] @@ -1937,13 +1923,13 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.3.6" +version = "4.3.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, + {file = "platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617"}, + {file = "platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c"}, ] [package.extras] @@ -1968,13 +1954,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.48" +version = "3.0.47" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, - {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, ] [package.dependencies] @@ -2047,18 +2033,18 @@ files = [ [[package]] name = "pydantic" -version = "2.9.2" +version = "2.9.1" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, - {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, + {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, + {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.4" +pydantic-core = "2.23.3" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, @@ -2070,100 +2056,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.4" +version = "2.23.3" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, - {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, - {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, - {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, - {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, - {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, - {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, - {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, - {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, - {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, - {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, - {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, - {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, - {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, + {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, + {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, + {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, + {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, + {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, + {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, + {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, + {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, + {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, + {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, + {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, + {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, + {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, + {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, + {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, + {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, + {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, + {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, + {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, + {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, + {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, + {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, + {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, + {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, + {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, + {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, + {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, + {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, + {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, + {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, ] [package.dependencies] @@ -2171,13 +2157,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.5.2" +version = "2.5.0" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.5.2-py3-none-any.whl", hash = "sha256:2c912e55fd5794a59bf8c832b9de832dcfdf4778d79ff79b708744eed499a907"}, - {file = "pydantic_settings-2.5.2.tar.gz", hash = "sha256:f90b139682bee4d2065273d5185d71d37ea46cfe57e1b5ae184fc6a0b2484ca0"}, + {file = "pydantic_settings-2.5.0-py3-none-any.whl", hash = "sha256:eae04a3dd9adf521a4c959dcefb984e0f3b1d841999daf02f961dcc4d31d2f7f"}, + {file = "pydantic_settings-2.5.0.tar.gz", hash = "sha256:204828c02481a2e7135466b26a7d65d9e15a17d52d1d8f59cacdf9ad625e1140"}, ] [package.dependencies] @@ -2494,105 +2480,90 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "regex" -version = "2024.9.11" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, - {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, - {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, - {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, - {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, - {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, - {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] @@ -2777,32 +2748,32 @@ torch = ["safetensors[numpy]", "torch (>=1.10)"] [[package]] name = "scikit-learn" -version = "1.5.2" +version = "1.5.1" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, - {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, - {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, - {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, - {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, - {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, - {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, - {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, - {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, - {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, - {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, - {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, - {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, - {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, - {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, - {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, - {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, - {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, - {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, - {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, - {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, + {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, + {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, + {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, + {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, + {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, + {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, + {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, + {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, + {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, + {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, + {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, + {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, + {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, + {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, + {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, + {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, + {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, + {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, + {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, + {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, + {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, ] [package.dependencies] @@ -2814,11 +2785,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -2914,42 +2885,43 @@ test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.3 [[package]] name = "sentence-transformers" -version = "3.1.1" -description = "State-of-the-Art Text Embeddings" +version = "3.0.1" +description = "Multilingual text embeddings" optional = false -python-versions = ">=3.8" +python-versions = ">=3.8.0" files = [ - {file = "sentence_transformers-3.1.1-py3-none-any.whl", hash = "sha256:c73bf6f17e3676bb9372a6133a254ebfb5907586b470f2bac5a840c64c3cf97e"}, - {file = "sentence_transformers-3.1.1.tar.gz", hash = "sha256:8f00020ef4ad6b918475c38af545c22f61403b67eb22d994860bab06902db160"}, + {file = "sentence_transformers-3.0.1-py3-none-any.whl", hash = "sha256:01050cc4053c49b9f5b78f6980b5a72db3fd3a0abb9169b1792ac83875505ee6"}, + {file = "sentence_transformers-3.0.1.tar.gz", hash = "sha256:8a3d2c537cc4d1014ccc20ac92be3d6135420a3bc60ae29a3a8a9b4bb35fbff6"}, ] [package.dependencies] -huggingface-hub = ">=0.19.3" +huggingface-hub = ">=0.15.1" +numpy = "*" Pillow = "*" scikit-learn = "*" scipy = "*" torch = ">=1.11.0" tqdm = "*" -transformers = ">=4.38.0,<5.0.0" +transformers = ">=4.34.0,<5.0.0" [package.extras] -dev = ["accelerate (>=0.20.3)", "datasets", "pre-commit", "pytest", "pytest-cov"] +dev = ["accelerate (>=0.20.3)", "datasets", "pre-commit", "pytest", "ruff (>=0.3.0)"] train = ["accelerate (>=0.20.3)", "datasets"] [[package]] name = "setuptools" -version = "75.1.0" +version = "74.1.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, - {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, + {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, + {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] @@ -2980,60 +2952,60 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.35" +version = "2.0.34" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, - {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, - {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, - {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, - {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, - {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, - {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, - {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, - {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea54f7300553af0a2a7235e9b85f4204e1fc21848f917a3213b0e0818de9a24"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:196958cde924a00488e3e83ff917be3b73cd4ed8352bbc0f2989333176d1c54d"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-win32.whl", hash = "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b"}, + {file = "SQLAlchemy-2.0.34-cp310-cp310-win_amd64.whl", hash = "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-win32.whl", hash = "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721"}, + {file = "SQLAlchemy-2.0.34-cp311-cp311-win_amd64.whl", hash = "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-win32.whl", hash = "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580"}, + {file = "SQLAlchemy-2.0.34-cp312-cp312-win_amd64.whl", hash = "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60ed6ef0a35c6b76b7640fe452d0e47acc832ccbb8475de549a5cc5f90c2c06"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:25691f4adfb9d5e796fd48bf1432272f95f4bbe5f89c475a788f31232ea6afba"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-win32.whl", hash = "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3"}, + {file = "SQLAlchemy-2.0.34-cp37-cp37m-win_amd64.whl", hash = "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1e03db964e9d32f112bae36f0cc1dcd1988d096cfd75d6a588a3c3def9ab2b"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ae92bebca3b1e6bd203494e5ef919a60fb6dfe4d9a47ed2453211d3bd451b9f5"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-win32.whl", hash = "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434"}, + {file = "SQLAlchemy-2.0.34-cp38-cp38-win_amd64.whl", hash = "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a17d8fac6df9835d8e2b4c5523666e7051d0897a93756518a1fe101c7f47f2f0"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e6965346fc1491a566e019a4a1d3dfc081ce7ac1a736536367ca305da6472a8"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-win32.whl", hash = "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c"}, + {file = "SQLAlchemy-2.0.34-cp39-cp39-win_amd64.whl", hash = "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8"}, + {file = "SQLAlchemy-2.0.34-py3-none-any.whl", hash = "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f"}, + {file = "sqlalchemy-2.0.34.tar.gz", hash = "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22"}, ] [package.dependencies] @@ -3086,13 +3058,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.13.3" +version = "1.13.2" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, - {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, + {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, + {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, ] [package.dependencies] @@ -3143,111 +3115,111 @@ files = [ [[package]] name = "tokenizers" -version = "0.20.0" +version = "0.19.1" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6cff5c5e37c41bc5faa519d6f3df0679e4b37da54ea1f42121719c5e2b4905c0"}, - {file = "tokenizers-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:62a56bf75c27443432456f4ca5ca055befa95e25be8a28141cc495cac8ae4d6d"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68cc7de6a63f09c4a86909c2597b995aa66e19df852a23aea894929c74369929"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:053c37ecee482cc958fdee53af3c6534286a86f5d35aac476f7c246830e53ae5"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d7074aaabc151a6363fa03db5493fc95b423b2a1874456783989e96d541c7b6"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a11435780f2acd89e8fefe5e81cecf01776f6edb9b3ac95bcb76baee76b30b90"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a81cd2712973b007d84268d45fc3f6f90a79c31dfe7f1925e6732f8d2959987"}, - {file = "tokenizers-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7dfd796ab9d909f76fb93080e1c7c8309f196ecb316eb130718cd5e34231c69"}, - {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8029ad2aa8cb00605c9374566034c1cc1b15130713e0eb5afcef6cface8255c9"}, - {file = "tokenizers-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca4d54260ebe97d59dfa9a30baa20d0c4dd9137d99a8801700055c561145c24e"}, - {file = "tokenizers-0.20.0-cp310-none-win32.whl", hash = "sha256:95ee16b57cec11b86a7940174ec5197d506439b0f415ab3859f254b1dffe9df0"}, - {file = "tokenizers-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:0a61a11e93eeadbf02aea082ffc75241c4198e0608bbbac4f65a9026851dcf37"}, - {file = "tokenizers-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6636b798b3c4d6c9b1af1a918bd07c867808e5a21c64324e95318a237e6366c3"}, - {file = "tokenizers-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ec603e42eaf499ffd58b9258162add948717cf21372458132f14e13a6bc7172"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce124264903a8ea6f8f48e1cc7669e5ef638c18bd4ab0a88769d5f92debdf7f"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07bbeba0231cf8de07aa6b9e33e9779ff103d47042eeeb859a8c432e3292fb98"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:06c0ca8397b35d38b83a44a9c6929790c1692957d88541df061cb34d82ebbf08"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca6557ac3b83d912dfbb1f70ab56bd4b0594043916688e906ede09f42e192401"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a5ad94c9e80ac6098328bee2e3264dbced4c6faa34429994d473f795ec58ef4"}, - {file = "tokenizers-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b5c7f906ee6bec30a9dc20268a8b80f3b9584de1c9f051671cb057dc6ce28f6"}, - {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:31e087e9ee1b8f075b002bfee257e858dc695f955b43903e1bb4aa9f170e37fe"}, - {file = "tokenizers-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3124fb6f3346cb3d8d775375d3b429bf4dcfc24f739822702009d20a4297990"}, - {file = "tokenizers-0.20.0-cp311-none-win32.whl", hash = "sha256:a4bb8b40ba9eefa621fdcabf04a74aa6038ae3be0c614c6458bd91a4697a452f"}, - {file = "tokenizers-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:2b709d371f1fe60a28ef0c5c67815952d455ca7f34dbe7197eaaed3cc54b658e"}, - {file = "tokenizers-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:15c81a17d0d66f4987c6ca16f4bea7ec253b8c7ed1bb00fdc5d038b1bb56e714"}, - {file = "tokenizers-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6a531cdf1fb6dc41c984c785a3b299cb0586de0b35683842a3afbb1e5207f910"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06caabeb4587f8404e0cd9d40f458e9cba3e815c8155a38e579a74ff3e2a4301"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8768f964f23f5b9f50546c0369c75ab3262de926983888bbe8b98be05392a79c"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:626403860152c816f97b649fd279bd622c3d417678c93b4b1a8909b6380b69a8"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c1b88fa9e5ff062326f4bf82681da5a96fca7104d921a6bd7b1e6fcf224af26"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7e559436a07dc547f22ce1101f26d8b2fad387e28ec8e7e1e3b11695d681d8"}, - {file = "tokenizers-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48afb75e50449848964e4a67b0da01261dd3aa8df8daecf10db8fd7f5b076eb"}, - {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf5d0e1ff44710a95eefc196dd87666ffc609fd447c5e5b68272a7c3d342a1d"}, - {file = "tokenizers-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e5e56df0e8ed23ba60ae3848c3f069a0710c4b197218fe4f89e27eba38510768"}, - {file = "tokenizers-0.20.0-cp312-none-win32.whl", hash = "sha256:ec53e5ecc142a82432f9c6c677dbbe5a2bfee92b8abf409a9ecb0d425ee0ce75"}, - {file = "tokenizers-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:f18661ece72e39c0dfaa174d6223248a15b457dbd4b0fc07809b8e6d3ca1a234"}, - {file = "tokenizers-0.20.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:f7065b1084d8d1a03dc89d9aad69bcbc8415d4bc123c367063eb32958cd85054"}, - {file = "tokenizers-0.20.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:e5d4069e4714e3f7ba0a4d3d44f9d84a432cd4e4aa85c3d7dd1f51440f12e4a1"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:799b808529e54b7e1a36350bda2aeb470e8390e484d3e98c10395cee61d4e3c6"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f9baa027cc8a281ad5f7725a93c204d7a46986f88edbe8ef7357f40a23fb9c7"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:010ec7f3f7a96adc4c2a34a3ada41fa14b4b936b5628b4ff7b33791258646c6b"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98d88f06155335b14fd78e32ee28ca5b2eb30fced4614e06eb14ae5f7fba24ed"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e13eb000ef540c2280758d1b9cfa5fe424b0424ae4458f440e6340a4f18b2638"}, - {file = "tokenizers-0.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fab3cf066ff426f7e6d70435dc28a9ff01b2747be83810e397cba106f39430b0"}, - {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:39fa3761b30a89368f322e5daf4130dce8495b79ad831f370449cdacfb0c0d37"}, - {file = "tokenizers-0.20.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c8da0fba4d179ddf2607821575998df3c294aa59aa8df5a6646dc64bc7352bce"}, - {file = "tokenizers-0.20.0-cp37-none-win32.whl", hash = "sha256:fada996d6da8cf213f6e3c91c12297ad4f6cdf7a85c2fadcd05ec32fa6846fcd"}, - {file = "tokenizers-0.20.0-cp37-none-win_amd64.whl", hash = "sha256:7d29aad702279e0760c265fcae832e89349078e3418dd329732d4503259fd6bd"}, - {file = "tokenizers-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:099c68207f3ef0227ecb6f80ab98ea74de559f7b124adc7b17778af0250ee90a"}, - {file = "tokenizers-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:68012d8a8cddb2eab3880870d7e2086cb359c7f7a2b03f5795044f5abff4e850"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9253bdd209c6aee168deca7d0e780581bf303e0058f268f9bb06859379de19b6"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f868600ddbcb0545905ed075eb7218a0756bf6c09dae7528ea2f8436ebd2c93"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9643d9c8c5f99b6aba43fd10034f77cc6c22c31f496d2f0ee183047d948fa0"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c375c6a889aeab44734028bc65cc070acf93ccb0f9368be42b67a98e1063d3f6"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e359f852328e254f070bbd09a19a568421d23388f04aad9f2fb7da7704c7228d"}, - {file = "tokenizers-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d98b01a309d4387f3b1c1dd68a8b8136af50376cf146c1b7e8d8ead217a5be4b"}, - {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:459f7537119554c2899067dec1ac74a00d02beef6558f4ee2e99513bf6d568af"}, - {file = "tokenizers-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:392b87ec89452628c045c9f2a88bc2a827f4c79e7d84bc3b72752b74c2581f70"}, - {file = "tokenizers-0.20.0-cp38-none-win32.whl", hash = "sha256:55a393f893d2ed4dd95a1553c2e42d4d4086878266f437b03590d3f81984c4fe"}, - {file = "tokenizers-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:30ffe33c5c2f2aab8e9a3340d0110dd9f7ace7eec7362e20a697802306bd8068"}, - {file = "tokenizers-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aa2d4a6fed2a7e3f860c7fc9d48764bb30f2649d83915d66150d6340e06742b8"}, - {file = "tokenizers-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5ef0f814084a897e9071fc4a868595f018c5c92889197bdc4bf19018769b148"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1e1b791e8c3bf4c4f265f180dadaff1c957bf27129e16fdd5e5d43c2d3762c"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b69e55e481459c07885263743a0d3c18d52db19bae8226a19bcca4aaa213fff"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806b4d82e27a2512bc23057b2986bc8b85824914286975b84d8105ff40d03d9"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9859e9ef13adf5a473ccab39d31bff9c550606ae3c784bf772b40f615742a24f"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef703efedf4c20488a8eb17637b55973745b27997ff87bad88ed499b397d1144"}, - {file = "tokenizers-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eec0061bab94b1841ab87d10831fdf1b48ebaed60e6d66d66dbe1d873f92bf5"}, - {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:980f3d0d7e73f845b69087f29a63c11c7eb924c4ad6b358da60f3db4cf24bdb4"}, - {file = "tokenizers-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c157550a2f3851b29d7fdc9dc059fcf81ff0c0fc49a1e5173a89d533ed043fa"}, - {file = "tokenizers-0.20.0-cp39-none-win32.whl", hash = "sha256:8a3d2f4d08608ec4f9895ec25b4b36a97f05812543190a5f2c3cd19e8f041e5a"}, - {file = "tokenizers-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:d90188d12afd0c75e537f9a1d92f9c7375650188ee4f48fdc76f9e38afbd2251"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d68e15f1815357b059ec266062340c343ea7f98f7f330602df81ffa3474b6122"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:23f9ecec637b9bc80da5f703808d29ed5329e56b5aa8d791d1088014f48afadc"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f830b318ee599e3d0665b3e325f85bc75ee2d2ca6285f52e439dc22b64691580"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3dc750def789cb1de1b5a37657919545e1d9ffa667658b3fa9cb7862407a1b8"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e26e6c755ae884c2ea6135cd215bdd0fccafe4ee62405014b8c3cd19954e3ab9"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a1158c7174f427182e08baa2a8ded2940f2b4a3e94969a85cc9cfd16004cbcea"}, - {file = "tokenizers-0.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:6324826287a3fc198898d3dcf758fe4a8479e42d6039f4c59e2cedd3cf92f64e"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d8653149405bb0c16feaf9cfee327fdb6aaef9dc2998349fec686f35e81c4e2"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a2dc1e402a155e97309287ca085c80eb1b7fab8ae91527d3b729181639fa51"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bef67b20aa6e5f7868c42c7c5eae4d24f856274a464ae62e47a0f2cccec3da"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da06e397182ff53789c506c7833220c192952c57e1581a53f503d8d953e2d67e"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:302f7e11a14814028b7fc88c45a41f1bbe9b5b35fd76d6869558d1d1809baa43"}, - {file = "tokenizers-0.20.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:055ec46e807b875589dfbe3d9259f9a6ee43394fb553b03b3d1e9541662dbf25"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e3144b8acebfa6ae062e8f45f7ed52e4b50fb6c62f93afc8871b525ab9fdcab3"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b52aa3fd14b2a07588c00a19f66511cff5cca8f7266ca3edcdd17f3512ad159f"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b8cf52779ffc5d4d63a0170fbeb512372bad0dd014ce92bbb9149756c831124"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:983a45dd11a876124378dae71d6d9761822199b68a4c73f32873d8cdaf326a5b"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6b819c9a19831ebec581e71a7686a54ab45d90faf3842269a10c11d746de0c"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e738cfd80795fcafcef89c5731c84b05638a4ab3f412f97d5ed7765466576eb1"}, - {file = "tokenizers-0.20.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c8842c7be2fadb9c9edcee233b1b7fe7ade406c99b0973f07439985c1c1d0683"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e47a82355511c373a4a430c4909dc1e518e00031207b1fec536c49127388886b"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9afbf359004551179a5db19424180c81276682773cff2c5d002f6eaaffe17230"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07eaa8799a92e6af6f472c21a75bf71575de2af3c0284120b7a09297c0de2f3"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0994b2e5fc53a301071806bc4303e4bc3bdc3f490e92a21338146a36746b0872"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6466e0355b603d10e3cc3d282d350b646341b601e50969464a54939f9848d0"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1e86594c2a433cb1ea09cfbe596454448c566e57ee8905bd557e489d93e89986"}, - {file = "tokenizers-0.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3e14cdef1efa96ecead6ea64a891828432c3ebba128bdc0596e3059fea104ef3"}, - {file = "tokenizers-0.20.0.tar.gz", hash = "sha256:39d7acc43f564c274085cafcd1dae9d36f332456de1a31970296a6b8da4eac8d"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, ] [package.dependencies] @@ -3380,13 +3352,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transformers" -version = "4.45.1" +version = "4.44.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" files = [ - {file = "transformers-4.45.1-py3-none-any.whl", hash = "sha256:21e3f47aa7256dbbfb5215937a3168a984c94432ce3a16b7908265807d62aee8"}, - {file = "transformers-4.45.1.tar.gz", hash = "sha256:9cace11072172df05ca6a694fcd1f5064a55b63285e492bd88f0ad1cec270f02"}, + {file = "transformers-4.44.2-py3-none-any.whl", hash = "sha256:1c02c65e7bfa5e52a634aff3da52138b583fc6f263c1f28d547dc144ba3d412d"}, + {file = "transformers-4.44.2.tar.gz", hash = "sha256:36aa17cc92ee154058e426d951684a2dab48751b35b49437896f898931270826"}, ] [package.dependencies] @@ -3398,21 +3370,21 @@ pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" safetensors = ">=0.4.1" -tokenizers = ">=0.20,<0.21" +tokenizers = ">=0.19,<0.20" tqdm = ">=4.27" [package.extras] -accelerate = ["accelerate (>=0.26.0)"] -agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision"] +accelerate = ["accelerate (>=0.21.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -benchmark = ["optimum-benchmark (>=0.3.0)"] +benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] -deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.20,<0.21)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "libcst", "librosa", "nltk (<=3.8.1)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] @@ -3423,7 +3395,7 @@ natten = ["natten (>=0.14.6,<0.15.0)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] optuna = ["optuna"] -quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "libcst", "rich", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.5.1)", "urllib3 (<2.0.0)"] ray = ["ray[tune] (>=2.7.0)"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] ruff = ["ruff (==0.5.1)"] @@ -3433,17 +3405,16 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] -tiktoken = ["blobfile", "tiktoken"] timm = ["timm (<=0.9.16)"] -tokenizers = ["tokenizers (>=0.20,<0.21)"] -torch = ["accelerate (>=0.26.0)", "torch"] +tokenizers = ["tokenizers (>=0.19,<0.20)"] +torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.20,<0.21)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] @@ -3497,13 +3468,13 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "2.2.3" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -3514,41 +3485,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "5.0.3" +version = "5.0.2" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, - {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, - {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, - {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, - {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, - {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, - {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, - {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, - {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, - {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, - {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, - {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, - {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, - {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, - {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, - {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, - {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, - {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, - {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, - {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, - {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, - {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, - {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, - {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, - {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, - {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, - {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, - {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, - {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, - {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, + {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, + {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, + {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, + {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, + {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, + {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, + {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, + {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, + {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, + {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, + {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, + {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, + {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, + {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, + {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, + {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, + {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, + {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, + {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, + {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, + {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, + {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, + {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, ] [package.extras] @@ -3567,103 +3538,103 @@ files = [ [[package]] name = "yarl" -version = "1.13.1" +version = "1.11.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, - {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, - {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, - {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, - {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, - {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, - {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, - {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, - {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, - {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, - {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, - {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, - {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, - {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, - {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, + {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, + {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, + {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, + {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, + {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, + {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, + {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, + {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, + {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, + {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, + {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, + {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, + {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, + {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, + {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, + {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, + {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, + {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, + {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, + {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, + {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, + {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, + {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, + {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, + {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, + {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, + {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, + {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, + {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, + {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, + {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, + {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, ] [package.dependencies] @@ -3672,13 +3643,13 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.20.2" +version = "3.20.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, - {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, + {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, + {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, ] [package.extras] @@ -3692,4 +3663,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "3ff0e421de2a24d3c47165a540f21e8ca827740d4245da8260c2e64d82d8c72e" +content-hash = "935cfcef42083ca2d00fab8dc58837c2911041ea1526c684a54c4a1404648d39" diff --git a/libs/partners/huggingface/pyproject.toml b/libs/partners/huggingface/pyproject.toml index 3c203148c50..53c0dc204f4 100644 --- a/libs/partners/huggingface/pyproject.toml +++ b/libs/partners/huggingface/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-huggingface" -version = "0.1.1" +version = "0.1.0" description = "An integration package connecting Hugging Face and LangChain" authors = [] readme = "README.md" @@ -20,7 +20,7 @@ disallow_untyped_defs = "True" [tool.poetry.dependencies] python = ">=3.9,<4.0" -langchain-core = ">=0.3.7,<0.4" +langchain-core = ">=0.3.0,<0.4" tokenizers = ">=0.19.1" transformers = ">=4.39.0" sentence-transformers = ">=2.6.0" From e806e9de38e796d3c7d2ed069d59186717bef60e Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Tue, 1 Oct 2024 14:49:35 -0700 Subject: [PATCH 07/62] infra: fix api docs build checkout 2 (#27033) --- .github/workflows/api_doc_build.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/api_doc_build.yml b/.github/workflows/api_doc_build.yml index 8de86f3ff3c..5cb09453a37 100644 --- a/.github/workflows/api_doc_build.yml +++ b/.github/workflows/api_doc_build.yml @@ -65,6 +65,14 @@ jobs: with: repository: langchain-ai/langchain-experimental path: langchain-experimental + - uses: actions/checkout@v4 + with: + repository: langchain-ai/langchain-milvus + path: langchain-milvus + - uses: actions/checkout@v4 + with: + repository: langchain-ai/langchain-unstructured + path: langchain-unstructured - name: Set Git config @@ -73,7 +81,7 @@ jobs: git config --local user.email "actions@github.com" git config --local user.name "Github Actions" - - name: Move google libs + - name: Move libs run: | rm -rf \ langchain/libs/partners/google-genai \ @@ -87,7 +95,9 @@ jobs: langchain/libs/partners/ai21 \ langchain/libs/partners/together \ langchain/libs/standard-tests \ - langchain/libs/experimental + langchain/libs/experimental \ + langchain/libs/partners/milvus \ + langchain/libs/partners/unstructured mv langchain-google/libs/genai langchain/libs/partners/google-genai mv langchain-google/libs/vertexai langchain/libs/partners/google-vertexai mv langchain-google/libs/community langchain/libs/partners/google-community @@ -101,6 +111,8 @@ jobs: mv langchain-ai21/libs/ai21 langchain/libs/partners/ai21 mv langchain-together/libs/together langchain/libs/partners/together mv langchain-experimental/libs/experimental langchain/libs/experimental + mv langchain-milvus/libs/milvus langchain/libs/partners/milvus + mv langchain-unstructured/libs/unstructured langchain/libs/partners/unstructured - name: Rm old html run: From 74bf620e978d62e70daa27b70f180884c2fb26bb Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Wed, 2 Oct 2024 12:50:58 -0400 Subject: [PATCH 08/62] core[patch]: Support injected tool args that are arbitrary types (#27045) This adds support for inject tool args that are arbitrary types when used with pydantic 2. We'll need to add similar logic on the v1 path, and potentially mirror the config from the original model when we're doing the subset. --- libs/core/langchain_core/utils/pydantic.py | 7 +++++-- libs/core/tests/unit_tests/test_tools.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/libs/core/langchain_core/utils/pydantic.py b/libs/core/langchain_core/utils/pydantic.py index 1352bcfafff..93375e09f34 100644 --- a/libs/core/langchain_core/utils/pydantic.py +++ b/libs/core/langchain_core/utils/pydantic.py @@ -266,7 +266,7 @@ def _create_subset_model_v2( fn_description: Optional[str] = None, ) -> type[pydantic.BaseModel]: """Create a pydantic model with a subset of the model fields.""" - from pydantic import create_model + from pydantic import ConfigDict, create_model from pydantic.fields import FieldInfo descriptions_ = descriptions or {} @@ -278,7 +278,10 @@ def _create_subset_model_v2( if field.metadata: field_info.metadata = field.metadata fields[field_name] = (field.annotation, field_info) - rtn = create_model(name, **fields) # type: ignore + + rtn = create_model( # type: ignore + name, **fields, __config__=ConfigDict(arbitrary_types_allowed=True) + ) # TODO(0.3): Determine if there is a more "pydantic" way to preserve annotations. # This is done to preserve __annotations__ when working with pydantic 2.x diff --git a/libs/core/tests/unit_tests/test_tools.py b/libs/core/tests/unit_tests/test_tools.py index a61cead53c2..3eae40ede1e 100644 --- a/libs/core/tests/unit_tests/test_tools.py +++ b/libs/core/tests/unit_tests/test_tools.py @@ -2090,3 +2090,18 @@ def test_structured_tool_direct_init() -> None: with pytest.raises(NotImplementedError): assert tool.invoke("hello") == "hello" + + +def test_injected_arg_with_complex_type() -> None: + """Test that an injected tool arg can be a complex type.""" + + class Foo: + def __init__(self) -> None: + self.value = "bar" + + @tool + def injected_tool(x: int, foo: Annotated[Foo, InjectedToolArg]) -> str: + """Tool that has an injected tool arg.""" + return foo.value + + assert injected_tool.invoke({"x": 5, "foo": Foo()}) == "bar" # type: ignore From 635c55c0392fb1b8b121a96920bdfa73d33392a6 Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Wed, 2 Oct 2024 12:58:38 -0400 Subject: [PATCH 09/62] core[patch]: Release 0.3.8 (#27046) 0.3.8 release for core --- libs/core/poetry.lock | 274 +++++++++++++++++++-------------------- libs/core/pyproject.toml | 2 +- 2 files changed, 138 insertions(+), 138 deletions(-) diff --git a/libs/core/poetry.lock b/libs/core/poetry.lock index 508e4c87ab4..45513dcd010 100644 --- a/libs/core/poetry.lock +++ b/libs/core/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 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" @@ -602,13 +602,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -619,7 +619,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -1215,13 +1215,13 @@ url = "../text-splitters" [[package]] name = "langsmith" -version = "0.1.128" +version = "0.1.129" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.128-py3-none-any.whl", hash = "sha256:c1b59d947584be7487ac53dffb4e232704626964011b714fd3d9add4b3694cbc"}, - {file = "langsmith-0.1.128.tar.gz", hash = "sha256:3299e17a659f3c47725c97c47f4445fc34113ac668becce425919866fbcb6ec2"}, + {file = "langsmith-0.1.129-py3-none-any.whl", hash = "sha256:31393fbbb17d6be5b99b9b22d530450094fab23c6c37281a6a6efb2143d05347"}, + {file = "langsmith-0.1.129.tar.gz", hash = "sha256:6c3ba66471bef41b9f87da247cc0b493268b3f54656f73648a256a205261b6a0"}, ] [package.dependencies] @@ -2556,104 +2556,104 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( [[package]] name = "simsimd" -version = "5.4.2" +version = "5.4.3" description = "Fastest SIMD-Accelerated Vector Similarity Functions for x86 and Arm" optional = false python-versions = "*" files = [ - {file = "simsimd-5.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:66a7c5aad04748a22e872e830a3903d0c75e6cb768de3793dc35e4d882637303"}, - {file = "simsimd-5.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:122017c54782c600fe323d94d58954a742a40966780f778cefdd19d2754f72e1"}, - {file = "simsimd-5.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:abee498ec2d1e58022af112574136e9e0c96eb009d9cdba052ae5991eca1358d"}, - {file = "simsimd-5.4.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2be43ce56c6557299ae4b65fe7a8ba0b347c21cc18d2fde2e6d8601b2ac384f4"}, - {file = "simsimd-5.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97d5bf0e3e5728f0dc9d18f274d2d62451132ab007ea1f5bb0ec41f0499628b2"}, - {file = "simsimd-5.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6374c10dff1b8273f02e04be7573278e6811881e789d2b23d20f03731d62516"}, - {file = "simsimd-5.4.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:72e3f0dfde8c8b3dd8082cb418c3c73f969fd4b09913e5a22cda4eb1639a4bf7"}, - {file = "simsimd-5.4.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:657bc36805d31c536e0d3c5cf5fec86f4213ea7aea17d802a4fa39ea6ddfd4ad"}, - {file = "simsimd-5.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0163396e23b8c0d764a7847e91135bd3a06ee175d6620889cf21f44602b06d81"}, - {file = "simsimd-5.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64886dc6c28135d9304f33514cf60d9f055ceaf3cb63a70e77b9fdf283c29589"}, - {file = "simsimd-5.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4c2bcf56a16eeca463b838843ca80ea7c201cf6cd01de82b2ffbb55aa745780e"}, - {file = "simsimd-5.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f5f4d835afc06a3c6483eecead4670ff395a21cc397822130cf1689dcc93aa31"}, - {file = "simsimd-5.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5c2978807a7f8711a5c98b485243a88ba709d27f39d869305d90eb6066eae6ed"}, - {file = "simsimd-5.4.2-cp310-cp310-win32.whl", hash = "sha256:3f83fe2f9bb1ff4fac7157f3be657fa8a18aff3351fb0488e1cf2d541c79139a"}, - {file = "simsimd-5.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:d52095f31a52f4081c49e0dee43df09fb28a63d018f8a4ed68e454254c97ec8d"}, - {file = "simsimd-5.4.2-cp310-cp310-win_arm64.whl", hash = "sha256:e90ca7cce00d464ba1f045a2a70f3a6ec37b4620b1855c759f158661ca33e3b5"}, - {file = "simsimd-5.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a5a8a0767042b97e3f9e1f3dca3a42007b8b47c7936606d7239c077efd35345"}, - {file = "simsimd-5.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9084bc98f414dd0343dd2cadc878143458480cc79cbcbd47abe389455c905512"}, - {file = "simsimd-5.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:843d2ef7eaeb7ca741cf6acfe49a1854d29fd65f50b9cca37e82b8301a23d175"}, - {file = "simsimd-5.4.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:301865384756be7af15bf24f7544bbf120c381ac24a0b0b837defa1bc7f0726c"}, - {file = "simsimd-5.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00b685c51a87506e58bfa1f53d3b1d346e8e09d99dfadaf5f330672235799a39"}, - {file = "simsimd-5.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53485eac53af43b867fef7dcc9f4323a63933632fc9ed7171af2ab3aa95ea3d0"}, - {file = "simsimd-5.4.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:ade8e270ef941d4b4148371d5a5f67dc9302843dbf2c6a6e90d8d165f0dea1a1"}, - {file = "simsimd-5.4.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ed4d7b4dff94296f698de500097c87d5f8c6935b12e210d9c521b5080cac6be9"}, - {file = "simsimd-5.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:429b998a57826a7b8720088320ef5dca1346abcd43e72ce541b5cc5fbe6f4cd6"}, - {file = "simsimd-5.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f24d09407f9ada45ade23afed95294b0f0f01743b8f16cbad6f1c46d69cc15a0"}, - {file = "simsimd-5.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:525f4049618a21ed1ec775c77c6d4a261526605b4fed0f5e3832cb38e9e08fef"}, - {file = "simsimd-5.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47d5f48b1599718cb7a7968281c2c981cbad7949ca42218e74d7c3f1a9614086"}, - {file = "simsimd-5.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7b075618654fd7676b2b11493edf723c670c864f63bfbf97b2f68cabd9b01d2"}, - {file = "simsimd-5.4.2-cp311-cp311-win32.whl", hash = "sha256:9dcfe6c9d0ed020f9a886331ea52dac3874703b4790a54963661e7ddd6a7e42a"}, - {file = "simsimd-5.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e6656717cdb4c50c5ae120d01a2ffcec3175dd4bbedf0c3223c2b76c4db3f5ed"}, - {file = "simsimd-5.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:e25fd6110d977737f5a73a701eecf0a393d4d2231301d4ee8cf9223bdade02db"}, - {file = "simsimd-5.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a5e81fb7aa2965fe7758d281280728f44beced50a5f8c7fa21d0f26ffbea7ce3"}, - {file = "simsimd-5.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:62d861b019be3c3cf492926b61464954f62e76f4d6f67abeeef5c13046694e53"}, - {file = "simsimd-5.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d0e48b4d40cf54ded06a98509bec8a0ecd2574878afd807b92cce02fc2ed6640"}, - {file = "simsimd-5.4.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e42395167d7ee6e052a1ba60789ab0ca1f17eccc4f5d5cd4de7dd8777a271ad"}, - {file = "simsimd-5.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38caa7cb803d037adb16d7a1ebe91bfdf2f7d844de1b3d23a8d4c461eea98f13"}, - {file = "simsimd-5.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:048659b51556558aba3e268b4a0a523eee7b9e2c5cd6683d86d6af75ce598193"}, - {file = "simsimd-5.4.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:b25eb72e4ee9e7a51d9658ea5485afac8a6d4e00dadda61e4e275c0617d706a9"}, - {file = "simsimd-5.4.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b70b629f538388cf3817a887d9068b393952fe62b236484436324355bfd83809"}, - {file = "simsimd-5.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3039650261f196abf251ee5fa58ce9bfae6bd571d7b48c525deeba6fe3ff1385"}, - {file = "simsimd-5.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fa4adee01d5bdd64f3fbd8397a54675d8bc32a8a04c68643ae7724281fa53fab"}, - {file = "simsimd-5.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2a7469a3775e14e92db5333e13ae76df7bb84105e6d5c35274cde3f77ffe4b"}, - {file = "simsimd-5.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d75dbbddf28ee09e05d112e0f993f09fc2b8500ead7f4dbe6ca2f1ca29708f01"}, - {file = "simsimd-5.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:da4994ad65ca44e5bb2a5d9c1240021c29f86b74931c3a4bd8cc2e3a2c1908a2"}, - {file = "simsimd-5.4.2-cp312-cp312-win32.whl", hash = "sha256:9c3545fff1401abd566a40e2bee63ac59a2bfdc971b47309595435ead0037fa6"}, - {file = "simsimd-5.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:4363255646f9fc1916fd541383a27f6d02483bbfdc9f8e0a501060f258af4fb0"}, - {file = "simsimd-5.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:a099b91cd56c96437dfe03ddf9f47c2135a42a45e57f2a6aa6f571cf1f7125bd"}, - {file = "simsimd-5.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dd7d651b7f2c06772eb70d6ae8bcea37e2674f227472a6faf949e6358ec1fb0f"}, - {file = "simsimd-5.4.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1457733032b4177178caab9bc4546f6293c3e6f0fa09fb25460d606dcf2c6e15"}, - {file = "simsimd-5.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fbe6016f1f39a3a6e10d413a86ab9a02f847dba85a4902c05bc40bece2be197"}, - {file = "simsimd-5.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:591652ca3c1dc4be6916b9ca1f5783acee71663e5408327acfb7d9454954914a"}, - {file = "simsimd-5.4.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:2549a455f95cd686017ce96394b87c27ce1b07f14c22e62cf2970a1d0c8c02ae"}, - {file = "simsimd-5.4.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:08f3d084e72fecfd429ff1da796f4b80a0cf6c501f270a440c35069d3a04a7be"}, - {file = "simsimd-5.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7e586811fb00434434bd5a3378babf9a818d1704b1f4a919765ecc20be4f1d98"}, - {file = "simsimd-5.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:e5ee764939640cbc0af11055f3959a25fb95e6c57c2900f650ea81cfbbfeca4d"}, - {file = "simsimd-5.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:22f7d140c74d0a28db8e369ff3d9a1334d04500bbea5b0a826b91450dd521ec0"}, - {file = "simsimd-5.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:d68d392c6482039ce4d25c0352532749c5d7b5bbfaa847f98baa023308728140"}, - {file = "simsimd-5.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0256d95bb6ffa01e4c200752cfc7f48ba52a22e4d0b655aa88d5ab79d1860c79"}, - {file = "simsimd-5.4.2-cp37-cp37m-win32.whl", hash = "sha256:c63195c2f8551e0aa599959ce119bd29947f561bb98569889ee08eb084bd5a30"}, - {file = "simsimd-5.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:77e13e55ae7e9a7e9dc16fd85a4ce5c48543681dd382a38ec3691f186894dc3d"}, - {file = "simsimd-5.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4833ca6bfd3fe6625e02279d76788850521d2bc3985b4a686cf80a073a3385d8"}, - {file = "simsimd-5.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84df304e7da94428af75f53970b99f55987660d38ddcd55a48422f73e2c82f04"}, - {file = "simsimd-5.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:203e0dd865e241e8bb9bb3fb54ea7389ec789fc2c8c6498b55acfa43ac976df2"}, - {file = "simsimd-5.4.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96969b2e04bf35b04cb865c9aaa3ce71193169b6b291a49f9db75a5736ec17d8"}, - {file = "simsimd-5.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18012060bea0e4920842d67af4505ae6f9c7712ea8401b058befe17006441661"}, - {file = "simsimd-5.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dca1a480f68083fc91ce7e75a2cd8881b7da475484451db31c2cc74423cef73f"}, - {file = "simsimd-5.4.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2affda3fa0344579b0b6f745b87b13ffd6eb6292fb498ec07bb9055cf06216e9"}, - {file = "simsimd-5.4.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aee9c2bc6c4dce1e5a500aece59b5aa619c34236e9f77773100056cf8506eff6"}, - {file = "simsimd-5.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:cf4ec869f7518f2a0dd8d50b0d4307962c1f6ae3f361f6ffdc2f475d18afd57e"}, - {file = "simsimd-5.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a0433ffa2fa10389198924c242dff2c267fad33a6670151aaa8280d94af3db16"}, - {file = "simsimd-5.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0142ae015a7dbb4902282ba0fc5e72be147d6ea3fa9fed2672e44c6ff00511f7"}, - {file = "simsimd-5.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:273b858d167d3190ec4d35f3d151e0dee2b5a242ccb385693ca949ee899b6c62"}, - {file = "simsimd-5.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:292d5e2ca077413a58f5cc31e96e5533f001c5df73468712abe31ad5ddac163a"}, - {file = "simsimd-5.4.2-cp38-cp38-win32.whl", hash = "sha256:3a53a30e814e11cb5cf802695c6ea1e25629dacf1f7d453681943176386c69b7"}, - {file = "simsimd-5.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:20c3d90d2c417145d0953ee1cc2f015e514fad198fcf500d3351984d479e25c0"}, - {file = "simsimd-5.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1a94a17bd8cd18ffd611125ab8a42b8c0cc7ebd18d16a651d096a683a2f40818"}, - {file = "simsimd-5.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4577b8d7b746536752297fba97116f74da23be3b52b7a955846c2d6ec7aaea51"}, - {file = "simsimd-5.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34ae1cde6644caba81ceaed8ae429ee470fef39fc9b6be2cfffb8ea0e1092b20"}, - {file = "simsimd-5.4.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70647c3ff8f24682c0211fc0b88d9fb3a2a7f4a193cd44975d87c215b8f11f34"}, - {file = "simsimd-5.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ef37e04858e3dca6d92ff8e27767c5299d634ee91af1e765382d98fe86c54c0"}, - {file = "simsimd-5.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbef168a7362b46aa972e9f7b33ad120d9eb637291f7cb971e30374fdc92f0e1"}, - {file = "simsimd-5.4.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:5f1222baa12b44604ece0febf3adacd279f2866f13751cb0c56d23abf3cc279a"}, - {file = "simsimd-5.4.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:dfab8bea75f6cc5717131723c13b727f2d70cb0f8268bf0217e8835b720debd6"}, - {file = "simsimd-5.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0fc362bddd831ab2adebee47ea882a170b3b1275bb462ae68329caea0609255b"}, - {file = "simsimd-5.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:298ccf4ff37e6fc43201245657d65470098694835771d126322ab671f479a54f"}, - {file = "simsimd-5.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6f3a5c87f10dd2cc858df4c6dbff0b27905547e05e96944fa4d960cebfbc1e2b"}, - {file = "simsimd-5.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:482eb8e6839eba91819f24f1759c5d604fe8b7e0eed576ef99fb1efce7e9675f"}, - {file = "simsimd-5.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f811d03685b177d8054e20a3a7ba4e9c714ab6eb0c956d9d56cad78e4c2c14dc"}, - {file = "simsimd-5.4.2-cp39-cp39-win32.whl", hash = "sha256:daac1a76a6c85cfd837510f79c6dbee62d5bc1f448a013a9b4937d6a66fe1cd1"}, - {file = "simsimd-5.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:bdb92fa486c735cbd7eb6074e0c529cd2665898db9ee70d4801e0581a937febe"}, - {file = "simsimd-5.4.2-cp39-cp39-win_arm64.whl", hash = "sha256:a7b8afe88c1cc8a06b61932126c0aee1af82d0de45a13135e40a9f406d5a909f"}, - {file = "simsimd-5.4.2.tar.gz", hash = "sha256:86ef77a237f47bddbdd8e89b36a8096fad461197d6f7ba20602a863191196542"}, + {file = "simsimd-5.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:83baefb29993842e6877f1df11d70d8524ab0da2a50214c9e804279b3a82330e"}, + {file = "simsimd-5.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:deacf8310437e18d83d5fc1e6b0212060f65d1a76f6941978637724ac0b4195e"}, + {file = "simsimd-5.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a369099fef78322e2ff11cff127d91e0a1a406807f1c68d5354cf53b22a5693a"}, + {file = "simsimd-5.4.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0881ce6f96c118567cf110648e93380c1046551be0603634aa31a6e80e28365a"}, + {file = "simsimd-5.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96ba2e86a1904d2fdc63a60c19054d65fecf753f0464311be3aa5de06dea99f1"}, + {file = "simsimd-5.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:434e0a35d7e9485c058faf15a99c8ff108ccae94c4d7831be9aaf772cc2d6e8a"}, + {file = "simsimd-5.4.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:f9460bafcef2d6c484f9971fbcdefa0eed60db3c5f41631ca6125518e0aabd66"}, + {file = "simsimd-5.4.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a068f6d30143262646d31f6e7573acf89601ca9f3583a9e4bca2d732057481d9"}, + {file = "simsimd-5.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5ca7b165ee928acb19ff129b6d3776a2cb983e31d62fb5480a209e1aa45065be"}, + {file = "simsimd-5.4.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:269c7d32ce9bbc8f99dc63ef1c87faf4d454cbf4aa569d77a4dbbb8fc4542bfb"}, + {file = "simsimd-5.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9bc53af558a7a33046091275e760f16421963870b779be1e243bf192793bf63"}, + {file = "simsimd-5.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d6f5e2f53f932e7ddf5a81aeb6bcbb5e8f7a3b46dc0cd5de6c91265859100f54"}, + {file = "simsimd-5.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4dc2736276a5ada456a052828e7e4ba4db9bfb6dfb7c9b16ba5f33160876377"}, + {file = "simsimd-5.4.3-cp310-cp310-win32.whl", hash = "sha256:fc2c8b1f92d9ab0a73a57282eea3fd8dac79f50517ac76d81a4646e9037b1ffa"}, + {file = "simsimd-5.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:d744be6222edd143d777b40fa55de23889c281ae505a3c8d650a19e4266c0518"}, + {file = "simsimd-5.4.3-cp310-cp310-win_arm64.whl", hash = "sha256:804f37fd965115cd0a960551c305f68d8fada6bb27b33a67038306bae6d3bc6a"}, + {file = "simsimd-5.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:32f6d6336c1cca6129ea7907d64f4fb91eab64fce8bdfa224098003953801ab5"}, + {file = "simsimd-5.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:470aa4fbc03d49a6f021985f0bc18a772f9a55f44cb1328052dbbd027412db1e"}, + {file = "simsimd-5.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:01d4c36f38f925555a1b85b16aa688b69d5df7a8be91b6c81ea1675486cf8242"}, + {file = "simsimd-5.4.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b8130b4d82c2eb02c40a05f00e277a5dca290332777a3b011cb9adc6512439"}, + {file = "simsimd-5.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd05002f204da0f25d1e5b0c5e3dfa550a8742c272b09db8ecf7799ec21d67d"}, + {file = "simsimd-5.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d674cd79d64e87fa772693275c49ce38f9893bf0b4d9fb08e45952ae54ba707b"}, + {file = "simsimd-5.4.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c7d00820f4dfca80eb86cd3c70997bf6590f54557a92bee7ff868844a88376e3"}, + {file = "simsimd-5.4.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e960d14f77818e18f7629258f8debd08b5ad3cd62dab2ae53fb5ff5b54f7c08c"}, + {file = "simsimd-5.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f8af17e36af232014286c854473ad78758616ed7bcb7cf5a5762b8a5b1b074e5"}, + {file = "simsimd-5.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:436a17bd78372e86f7d01ecfff16f75c573a44f1037b5e4199f7a2ecc1a31de9"}, + {file = "simsimd-5.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:75f8f0fd937c2935e96da41fe4380f3705e1eec0f3433a643ac9384ed689eb9c"}, + {file = "simsimd-5.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1c098aa69fd29a53a350a5a06e0da7ff25258bc76d0deccdf87ba3c862e35fe0"}, + {file = "simsimd-5.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bbdb970f64cce2496c7bc54463610c9ddaa43615aa73b6fb1bc1f0df5863565"}, + {file = "simsimd-5.4.3-cp311-cp311-win32.whl", hash = "sha256:aa58035f67b2c7083cc05a4c49b06b57a0aa15dfbb9608ed1e83ab59b965768f"}, + {file = "simsimd-5.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:de14931d37087ccfbd1cc6321ad22ce76fef51fc75c98264ff2537170062d361"}, + {file = "simsimd-5.4.3-cp311-cp311-win_arm64.whl", hash = "sha256:d5474b49d97546b55940c27fcd63fce159f5f939cc53983f91bae56cea34dd52"}, + {file = "simsimd-5.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31b1fd618dab62c49cca99fd78e4876b511273ead272584b34aeaca5e5ded532"}, + {file = "simsimd-5.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:43487d7f9756d5f8de6f778910b0fd8aa236716612ccd3afe50e8d8c50f1c20b"}, + {file = "simsimd-5.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ccd196db72fd716664441c6c0f3077f5d0d5ae6c15454a39c23b7fd729fae5d0"}, + {file = "simsimd-5.4.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ea3e3dcb0471d9fb2dd8d09a84826e859d84f55fc01ec0b89df4c7b9bc67d96"}, + {file = "simsimd-5.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db4b4fb06397d9689e2fab06b822a6432b85da99c92e060836b532ad94be0dea"}, + {file = "simsimd-5.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:576ebb0bcfeca4086d12925ab3130167ea2b89021d19c09f9b14cccc0e22c739"}, + {file = "simsimd-5.4.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:87c6bffa7275e250ac2d4605cccb66b0652ad033b734d2a7539eabc3eedbd882"}, + {file = "simsimd-5.4.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b48ab95d9a4bc8fd9ce9ce137b36e125e64a114fdd352f2f7a057e92dfbe4571"}, + {file = "simsimd-5.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f10dca118c1e7a9a89ccf32eb76f8eb09eb963817ee8817379e73ac1c11d55b3"}, + {file = "simsimd-5.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba1472565cb786a4f537877fb15cdaaac139369d6eda14d4bfce6f4cf794b72"}, + {file = "simsimd-5.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ef92e699883da0f42b2513f4e923480516595a8da883aeae90980c02d8c40958"}, + {file = "simsimd-5.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:adc121c840b306a9b84506a02b00dab8f1e3db152b38fb1f72e5796be7d977b2"}, + {file = "simsimd-5.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04381217e516e597ebc9d68e37341e2b32677d8de847041e94654834ec6fc366"}, + {file = "simsimd-5.4.3-cp312-cp312-win32.whl", hash = "sha256:b087189a27f925f348b40c34b7e11aaae9161e764a6376614620fb993f41d9fd"}, + {file = "simsimd-5.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:f409ce2dc0b6bac7240432b6e7d7f44c9234a60bf7369bced16d2275dcb8afa1"}, + {file = "simsimd-5.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:77cfe8260aa86a1fb27f884dc13d1ebb25e423a470e71020ea2037ea8d54c14d"}, + {file = "simsimd-5.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38d21af2860d2effb8bb1af344ca64645ec3e2251497b79a2c80ea5582ae6983"}, + {file = "simsimd-5.4.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ee8e2ef9856e10e36fda82d13275870bd2d73c0a67f90a3120ecfb03c5448ba"}, + {file = "simsimd-5.4.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3f7b6abe31ebdc7044787db91cf3deb8c9612620895af95474cc8a1f146e071"}, + {file = "simsimd-5.4.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4ec0e3df45f5c130fe92e4df91ded84ffc251f8fa802c62ffdbeef46a8d9a17"}, + {file = "simsimd-5.4.3-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:186a5f4bece780a3c6a161867548b35317c20247e5a07cacd33df7254d2baab9"}, + {file = "simsimd-5.4.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:82aea3431f2fc025148ed776c290f5b88a16a5c5c857b92a2a9d44e35097b811"}, + {file = "simsimd-5.4.3-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:698b62fd3dddd54e05dcb4989d3805cfa22f8112260855f6dcfd8a9272a938d9"}, + {file = "simsimd-5.4.3-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:2f1b19db892fcc3ef3fd21e474a819e63f6f1ac5ba3fb916d0776f5cbdae4b16"}, + {file = "simsimd-5.4.3-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:b24ab704c3aaac0fe1538b4fac69b3402847206d6735b5d9d476549712c65ec3"}, + {file = "simsimd-5.4.3-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2592574bfa52a5e951568927a518ab873d6e1328c27cbddc8cf656f9d2ac4079"}, + {file = "simsimd-5.4.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:8b7e9495aa97f28f0ac727d23bd469c756583cc9b3288c8673170c83ea2e4195"}, + {file = "simsimd-5.4.3-cp37-cp37m-win32.whl", hash = "sha256:f4a5fff030bf1528e3667b257f477a6a8f4e098372b89b24b6e12b7cca863a39"}, + {file = "simsimd-5.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:57eab9d511b72ebf3f86f9d639d54a8876a1794047621e1b64adaeb4e5f24d10"}, + {file = "simsimd-5.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:82487401d13f08553a0bf5206a723779530581d4e7801fe7091a53389581d36f"}, + {file = "simsimd-5.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a57e07fb8c67339c4e34ae760d998e75876952fcada803250772c974b9cd54bc"}, + {file = "simsimd-5.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:433c6fcb8fdcfba3c7c81e568e32335768b0f0cae9b5f4aa8805e621ab6ac871"}, + {file = "simsimd-5.4.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1289252bd2be60fe1d030d33eb3b73459efb34cdd63685e04c37c5e3e963d4a"}, + {file = "simsimd-5.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83e58500f5b4eb1e182054c94a91872bf69471bc963355ab13e7f7d5a3d36ae"}, + {file = "simsimd-5.4.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95970e5a268eee6eacb9220ed19d60aa8e1751d01af1e76adf0bf614ec58962d"}, + {file = "simsimd-5.4.3-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0c334a0ded63acf1aa0a9ea720cae9a186c81eb5354c4b2b09ed57d8cc652215"}, + {file = "simsimd-5.4.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:29f0a8a8cc3a867dbeab39203572077db23d338fb01fd48ac8e6c48ab3bf8b38"}, + {file = "simsimd-5.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ac7c0fb5b70e5fdd13a6b2d08477f302674af7ae53c627e0413273d9afe5a245"}, + {file = "simsimd-5.4.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:8d9688a122c8dcb8e22f27676a76377625e3a3b607a2172559cb0d85453364d9"}, + {file = "simsimd-5.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:aeb450216526ca05d200f7cc59147233f039e24afbc42ab805adb9e540de9852"}, + {file = "simsimd-5.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:8209f3c1583a3ce1a6503d389383476a51bfe8990ecf81d7d679276d52eb40d4"}, + {file = "simsimd-5.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a03e984b0941b7555c0f62968b5d5e7b8132bffbb17b6dfb7219876cd95fc6c4"}, + {file = "simsimd-5.4.3-cp38-cp38-win32.whl", hash = "sha256:24c5be9c34d85a8e728e2e322884dc39169fddbbccbe47e970a3c2b872d1efee"}, + {file = "simsimd-5.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:7d751d4f85a9c3ab6d62b417c5aa6e5972ca6e13425658a01f14632b916d2327"}, + {file = "simsimd-5.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ba4ec918b19c578e1039266e1b3fc5792fce3e3e64c8a3afc6cef11c6f6abe4c"}, + {file = "simsimd-5.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37b1f392bbe0fecfb9da301ff36dd0b7915e244b2433e822216171d5ee9b53f8"}, + {file = "simsimd-5.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ac97eb8a2ba3771e905a28bffb5894516d15b775af22d8b9b55eae3fe3d6673e"}, + {file = "simsimd-5.4.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6ac311333239d03b7b6726ebba8025a409ecb7e0eca9301f967fb88c9ec1055"}, + {file = "simsimd-5.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44de5372968851de5c972faab9574a9667312dfedc69c626bd47dc1a0d730bf3"}, + {file = "simsimd-5.4.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64bab8107a19ac05067a143039cc03c14b4bd9ee95973fc7f7bae7e34e857eff"}, + {file = "simsimd-5.4.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:31f11b649448fb68061b0ff131c93215940b6dff24357ec9763abe80406db133"}, + {file = "simsimd-5.4.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:9d6ad1ed348779a07410b37baa0057dbc402c6d5785f86ad8a784cec6c642f36"}, + {file = "simsimd-5.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b848f4f7da3c2d9fc654dd4815b7be99161c954d88af4f948f65f6df3c671671"}, + {file = "simsimd-5.4.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:44c731383c92cb165b907fd88c2c3f6b5a13102358cae4eb881950b4faf2f207"}, + {file = "simsimd-5.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:adc0b4df3e2739590f1e8e4d2cc12fedb57e8d015430dd6014e7fe5aab0c4bdd"}, + {file = "simsimd-5.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ffaef86f0c7d93e40d19773d3c1c23a5facc68ea1e094db98a6541458cb49aef"}, + {file = "simsimd-5.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d4774e00d72babac1f7685b9b0e2ff721da312301e8656687e89071d7e4d4b8b"}, + {file = "simsimd-5.4.3-cp39-cp39-win32.whl", hash = "sha256:d582b3eff101cc8e920407ef08c97e34e1738e829bc58816c0d402bcb5674183"}, + {file = "simsimd-5.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:777809b143ec9f3ff18bd20eb140367a62717c948b907846f9389e6ae3d1b88c"}, + {file = "simsimd-5.4.3-cp39-cp39-win_arm64.whl", hash = "sha256:0637cfb2e99f3d8b78eb3d84d3a63b47a413a3a1702314d74ed28b861b0c0e7c"}, + {file = "simsimd-5.4.3.tar.gz", hash = "sha256:dc75ae8bc0bff160439f669eb664cf47cc24d1a450c93b6bb53d8eee68794956"}, ] [[package]] @@ -2778,13 +2778,13 @@ test = ["pytest", "ruff"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -2927,41 +2927,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "5.0.2" +version = "5.0.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index 037a3697f26..11a2e85aa37 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-core" -version = "0.3.7" +version = "0.3.8" description = "Building applications with LLMs through composability" authors = [] license = "MIT" From 907c758d67764385828c8abad14a3e64cf44d05b Mon Sep 17 00:00:00 2001 From: Vadym Barda Date: Wed, 2 Oct 2024 23:02:44 -0400 Subject: [PATCH 10/62] docs[patch]: add long-term memory agent tutorial (#27057) --- .../conversation_buffer_memory.ipynb | 4 +- docs/docs/versions/migrating_memory/index.mdx | 6 +- .../long_term_memory_agent.ipynb | 1082 +++++++++++++++++ 3 files changed, 1087 insertions(+), 5 deletions(-) create mode 100644 docs/docs/versions/migrating_memory/long_term_memory_agent.ipynb diff --git a/docs/docs/versions/migrating_memory/conversation_buffer_memory.ipynb b/docs/docs/versions/migrating_memory/conversation_buffer_memory.ipynb index 56b8fb28201..aa5d7e37c8b 100644 --- a/docs/docs/versions/migrating_memory/conversation_buffer_memory.ipynb +++ b/docs/docs/versions/migrating_memory/conversation_buffer_memory.ipynb @@ -268,7 +268,7 @@ "Please refer to the following [migration guide](/docs/versions/migrating_chains/conversation_chain/) for more information.\n", "\n", "\n", - "## Usasge with a pre-built agent\n", + "## Usage with a pre-built agent\n", "\n", "This example shows usage of an Agent Executor with a pre-built agent constructed using the [create_tool_calling_agent](https://python.langchain.com/api_reference/langchain/agents/langchain.agents.tool_calling_agent.base.create_tool_calling_agent.html) function.\n", "\n", @@ -546,7 +546,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.12.3" } }, "nbformat": 4, diff --git a/docs/docs/versions/migrating_memory/index.mdx b/docs/docs/versions/migrating_memory/index.mdx index 800de108629..fbd7cd6d3e5 100644 --- a/docs/docs/versions/migrating_memory/index.mdx +++ b/docs/docs/versions/migrating_memory/index.mdx @@ -85,12 +85,12 @@ Memory classes that fall into this category include: | `ConversationTokenBufferMemory` | [Link to Migration Guide](conversation_buffer_window_memory) | Keeps only the most recent messages in the conversation under the constraint that the total number of tokens in the conversation does not exceed a certain limit. | | `ConversationSummaryMemory` | [Link to Migration Guide](conversation_summary_memory) | Continually summarizes the conversation history. The summary is updated after each conversation turn. The abstraction returns the summary of the conversation history. | | `ConversationSummaryBufferMemory` | [Link to Migration Guide](conversation_summary_memory) | Provides a running summary of the conversation together with the most recent messages in the conversation under the constraint that the total number of tokens in the conversation does not exceed a certain limit. | -| `VectorStoreRetrieverMemory` | See related [long-term memory agent tutorial](https://langchain-ai.github.io/langgraph/tutorials/memory/long_term_memory_agent/) | Stores the conversation history in a vector store and retrieves the most relevant parts of past conversation based on the input. | +| `VectorStoreRetrieverMemory` | See related [long-term memory agent tutorial](long_term_memory_agent) | Stores the conversation history in a vector store and retrieves the most relevant parts of past conversation based on the input. | ### 2. Extraction of structured information from the conversation history -Please see [long-term memory agent tutorial](https://langchain-ai.github.io/langgraph/tutorials/memory/long_term_memory_agent/) implements an agent that can extract structured information from the conversation history. +Please see [long-term memory agent tutorial](long_term_memory_agent) implements an agent that can extract structured information from the conversation history. Memory classes that fall into this category include: @@ -114,7 +114,7 @@ abstractions are not as widely used as the conversation history management abstr For this reason, there are no migration guides for these abstractions. If you're struggling to migrate an application that relies on these abstractions, please: -1) Please review this [Long-term memory agent tutorial](https://langchain-ai.github.io/langgraph/tutorials/memory/long_term_memory_agent/) which should provide a good starting point for how to extract structured information from the conversation history. +1) Please review this [Long-term memory agent tutorial](long_term_memory_agent) which should provide a good starting point for how to extract structured information from the conversation history. 2) If you're still struggling, please open an issue on the LangChain GitHub repository, explain your use case, and we'll try to provide more guidance on how to migrate these abstractions. The general strategy for extracting structured information from the conversation history is to use a chat model with tool calling capabilities to extract structured information from the conversation history. diff --git a/docs/docs/versions/migrating_memory/long_term_memory_agent.ipynb b/docs/docs/versions/migrating_memory/long_term_memory_agent.ipynb new file mode 100644 index 00000000000..8ab6f7be5fc --- /dev/null +++ b/docs/docs/versions/migrating_memory/long_term_memory_agent.ipynb @@ -0,0 +1,1082 @@ +{ + "cells": [ + { + "attachments": { + "a2b70d8c-dd71-41d0-9c6d-d3ed922c29cc.png": { + "image/png": "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CZAACZAACfQ5AQpYfY6UBZIACZAACZAACZAACZDA0CTguA+WlpbKH//4B3MdnDZ12tDsDFtNAiRAAiQwrAhQwBpWw8nOkAAJkAAJkAAJkAAJkMCBEXDcB3H3xg0brJBTTzlV8gsKpDlI98EDo8q7SIAESIAE+ooABay+IslySIAESIAESIAESIAESGCIE4AFVrPGunr/g/etJzNmzhSf163ugyG6Dw7xsWXzSYAESGCoE6CANdRHkO0nARIgARIgARIgARIggT4i4HLFSV1dnby0YIGVOHHiJDty98E+AsxiSIAESIAEDpgABawDRscbSYAESIAESIAESIAESGD4EID1lf4vFRXlsmDBi3L2OedIYWGh6IaEtL4aPsPMnpAACZDAkCVAAWvIDh0bTgIkQAIkQAIkQAIkQAJ9Q8DiX4mqV5q2bdtmx2OOmSuZmZnS1BQU7EzIRAIkQAIkQAKDSYA/iQaTPusmARIgARIgARIgARIggRghEKfug6FQi6xYscJaNHHCRHHraiEUYvyrGBkiNoMESIAERjQBClgjevjZeRIgARIgARIgARIgARKIEIALYSAQkMWLF9mJ0YWjiYYESIAESIAEYoYABayYGQo2hARIgARIgARIgARIgAQGh4AT/6q2tlbuvecemTp1qhQURAQsXGMiARIgARIggcEmQAFrsEeA9ZMACZAACZAACZAACZDAIBJosTDtCNQuUllZYS352EknSVZWlgTVpZAC1iAODqsmARIgARJoI0ABqw0FP5AACZAACZAACZAACZDACCQQ2WbQOr5rV7Edx4+fIPEJ8Yx/NQKnA7tMAiRAArFKgAJWrI4M20UCJEACJEACJEACJEACA0QAToItKmRt3x7ZgbCoqEjcejIcDtMCa4DGgNWQAAmQAAl0T4ACVvd8eJUESIAESIAESIAESIAEhj0BuAkGgyHZsGGD9XXUqFF2bIGqxUQCJEACJEACMUCAAlYMDAKbQAIkQAIkQAIkQAIkQAKDSQACVmNjoyxfvsyakZOTM5jNYd0kQAIkQAIksA8BClj7IOEJEiABEiABEiABEiABEhg5BCBeIYB7Q0O9PPnEEzJ//nzJyMi00O4M4D5y5gF7SgIkQAKxToACVqyPENtHAiRAAiRAAiRAAiRAAv1MAALWnj1VVsvEiZMkPj5e419hZ0JEx2IiARIgARIg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BCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQCEIAABCAAAQhAAAIQgAAEIAABCECgFAEErFJUyIMABCAAAQhAAAIQgAAEIAABCEAAAhCoGAIIWBUzFDQEAhCAAAQgAAEIQAACEIAABCAAAQhAoBQBBKxSVMiDAAQgAAEIQAACEIAABCAAAQhAAAIQqBgCCFgVMxQ0BAIQgAAEIAABCEAAAhCAAAQgAAEIQKAUAQSsUlTIgwAEIAABCEAAAhCAAAQgAAEIQAACEKgYAghYFTMUNAQC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" + } + }, + "cell_type": "markdown", + "id": "8cbdb316-6af5-480f-a9c7-09f116f86273", + "metadata": {}, + "source": [ + "# A Long-Term Memory Agent\n", + "\n", + "This tutorial shows how to implement an agent with long-term memory capabilities using LangGraph. The agent can store, retrieve, and use memories to enhance its interactions with users.\n", + "\n", + "Inspired by papers like [MemGPT](https://memgpt.ai/) and distilled from our own works on long-term memory, the graph extracts memories from chat interactions and persists them to a database. \"Memory\" in this tutorial will be represented in two ways: \n", + "* a piece of text information that is generated by the agent\n", + "* structured information about entities extracted by the agent in the shape of `(subject, predicate, object)` knowledge triples.\n", + "\n", + "This information can later be read or queried semantically to provide personalized context when your bot is responding to a particular user.\n", + "\n", + "The KEY idea is that by saving memories, the agent persists information about users that is SHARED across multiple conversations (threads), which is different from memory of a single conversation that is already enabled by LangGraph's [persistence](https://langchain-ai.github.io/langgraph/concepts/persistence/).\n", + "\n", + "![memory_graph.png](attachment:a2b70d8c-dd71-41d0-9c6d-d3ed922c29cc.png)\n", + "\n", + "You can also check out a full implementation of this agent in [this repo](https://github.com/langchain-ai/lang-memgpt)." + ] + }, + { + "cell_type": "markdown", + "id": "2a45f864-b4bd-4355-bddd-83921db2528b", + "metadata": {}, + "source": [ + "## Install dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d6cfbeeb-3dbb-4020-8f50-2a69e78bb5c0", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -U --quiet langgraph langchain-openai langchain-community tiktoken" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9c5ed37d-8670-4f5a-b830-1c1c3991d7cf", + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "OPENAI_API_KEY: ········\n", + "TAVILY_API_KEY: ········\n" + ] + } + ], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "\n", + "def _set_env(var: str):\n", + " if not os.environ.get(var):\n", + " os.environ[var] = getpass.getpass(f\"{var}: \")\n", + "\n", + "\n", + "_set_env(\"OPENAI_API_KEY\")\n", + "_set_env(\"TAVILY_API_KEY\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "dab4e96a-8a90-4df9-8818-5a6edf5805d7", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "from typing import List, Literal, Optional\n", + "\n", + "import tiktoken\n", + "from langchain_community.tools.tavily_search import TavilySearchResults\n", + "from langchain_core.documents import Document\n", + "from langchain_core.embeddings import Embeddings\n", + "from langchain_core.messages import get_buffer_string\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.runnables import RunnableConfig\n", + "from langchain_core.tools import tool\n", + "from langchain_core.vectorstores import InMemoryVectorStore\n", + "from langchain_openai import ChatOpenAI\n", + "from langchain_openai.embeddings import OpenAIEmbeddings\n", + "from langgraph.checkpoint.memory import MemorySaver\n", + "from langgraph.graph import END, START, MessagesState, StateGraph\n", + "from langgraph.prebuilt import ToolNode" + ] + }, + { + "cell_type": "markdown", + "id": "e032423c-f7d8-4ee1-8313-bf49a6129d44", + "metadata": {}, + "source": [ + "## Define vectorstore for memories" + ] + }, + { + "cell_type": "markdown", + "id": "7d4ccb43-bf32-4a1d-89ae-22826adbe860", + "metadata": {}, + "source": [ + "First, let's define the vectorstore where we will be storing our memories. Memories will be stored as embeddings and later looked up based on the conversation context. We will be using an in-memory vectorstore." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "77b45742-a1ec-43b1-9df0-4df70c03c762", + "metadata": {}, + "outputs": [], + "source": [ + "recall_vector_store = InMemoryVectorStore(OpenAIEmbeddings())" + ] + }, + { + "cell_type": "markdown", + "id": "6338ccb4-2810-4f7a-9592-27a23c263d6f", + "metadata": {}, + "source": [ + "### Define tools" + ] + }, + { + "cell_type": "markdown", + "id": "b084b78f-639f-4caf-869b-7fcb93dae813", + "metadata": {}, + "source": [ + "Next, let's define our memory tools. We will need a tool to store the memories and another tool to search them to find the most relevant memory." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a1d29985-7276-4a93-80b6-dc7217e57a0e", + "metadata": {}, + "outputs": [], + "source": [ + "import uuid\n", + "\n", + "\n", + "def get_user_id(config: RunnableConfig) -> str:\n", + " user_id = config[\"configurable\"].get(\"user_id\")\n", + " if user_id is None:\n", + " raise ValueError(\"User ID needs to be provided to save a memory.\")\n", + "\n", + " return user_id\n", + "\n", + "\n", + "@tool\n", + "def save_recall_memory(memory: str, config: RunnableConfig) -> str:\n", + " \"\"\"Save memory to vectorstore for later semantic retrieval.\"\"\"\n", + " user_id = get_user_id(config)\n", + " document = Document(\n", + " page_content=memory, id=str(uuid.uuid4()), metadata={\"user_id\": user_id}\n", + " )\n", + " recall_vector_store.add_documents([document])\n", + " return memory\n", + "\n", + "\n", + "@tool\n", + "def search_recall_memories(query: str, config: RunnableConfig) -> List[str]:\n", + " \"\"\"Search for relevant memories.\"\"\"\n", + " user_id = get_user_id(config)\n", + "\n", + " def _filter_function(doc: Document) -> bool:\n", + " return doc.metadata.get(\"user_id\") == user_id\n", + "\n", + " documents = recall_vector_store.similarity_search(\n", + " query, k=3, filter=_filter_function\n", + " )\n", + " return [document.page_content for document in documents]" + ] + }, + { + "cell_type": "markdown", + "id": "b19a1a9f-e5ab-4d4a-9571-d8ac29420e09", + "metadata": {}, + "source": [ + "Additionally, let's give our agent ability to search the web using [Tavily](https://tavily.com/)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f41baaf4-b71a-47a9-8c38-fbc604d932ee", + "metadata": {}, + "outputs": [], + "source": [ + "search = TavilySearchResults(max_results=1)\n", + "tools = [save_recall_memory, search_recall_memories, search]" + ] + }, + { + "cell_type": "markdown", + "id": "853242a2-6ae1-4427-9f31-6041cb72833d", + "metadata": {}, + "source": [ + "### Define state, nodes and edges" + ] + }, + { + "cell_type": "markdown", + "id": "0038574b-738a-4ace-b620-60eca665e5a5", + "metadata": {}, + "source": [ + "Our graph state will contain just two channels -- `messages` for keeping track of the chat history and `recall_memories` -- contextual memories that will be pulled in before calling the agent and passed to the agent's system prompt." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0767095b-7d17-4c18-afeb-ed6ec74d215f", + "metadata": {}, + "outputs": [], + "source": [ + "class State(MessagesState):\n", + " # add memories that will be retrieved based on the conversation context\n", + " recall_memories: List[str]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "64144945-b7d9-4202-a567-bc1a48d7e5b8", + "metadata": {}, + "outputs": [], + "source": [ + "# Define the prompt template for the agent\n", + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"You are a helpful assistant with advanced long-term memory\"\n", + " \" capabilities. Powered by a stateless LLM, you must rely on\"\n", + " \" external memory to store information between conversations.\"\n", + " \" Utilize the available memory tools to store and retrieve\"\n", + " \" important details that will help you better attend to the user's\"\n", + " \" needs and understand their context.\\n\\n\"\n", + " \"Memory Usage Guidelines:\\n\"\n", + " \"1. Actively use memory tools (save_core_memory, save_recall_memory)\"\n", + " \" to build a comprehensive understanding of the user.\\n\"\n", + " \"2. Make informed suppositions and extrapolations based on stored\"\n", + " \" memories.\\n\"\n", + " \"3. Regularly reflect on past interactions to identify patterns and\"\n", + " \" preferences.\\n\"\n", + " \"4. Update your mental model of the user with each new piece of\"\n", + " \" information.\\n\"\n", + " \"5. Cross-reference new information with existing memories for\"\n", + " \" consistency.\\n\"\n", + " \"6. Prioritize storing emotional context and personal values\"\n", + " \" alongside facts.\\n\"\n", + " \"7. Use memory to anticipate needs and tailor responses to the\"\n", + " \" user's style.\\n\"\n", + " \"8. Recognize and acknowledge changes in the user's situation or\"\n", + " \" perspectives over time.\\n\"\n", + " \"9. Leverage memories to provide personalized examples and\"\n", + " \" analogies.\\n\"\n", + " \"10. Recall past challenges or successes to inform current\"\n", + " \" problem-solving.\\n\\n\"\n", + " \"## Recall Memories\\n\"\n", + " \"Recall memories are contextually retrieved based on the current\"\n", + " \" conversation:\\n{recall_memories}\\n\\n\"\n", + " \"## Instructions\\n\"\n", + " \"Engage with the user naturally, as a trusted colleague or friend.\"\n", + " \" There's no need to explicitly mention your memory capabilities.\"\n", + " \" Instead, seamlessly incorporate your understanding of the user\"\n", + " \" into your responses. Be attentive to subtle cues and underlying\"\n", + " \" emotions. Adapt your communication style to match the user's\"\n", + " \" preferences and current emotional state. Use tools to persist\"\n", + " \" information you want to retain in the next conversation. If you\"\n", + " \" do call tools, all text preceding the tool call is an internal\"\n", + " \" message. Respond AFTER calling the tool, once you have\"\n", + " \" confirmation that the tool completed successfully.\\n\\n\",\n", + " ),\n", + " (\"placeholder\", \"{messages}\"),\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "09b37846-11c7-4f79-af53-69584969ab16", + "metadata": {}, + "outputs": [], + "source": [ + "model = ChatOpenAI(model_name=\"gpt-4o\")\n", + "model_with_tools = model.bind_tools(tools)\n", + "\n", + "tokenizer = tiktoken.encoding_for_model(\"gpt-4o\")\n", + "\n", + "\n", + "def agent(state: State) -> State:\n", + " \"\"\"Process the current state and generate a response using the LLM.\n", + "\n", + " Args:\n", + " state (schemas.State): The current state of the conversation.\n", + "\n", + " Returns:\n", + " schemas.State: The updated state with the agent's response.\n", + " \"\"\"\n", + " bound = prompt | model_with_tools\n", + " recall_str = (\n", + " \"\\n\" + \"\\n\".join(state[\"recall_memories\"]) + \"\\n\"\n", + " )\n", + " prediction = bound.invoke(\n", + " {\n", + " \"messages\": state[\"messages\"],\n", + " \"recall_memories\": recall_str,\n", + " }\n", + " )\n", + " return {\n", + " \"messages\": [prediction],\n", + " }\n", + "\n", + "\n", + "def load_memories(state: State, config: RunnableConfig) -> State:\n", + " \"\"\"Load memories for the current conversation.\n", + "\n", + " Args:\n", + " state (schemas.State): The current state of the conversation.\n", + " config (RunnableConfig): The runtime configuration for the agent.\n", + "\n", + " Returns:\n", + " State: The updated state with loaded memories.\n", + " \"\"\"\n", + " convo_str = get_buffer_string(state[\"messages\"])\n", + " convo_str = tokenizer.decode(tokenizer.encode(convo_str)[:2048])\n", + " recall_memories = search_recall_memories.invoke(convo_str, config)\n", + " return {\n", + " \"recall_memories\": recall_memories,\n", + " }\n", + "\n", + "\n", + "def route_tools(state: State):\n", + " \"\"\"Determine whether to use tools or end the conversation based on the last message.\n", + "\n", + " Args:\n", + " state (schemas.State): The current state of the conversation.\n", + "\n", + " Returns:\n", + " Literal[\"tools\", \"__end__\"]: The next step in the graph.\n", + " \"\"\"\n", + " msg = state[\"messages\"][-1]\n", + " if msg.tool_calls:\n", + " return \"tools\"\n", + "\n", + " return END" + ] + }, + { + "cell_type": "markdown", + "id": "854c9825-6ccf-450d-bc0f-88cf16ac5442", + "metadata": {}, + "source": [ + "## Build the graph" + ] + }, + { + "cell_type": "markdown", + "id": "4f1aa06c-69b0-4f86-94bc-6be588c9a778", + "metadata": {}, + "source": [ + "Our agent graph is going to be very similar to simple [ReAct agent](https://langchain-ai.github.io/langgraph/reference/prebuilt/#create_react_agent). The only important modification is adding a node to load memories BEFORE calling the agent for the first time." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "6122f234-3be0-48a8-960b-011fa2a6ce6f", + "metadata": {}, + "outputs": [], + "source": [ + "# Create the graph and add nodes\n", + "builder = StateGraph(State)\n", + "builder.add_node(load_memories)\n", + "builder.add_node(agent)\n", + "builder.add_node(\"tools\", ToolNode(tools))\n", + "\n", + "# Add edges to the graph\n", + "builder.add_edge(START, \"load_memories\")\n", + "builder.add_edge(\"load_memories\", \"agent\")\n", + "builder.add_conditional_edges(\"agent\", route_tools, [\"tools\", END])\n", + "builder.add_edge(\"tools\", \"agent\")\n", + "\n", + "# Compile the graph\n", + "memory = MemorySaver()\n", + "graph = builder.compile(checkpointer=memory)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "d587a860-9859-4cf3-be01-4e7e17d64190", + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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DbcgbDosX3g9DeCjtOd6Jhi3XRkTtkbXbmyG8glNjte15uUBu/P5BspmyO3ghqLGak4dUZ8XbzNqKCaerMNRSGTIQTRyvbJDM477uY7du+56NHU+U3xQ2kNHYbQWArYTAUI8bjK/MY4Iy53Vzi5znOcS5zi4klziSSepUytkbBicNfsXlvztc/elW5VHhr9i8t+drn70q3Lz5V11Xqs7REReVBERAREQEREFU4pfaJk/7L96xZCk9QYaLUOFu42Z7omWYzH2jPhMPmcPnB2P6FU329SUXGGfTM2Qe3p3TjrMAik/rBssjHN3/B67eTc+U9HAmKsPMvF4mZ1zEbbb/RltiyZRQnfbPehmV9ape3TvtnvQzK+tUvbrdmeaPdHMsm0UJ32z3oZlfWqXt077Z70MyvrVL26Znmj3RzLJtFCd9s96GZX1ql7dO+2e9DMr61S9umZ5o90cyybRQnfbPehmV9ape3UdNre/BqKpgpNKZVuUt1ZrsMHb1PGhifEyR3N22w2dPENidzzdAdjszPNHujmWWxFCd9s96GZX1ql7dO+2e9DMr61S9umZ5o90cyybRQnfbPehmV9ape3TvtnvQzK+tUvbpmeaPdHMsm0UJ32z3oZlfWqXt077Z70MyvrVL26Znmj3RzLJtFCd9s96GZX1ql7dcm5DUVjxItJW4JD0a+5crMiB+Nxjke4D8jSfmKZnmj3RzSzO4a/YvLfna5+9KtyitM4PwfxLazpu6J3ySTzzBvKHyPeXuIG52budgNzsABudlKrn49UV4tVVOy5O0REWhBERAREQEREBERAREQEREBERAVByo/8Abzpg7eTTWWG+3/msd59v/wBj8h26X5a+yzN+P2lncrtxpjLjm5eg3tY3pvv83k28x+LqGwUREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBa9yxb/AMQOlRuebwXzGw5R5O68Z5/N5un1LYS1/lQ/3/NLkGTk8GctuAPE37qxu25+Py7fpQbAREQEREBERAREQEREBERAREQEREBERAREQEREBEUZmdTYjTojOVylPHdpvyC1O2Mv28uwJ67fMsqaZqm1MXkSaKre+lo70pxHrsf1p76WjvSnEeux/Wt2j43cnhLLNnctK0fleMXD93HPTdzw302a8WnMrC+fvtX5GPdax5DC7tNgSGOIG3XlPxHfY/vpaO9KcR67H9a/PDiN7l/TGf8AdmVJ6mUxnvb5eXv1fsR2YxDAQd5qxIIAL3jxQPI2T+qU0fG7k8JM2dz9OEVW99LR3pTiPXY/rT30tHelOI9dj+tNHxu5PCTNnctKKre+lo70pxHrsf1qSw2rsHqGV0WLzFHIStbzujrWGSODd9t9gd9t+m6xqwcWmL1UzEekpaUuiItKCIiAiIgIiICIiAiIgIiICIiAiIgLX2lHDIR3srKBJdtXLMb5XDxhHHPIyOMfE1rWjoOm5cdt3FbBWvNC/YB/067/AKqVe/J+rrnxj98l7FgREWxBERAREQFXte8tXS2RyjAGXcXXkvVZ2jx4pI2FwIPTodi0jfZzXOadwSFYVXOJH3O9U/mq1+5ct2B1tMeMMqdsNig7gH419XFnwG/kXJcZiIiICIiAiIgIiICIiAiIgIiICIiAteaF+wD/AKdd/wBVKthrXmhfsA/6dd/1Uq9+T9XV6x+17FgWlNce6Nm4d8QqmCzeBx9fE2r8FGK23UFd19wmc1jJ+4ducxBzgCebmA3PLst1rzJqf3Omt7kGrMdjJNKPq5XUY1JHlr3b93zObYZPHVk2YQxjSwMEgc/ZgAEY33Fqv2Ismv8A3SuT0w3Vt7C6MGa07pi/Hisjl7GUFbktOEe4ZEI3ufGwzR8ztwep5Wu2WLxA913itH6nz+LpVMPfi0+/ssi6/qSrj7L5QwPfHVryeNMWhwG5LAXbtBJBWoeMmVpaT4x6wc92Lz1WxfqX5dERZTIVJsnPHHEWHuVtV8diUua08zZOzdysD2gtdvuyDhjr3R+qtT3tGnTFrC6nu995YNSsmFjHWnxsbLy9k0iVh5A7lLmbHcb+dYXqnYO6f3RGUzGTy8Gj9GeEdTH4WjnzbsZRtMSV7MckjGtaY3ntNozs34J67ub03iclxn1dqHifwwdo/GVb2l9SadsZfuW9kO5XSbmud3kQSFromyDZoOzzI7fl5ATeqHDXJVOI3ELPmamKOocRQx9SJjnc8b4G2Q8vHLsGntmbbEnodwOm9Jx3BTW2kMNwmt4C1gbOodIYSXCXa2RlmZUsMljhDnxyMjLwWvgBALBzAn4Ky/yG/wBVziR9zvVP5qtfuXKxjfYb+VVziR9zvVP5qtfuXL1YHW0esfllTthsRnwG/kXJcWfAb+RclxmIiIgIiICIiAiIgIiICIiAiIgIiIC15oX7AP8Ap13/AFUq2Gte6V5cc29iJnCO9WuWZHQuPjGOSeSSOQDztc13lG43Dm77tK9+T68OuPGP3zXsT6Ii2IIiICIiAq5xI+53qn81Wv3LlY1XOIEsU2lcljOdpt5OvJSrw82znvkYW9PmAJc4+RrWucdgCVuwOtpnxhlTthsRnwG/kXJfANgB8S+rjMRERAREQEREBERAREQEREBERARFHZLKPqWalSCtLZsWXOaHMb/JwAMc7nlO/Ru7Q0bbklw2G25Acszlm4emZu57F2XdrWVajOeWQue1g2G42AL27uJDWjcuIAJUNY0PT1JZZb1RTpZezXksMqRmNxgigkc3YGNxLXv5WN3eRuC54bytcQZHCYBuNcLlt8d3OS14q9vJCIRunDOYgBu55GBz3kM3O3MepJJMusqappm9M2kVb3q9GeieE/w+L+FPer0Z6J4T/D4v4VaUW7SMbvzxlbzvVb3q9GeieE/w+L+FfnbxF905pfBe7NpxVMPijw5xEveS9WipxmGwSeWayWgbOcx58U/FH/WK/TtaOyvBnh97+enKvgPpvueXTmUlkr96K/I97bWPDXub2exIDngE9RzO28pTSMbvzxkvO9sj3q9GeieE/wAPi/hT3q9GeieE/wAPi/hVpRNIxu/PGS871W96vRnonhP8Pi/hUji9HYHCNlGPwmPoiVhik7nqsZzsPladh1HzeRTCLGrGxa4tVVMx6l5VrvZc0lXHeaE3cTXrQVoMHGGMMQa/ZzopHEeSM/zbuh7NoBbud5fF5uhmu6+4bcVo1LD6lhsbt3QzN25mPHladiDsfKHNI6EE5yjr+Fju26luOaarZrSOlDoHlrZSWFhbK3yPbtsdj5C1pBBAWlEiihcLm55J6+Ly0TK+d7kFmZldsjqzxzFjjFI5oDtiAS34TQ9m/wAIEzSAiIgIiICIiAiIgIiICIiCIzuSsxcuOxx7PLW4ZTWsTVJJ61ctA/lJuUtGwLhsznY5/UNI2c5uTi8LUw/dTq8LWz25e6LVjlAksy8jWdpIQBzO5WMaPiaxrRsGgCO0bBYkx8uUu1rtC/lJBampXbXbGr4rWNjbt4rAGtaS1vTmLiS4kuM+gIiICIiAqBjGuzvGrMXmFxqYHFR4rm68pszvFiVu2227Y2VTvuf53zbdZrXOrZNM4+GDH1m5HUOQf3PjMe5/KJpdurnkblsTB4737HZoOwc4ta7I0XpWPR+BioCd120977Fy9IwMfbsSOLpZXAdAXOJ2A6NGzR0AQTqIiAiIgIiIMLM4ern8bNQuse+vLtv2cjo3tIIc1zXtIc1zXAODmkEEAgghYdbJ2aGQNLKvjc+1Yl7hlrQScjogGuDZXbFrJBu5oBd44buOu7WzKxMtjIczi7dCw6ZkFmJ0L315nwytDhtuyRhDmOG+4c0gg7EEEIMtFFafu3LEFiDIV+57VWZ8IJnZKZ4gf5OY8obyl7diWlo5XcwG4AcZVAREQEREBERAREQF1WqzLlaaCUExysLHAHY7EbHqu1Vfifd1XjdA5q3oipQyGqoIO1o1MmH9hO5pBcw8jmndzQ4N6gcxbudt0GXoWq+hovBVJMdJiH1qUMBoSz9u6DkYG8hk+/2225vP5fOp1eBPcYe6J4ocZeO1jAZBlDTmmMRXu38phKFNwbJYlneXFz53SSsd205PI17WgMADQAQffaAiIgKH1RqmnpOhHYtNlsT2JRWp0azQ+xcncCWxRNJALiGucSSGta1z3uaxjnD5qjVVXStKKSaOW5dsvMFLG1eU2Ls3KXCKIOLRvs1xJcWta1rnPc1rXOGDprTFqLJSZ7PSw2tQTRmBorlxr0IC7m7CDm6nfZpklIa6VzGkhrWxxxhx0jpi3Ut2M9npI7GpLzAyRsLy+vQiHUVa5IaSwHq6QtDpXeMQ1oZHHaURAREQEREBERAREQV3uUVOIInip0Wd3YwtsW+12tSGCUdkzk++jb3RKeb70uA++ViVduwh3ELDS9wU5C3F3m93vmAsxbzVD2bGeV0b9uZzvMYox98FYkBERAREQEREHXZsR1K8s8ruWKJpe53xADclUKCfPamrw5EZyzg4LDBLDTpQQOLGEbt53SxvJdt5dgAPJ123Nt1V9rGY+hzfsFV7TX2uYr6JF+wF0MniKaJrtEze2uL/AJZbIuxu8+d9NMx6tR/26d5876aZj1aj/t1Not/SeWPbTyS7Xen+C9PSusNQapxGbyNDPZ/szkrcUFMd0FgPKS3sOUHqSS0AuPU7nqrT3nzvppmPVqP+3U2idJ5Y9tPIuhO8+d9NMx6tR/26d5876aZj1aj/ALdTaJ0nlj208i6qR6VyeKz8mo6+anzGaFfuYNy0cJjdCHBxiYY2N7HmIG7mjqWsLg/ka1bBwmWhz2Ho5KuHtgtwMnY2QbOaHNBAcPMRvsR8aiV08LPuc6c+gxfsrTjxFWHn2iJiY2REbb7vRdsLSiIucxEREBEXTcuQY+rNatTR160LDJJLK4NaxoG5JJ6ABWIvqgdyLSepuMuWysr4sAxuKojcNuWYuexJ/WbG7pGPi5gT1G4adwqrLqnUszy5+p8nuT966No/uDAF38L6LlGJTnVTFPhO34XV2vSyLzN4Saj9J8r+tb/CnhJqP0nyv61v8K3fwWN34+eRq3vNHEviD7orBe68qaDoaxfPkpZZKeGyMmHokjHWXxSPcdq+xAEEZcdjsYj86/TBeTLWOlu6spannyNuXUNKu+pWyTywzRRPO7mNdy9Aev8AefjO814Saj9J8r+tb/Cn8Fjd+Pnkat70yi8zeEmo/SfK/rW/wrk3U+pGHdup8oD872O/yLCE/gsbvx88jVvel0WisBxe1BhpmjJ8uepb+MQxsVlg/qkbMf8AkIbv+F8e6MNmaWoMZBkMfO2zUnG7JGgjz7EEHq1wIILSAQQQQCFycqyHGyOY6SNU9sbBmoiLnoi9VfaxmPoc37BVe019rmK+iRfsBWHVX2sZj6HN+wVXtNfa5ivokX7AXRwepn1/S9iSUNpHWGK1zhu+uGsG1QNiesJTG5m74ZXxSDZwB6PY4b+fbdStivHagkgmY2WGRpY9jhuHNI2IP6F4m07jMFon3LOrp9Nx08FqLvzZoZy1jOWK/Xx7cy6OXm5fGaGV39D9607jbopM2R7dWPkbseMx9m5KHOirxOlcGDdxDQSdvn6LyBrxtLhlqLVtLgu+OvC7QN3IX62HsGaGGdkkYrWBsXATljp9j8JwaCd9t1IV8NpDSmuOHdfhjYisHO4PJuzbaFozm7VFPmis2RzHeTt+QB58Yl7m7+YTOHpvQ+rqev8ARuE1Lj4p4aOXpxXYI7LWtlayRoc0ODSQDseuxI+dTi8XzYXFap9z5wXzjshp/O1sBp577Gk8zku5ockGV4mylj2nxZ4S3YFzSGmQ78u+69W8N85Q1Pw90zl8VWmp4y9ja9irXsbmSKJ0bSxriSdyAQN9zv8AGVYm4sa6eFn3OdOfQYv2V3Lp4Wfc5059Bi/ZVxepn1j8SvYtKIi5yCIiAtNcbNQyXMxU09G4ipBE27baPJI8uPZNP/aWOft8fIfN13KvPHEmJ8XEzOdp/wBSOtIzf8Ds+X9pr/8ANd36Nh015VersiZj11R+13oBERfdtYi4Tl7YZDE0OkDSWtJ2BO3QLy3wz0vY1dQwWoJtV4HG6qlvh9qd9eZuVNhkpMlZ5dZ2IIDm8nZ8vKejR0K8uLjTh1U0003mfG27mr1Oo/UObg01gMnl7TJJK2Pqy25WQgF7mRsLiGgkDfYHbcheccpp+hX0FrrVccJbqHG6wsup5Dnd2lcDIMBaw7+K0hzt2joeY79Vka0o6f1OzjFb1ZNDJqHEsngxda3ZMZq1hUa6B8LeYfDe5xJHwj08nRearK6raqddrxr9fDwHozE5KLM4qlkIWvbDahZOxsgAcGuaHAHYnrsVlKD0J9o+nvzdX/dNU4ujTN6YmUFbuE2oZMFrGPHFx7gzHM0s+9ZYawua/wCbmYwtPxkM+LrUVmaeifPrHTMcX84clE4beXZoc53/AOLXLz5Xh04uBXTVstLKna9NIiL8xVF6q+1jMfQ5v2Cq9pr7XMV9Ei/YCsWqGl2mcs0DcmpMAB/2FV3TJB03iiCCDUi2IPl8QLo4PUz6/pexJKEr6H05Uy+QysGn8XDlMjGYrt6OlG2eyw7btkeG8zwdh0cSOgU2iqIXTWitO6Mgng0/gcZgoZ3c8seMpx12yO+NwY0bn5yuOntCaa0jZt2MFp7FYWxbPNYlx1KKB8x8u7yxoLv0qcRLCrXeFWisnVjrXNH4C3XjnfZZDPjIHsbM8gvkALdg5xA3d5TsN1Z442xRtYxoYxoDWtaNgAPIAFyRAXTws+5zpz6DF+yu5dPC0bcOdN/PRiII8hHKNipi9TPrH4lexaURFzkEREBaw4y6PmvNrahoxOmsVIzBahjbzPkgJ3DgPKSxxJ2Hme/ykALZ6L05NlFWTYsYtHYPJ92F+Rx0sdW6+m+aPaO3XDHuZuOjmhwc0/pBCq40RqAf/ELOH/7PH/7ZektU8F6OWsSW8PbOEtSEufEIhLWe4ncuMe4LSf6rgOpJBPVVCXgvqxjiI7WGlbv0c6SVh/u5Hf8AqvtqPqOSY8RVVXmzu1x+NRm7mn6+jM9DPG9+vs3Oxrg50T6lANeAfIdqwOx+YgqYbo/AszZzLcJjm5d3lyAqR90Hzfzm3N/mti+81rD+lwfrE3sk95rWH9Lg/WJvZLdGV5HH+yP7mZ/JmyoD9NYiWjapPxVJ9O1MbFiu6uwxzSlwcXvbts5xcA7c9dxusfL6L09qC221lMFjMlaawxNmuU45Xhh33aHOBOx3PT51sf3mtYf0uD9Ym9knvNaw/pcH6xN7JZTluRzqmuDNlqa9ozKy2XGhrHKYekAGw0KdSiYoGgABreeu523TzkrH8CNQ/wDzDzvqeP8A9stw+81rD+lwfrE3slyZwY1c47OsYVg/CE0zv8uzH/qtc5Xke3pfmTNlQcLQs4zHR17eTsZedpJNu0yJkj9zuARGxrenk6DzLaHBvSUl7KDUtmMtqQRuioBw27Vzhs+Yf1eXdrT5+Z58nKTJ6e4HV4J2z5/Id9gDuKUMXY1z8zwSXP8Aybhp67tK2exjYmNYxoYxo2a1o2AHxBcf6h9Uoqw5wMnm99s+H96yNTkiIvlB8c0PaWuAc0jYg+Qqlu0dm8V/IYXK0mY5vSKvkKr5Xwt/AbI2Ru7R5ACNwPOVdUW7DxasK+bzW9lJ7w6w+U8H6jN7ZO8OsPlPB+oze2V2RbtKxN0cILqT3h1h8p4P1Gb2yd4dYfKeD9Rm9srsiaVibo4QXUnvDrD5TwfqM3tk7w6w+U8H6jN7ZXZE0rE3RwgupbdK6ivgwZHMUYqj+kne6pJHM5vnDXukPJuNxuAT16bEbq31KsNGrDWrxtighY2OONo2DWgbAD8gC7UWnExq8TVVyL3ERFpQREQEREBERAREQEREBERAREQEREH/2Q==", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import Image, display\n", + "\n", + "display(Image(graph.get_graph().draw_mermaid_png()))" + ] + }, + { + "cell_type": "markdown", + "id": "898c7a41-571a-45cb-b1d7-990c361b26da", + "metadata": {}, + "source": [ + "## Run the agent!" + ] + }, + { + "cell_type": "markdown", + "id": "812f0d36-9966-47dd-8bd4-5341eb219525", + "metadata": {}, + "source": [ + "Let's run the agent for the first time and tell it some information about the user!" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "2f815342-e79a-479d-a43d-e4c0225f26b4", + "metadata": {}, + "outputs": [], + "source": [ + "def pretty_print_stream_chunk(chunk):\n", + " for node, updates in chunk.items():\n", + " print(f\"Update from node: {node}\")\n", + " if \"messages\" in updates:\n", + " updates[\"messages\"][-1].pretty_print()\n", + " else:\n", + " print(updates)\n", + "\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ead8ea5e-76db-47ea-81e1-2582fcd033c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': []}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " save_recall_memory (call_OqfbWodmrywjMnB1v3p19QLt)\n", + " Call ID: call_OqfbWodmrywjMnB1v3p19QLt\n", + " Args:\n", + " memory: User's name is John.\n", + "\n", + "\n", + "Update from node: tools\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: save_recall_memory\n", + "\n", + "User's name is John.\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Nice to meet you, John! How can I assist you today?\n", + "\n", + "\n" + ] + } + ], + "source": [ + "# NOTE: we're specifying `user_id` to save memories for a given user\n", + "config = {\"configurable\": {\"user_id\": \"1\", \"thread_id\": \"1\"}}\n", + "\n", + "for chunk in graph.stream({\"messages\": [(\"user\", \"my name is John\")]}, config=config):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "markdown", + "id": "fb1132d8-4a1a-4fa1-8dc9-7da220f16710", + "metadata": {}, + "source": [ + "You can see that the agent saved the memory about user's name. Let's add some more information about the user!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "bb972962-5cbb-4273-b9b8-80810b55ff46", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': [\"User's name is John.\"]}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " save_recall_memory (call_xxEivMuWCURJrGxMZb02Eh31)\n", + " Call ID: call_xxEivMuWCURJrGxMZb02Eh31\n", + " Args:\n", + " memory: John loves pizza.\n", + "\n", + "\n", + "Update from node: tools\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: save_recall_memory\n", + "\n", + "John loves pizza.\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Pizza is amazing! Do you have a favorite type or topping?\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for chunk in graph.stream({\"messages\": [(\"user\", \"i love pizza\")]}, config=config):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0868024d-bf69-40f6-8fc8-c04607443aa5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': [\"User's name is John.\", 'John loves pizza.']}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " save_recall_memory (call_AFrtCVwIEr48Fim80zlhe6xg)\n", + " Call ID: call_AFrtCVwIEr48Fim80zlhe6xg\n", + " Args:\n", + " memory: John's favorite pizza topping is pepperoni.\n", + "\n", + "\n", + "Update from node: tools\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: save_recall_memory\n", + "\n", + "John's favorite pizza topping is pepperoni.\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Pepperoni is a classic choice! Do you have a favorite pizza place, or do you enjoy making it at home?\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for chunk in graph.stream(\n", + " {\"messages\": [(\"user\", \"yes -- pepperoni!\")]},\n", + " config={\"configurable\": {\"user_id\": \"1\", \"thread_id\": \"1\"}},\n", + "):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "196c2fc5-34e8-4f42-90b0-60d2dd747203", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': [\"User's name is John.\", 'John loves pizza.', \"John's favorite pizza topping is pepperoni.\"]}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " save_recall_memory (call_Na86uY9eBzaJ0sS0GM4Z9tSf)\n", + " Call ID: call_Na86uY9eBzaJ0sS0GM4Z9tSf\n", + " Args:\n", + " memory: John just moved to New York.\n", + "\n", + "\n", + "Update from node: tools\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: save_recall_memory\n", + "\n", + "John just moved to New York.\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Welcome to New York! That's a fantastic place for a pizza lover. Have you had a chance to explore any of the famous pizzerias there yet?\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for chunk in graph.stream(\n", + " {\"messages\": [(\"user\", \"i also just moved to new york\")]},\n", + " config={\"configurable\": {\"user_id\": \"1\", \"thread_id\": \"1\"}},\n", + "):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "markdown", + "id": "d0880c6c-5111-4fe5-9e25-1ffd6ef756c5", + "metadata": {}, + "source": [ + "Now we can use the saved information about our user on a different thread. Let's try it out:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "d503c838-f280-49c1-871f-b02b36a9904e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': ['John loves pizza.', \"User's name is John.\", 'John just moved to New York.']}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Considering you just moved to New York and love pizza, I'd recommend checking out some of the iconic pizza places in the city. Some popular spots include:\n", + "\n", + "1. **Di Fara Pizza** in Brooklyn – Known for its classic New York-style pizza.\n", + "2. **Joe's Pizza** in Greenwich Village – A historic pizzeria with a great reputation.\n", + "3. **Lucali** in Carroll Gardens, Brooklyn – Often ranked among the best for its delicious thin-crust pies.\n", + "\n", + "Would you like more recommendations or information about any of these places?\n", + "\n", + "\n" + ] + } + ], + "source": [ + "config = {\"configurable\": {\"user_id\": \"1\", \"thread_id\": \"2\"}}\n", + "\n", + "for chunk in graph.stream(\n", + " {\"messages\": [(\"user\", \"where should i go for dinner?\")]}, config=config\n", + "):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "markdown", + "id": "247e2634-7120-4de3-b1d5-a16c2d1e611e", + "metadata": {}, + "source": [ + "Notice how the agent is loading the most relevant memories before answering, and in our case suggests the dinner recommendations based on both the food preferences as well as location.\n", + "\n", + "Finally, let's use the search tool together with the rest of the conversation context and memory to find location of a pizzeria:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d235dbb3-3d5b-4206-888b-fef628241b14", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': ['John loves pizza.', 'John just moved to New York.', \"John's favorite pizza topping is pepperoni.\"]}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " tavily_search_results_json (call_aespiB28jpTFvaC4d0qpfY6t)\n", + " Call ID: call_aespiB28jpTFvaC4d0qpfY6t\n", + " Args:\n", + " query: Joe's Pizza Greenwich Village NYC address\n", + "\n", + "\n", + "Update from node: tools\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: tavily_search_results_json\n", + "\n", + "[{\"url\": \"https://www.joespizzanyc.com/locations-1-1\", \"content\": \"Joe's Pizza Greenwich Village (Original Location) 7 Carmine Street New York, NY 10014 (212) 366-1182 Joe's Pizza Times Square 1435 Broadway New York, NY 10018 (646) 559-4878. TIMES SQUARE MENU. ORDER JOE'S TIMES SQUARE Joe's Pizza Williamsburg 216 Bedford Avenue Brooklyn, NY 11249\"}]\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "The address for Joe's Pizza in Greenwich Village is:\n", + "\n", + "**7 Carmine Street, New York, NY 10014**\n", + "\n", + "Enjoy your pizza!\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for chunk in graph.stream(\n", + " {\"messages\": [(\"user\", \"what's the address for joe's in greenwich village?\")]},\n", + " config=config,\n", + "):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "markdown", + "id": "0449b949-e7ea-4273-8194-b64751d764c6", + "metadata": {}, + "source": [ + "If you were to pass a different user ID, the agent's response will not be personalized as we haven't saved any information about the other user:" + ] + }, + { + "cell_type": "markdown", + "id": "260b0ee3-107f-4bcc-8ef2-edeab4fe11b5", + "metadata": {}, + "source": [ + "## Adding structured memories\n", + "\n", + "So far we've represented memories as strings, e.g., `\"John loves pizza\"`. This is a natural representation when persisting memories to a vector store. If your use-case would benefit from other persistence backends-- such as a graph database-- we can update our application to generate memories with additional structure.\n", + "\n", + "Below, we update the `save_recall_memory` tool to accept a list of \"knowledge triples\", or 3-tuples with a `subject`, `predicate`, and `object`, suitable for storage in a knolwedge graph. Our model will then generate these representations as part of its tool calls.\n", + "\n", + "For simplicity, we use the same vector database as before, but the `save_recall_memory` and `search_recall_memories` tools could be further updated to interact with a graph database. For now, we only need to update the `save_recall_memory` tool:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "1e1569ef-1c00-46be-9616-1f046c38e74f", + "metadata": {}, + "outputs": [], + "source": [ + "recall_vector_store = InMemoryVectorStore(OpenAIEmbeddings())" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "60ca4cf7-a16a-4f5c-8ca5-4974bcc6bbc8", + "metadata": {}, + "outputs": [], + "source": [ + "from typing_extensions import TypedDict\n", + "\n", + "\n", + "class KnowledgeTriple(TypedDict):\n", + " subject: str\n", + " predicate: str\n", + " object_: str\n", + "\n", + "\n", + "@tool\n", + "def save_recall_memory(memories: List[KnowledgeTriple], config: RunnableConfig) -> str:\n", + " \"\"\"Save memory to vectorstore for later semantic retrieval.\"\"\"\n", + " user_id = get_user_id(config)\n", + " for memory in memories:\n", + " serialized = \" \".join(memory.values())\n", + " document = Document(\n", + " serialized,\n", + " id=str(uuid.uuid4()),\n", + " metadata={\n", + " \"user_id\": user_id,\n", + " **memory,\n", + " },\n", + " )\n", + " recall_vector_store.add_documents([document])\n", + " return memories" + ] + }, + { + "cell_type": "markdown", + "id": "b171ba75-bbf1-4474-a1db-2333a05a5da7", + "metadata": {}, + "source": [ + "We can then compile the graph exactly as before:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "93bedf95-36ca-42d9-b2b6-bfcb1f7a1cf2", + "metadata": {}, + "outputs": [], + "source": [ + "tools = [save_recall_memory, search_recall_memories, search]\n", + "model_with_tools = model.bind_tools(tools)\n", + "\n", + "\n", + "# Create the graph and add nodes\n", + "builder = StateGraph(State)\n", + "builder.add_node(load_memories)\n", + "builder.add_node(agent)\n", + "builder.add_node(\"tools\", ToolNode(tools))\n", + "\n", + "# Add edges to the graph\n", + "builder.add_edge(START, \"load_memories\")\n", + "builder.add_edge(\"load_memories\", \"agent\")\n", + "builder.add_conditional_edges(\"agent\", route_tools, [\"tools\", END])\n", + "builder.add_edge(\"tools\", \"agent\")\n", + "\n", + "# Compile the graph\n", + "memory = MemorySaver()\n", + "graph = builder.compile(checkpointer=memory)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "7d3491af-81b2-4994-8754-7f07b8b8fc7a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': []}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Hello, Alice! How can I assist you today?\n", + "\n", + "\n" + ] + } + ], + "source": [ + "config = {\"configurable\": {\"user_id\": \"3\", \"thread_id\": \"1\"}}\n", + "\n", + "for chunk in graph.stream({\"messages\": [(\"user\", \"Hi, I'm Alice.\")]}, config=config):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "markdown", + "id": "b3c3c337-c48e-430d-a336-204b6904015d", + "metadata": {}, + "source": [ + "Note that the application elects to extract knowledge-triples from the user's statements:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "846a9971-ff7e-4c86-b5dc-153bc4aac692", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': []}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "Tool Calls:\n", + " save_recall_memory (call_EQSZlvZLZpPa0OGS5Kyzy2Yz)\n", + " Call ID: call_EQSZlvZLZpPa0OGS5Kyzy2Yz\n", + " Args:\n", + " memories: [{'subject': 'Alice', 'predicate': 'has a friend', 'object_': 'John'}, {'subject': 'John', 'predicate': 'likes', 'object_': 'Pizza'}]\n", + "\n", + "\n", + "Update from node: tools\n", + "=================================\u001b[1m Tool Message \u001b[0m=================================\n", + "Name: save_recall_memory\n", + "\n", + "[{\"subject\": \"Alice\", \"predicate\": \"has a friend\", \"object_\": \"John\"}, {\"subject\": \"John\", \"predicate\": \"likes\", \"object_\": \"Pizza\"}]\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Got it! If you need any suggestions related to pizza or anything else, feel free to ask. What else is on your mind today?\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for chunk in graph.stream(\n", + " {\"messages\": [(\"user\", \"My friend John likes Pizza.\")]}, config=config\n", + "):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "markdown", + "id": "209a49b7-c015-42f9-9066-83e308c63a56", + "metadata": {}, + "source": [ + "As before, the memories generated from one thread are accessed in another thread from the same user:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "c0cfc5d9-c69d-4839-990b-5edf004dd8b7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Update from node: load_memories\n", + "{'recall_memories': ['John likes Pizza', 'Alice has a friend John']}\n", + "\n", + "\n", + "Update from node: agent\n", + "==================================\u001b[1m Ai Message \u001b[0m==================================\n", + "\n", + "Since John likes pizza, bringing some delicious pizza would be a great choice for the party. You might also consider asking if there are any specific toppings he prefers or if there are any dietary restrictions among the guests. This way, you can ensure everyone enjoys the food!\n", + "\n", + "\n" + ] + } + ], + "source": [ + "config = {\"configurable\": {\"user_id\": \"3\", \"thread_id\": \"2\"}}\n", + "\n", + "for chunk in graph.stream(\n", + " {\"messages\": [(\"user\", \"What food should I bring to John's party?\")]}, config=config\n", + "):\n", + " pretty_print_stream_chunk(chunk)" + ] + }, + { + "cell_type": "markdown", + "id": "5227e196-6418-4af4-bc05-fb9c339148cd", + "metadata": {}, + "source": [ + "Optionally, for illustrative purposes we can visualize the knowledge graph extracted by the model:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "8ad4d11a-b0cf-4720-b901-3d501365c033", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -U --quiet matplotlib networkx" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "0eae5dbd-962f-48ed-9c7c-172fae9cadda", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import networkx as nx\n", + "\n", + "# Fetch records\n", + "records = recall_vector_store.similarity_search(\n", + " \"Alice\", k=2, filter=lambda doc: doc.metadata[\"user_id\"] == \"3\"\n", + ")\n", + "\n", + "\n", + "# Plot graph\n", + "plt.figure(figsize=(6, 4), dpi=80)\n", + "G = nx.DiGraph()\n", + "\n", + "for record in records:\n", + " G.add_edge(\n", + " record.metadata[\"subject\"],\n", + " record.metadata[\"object_\"],\n", + " label=record.metadata[\"predicate\"],\n", + " )\n", + "\n", + "pos = nx.spring_layout(G)\n", + "nx.draw(\n", + " G,\n", + " pos,\n", + " with_labels=True,\n", + " node_size=3000,\n", + " node_color=\"lightblue\",\n", + " font_size=10,\n", + " font_weight=\"bold\",\n", + " arrows=True,\n", + ")\n", + "edge_labels = nx.get_edge_attributes(G, \"label\")\n", + "nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color=\"red\")\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 103e573f9b01523f2ef44429598e7161a661fc1b Mon Sep 17 00:00:00 2001 From: Bharat Ramanathan Date: Thu, 3 Oct 2024 21:29:20 +0530 Subject: [PATCH 11/62] community[patch]: chore warn deprecate the wandb callback handler (#27062) - **Description:**: This PR deprecates the wandb callback handler in favor of the new [WeaveTracer](https://weave-docs.wandb.ai/guides/integrations/langchain#using-weavetracer) in W&B - **Dependencies:** No dependencies, just a deprecation warning. - **Twitter handle:** @parambharat @baskaryan --- .../callbacks/wandb_callback.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libs/community/langchain_community/callbacks/wandb_callback.py b/libs/community/langchain_community/callbacks/wandb_callback.py index 2a6c0aa251d..8fbaf93e8aa 100644 --- a/libs/community/langchain_community/callbacks/wandb_callback.py +++ b/libs/community/langchain_community/callbacks/wandb_callback.py @@ -4,6 +4,7 @@ from copy import deepcopy from pathlib import Path from typing import Any, Dict, List, Optional, Sequence, Union +from langchain_core._api import warn_deprecated from langchain_core.agents import AgentAction, AgentFinish from langchain_core.callbacks import BaseCallbackHandler from langchain_core.outputs import LLMResult @@ -206,6 +207,22 @@ class WandbCallbackHandler(BaseMetadataCallbackHandler, BaseCallbackHandler): self.complexity_metrics = complexity_metrics self.visualize = visualize self.nlp = spacy.load("en_core_web_sm") + warn_deprecated( + "0.3.8", + pending=False, + message=( + "Please use the WeaveTracer instead of the WandbCallbackHandler. " + "The WeaveTracer is a more flexible and powerful tool for logging " + "and tracing your LangChain callables." + "Find more information at https://weave-docs.wandb.ai/guides/integrations/langchain" + ), + alternative=( + "Please instantiate the WeaveTracer from " + "weave.integrations.langchain import WeaveTracer ." + "For autologging simply use weave.init() and log all traces " + "from your LangChain callables." + ), + ) def _init_resp(self) -> Dict: return {k: None for k in self.callback_columns} From 2a54448a0ab0d8c8813a8cd3aed14c886da83732 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 3 Oct 2024 11:13:23 -0700 Subject: [PATCH 12/62] langchain[patch]: Release 0.3.2 (#27073) --- libs/langchain/poetry.lock | 502 ++++++++++++++++++---------------- libs/langchain/pyproject.toml | 50 ++-- 2 files changed, 282 insertions(+), 270 deletions(-) diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock index 7583a036fd8..4266061ece4 100644 --- a/libs/langchain/poetry.lock +++ b/libs/langchain/poetry.lock @@ -1,114 +1,114 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.6" +version = "3.10.8" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:682836fc672972cc3101cc9e30d49c5f7e8f1d010478d46119fe725a4545acfd"}, - {file = "aiohttp-3.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:289fa8a20018d0d5aa9e4b35d899bd51bcb80f0d5f365d9a23e30dac3b79159b"}, - {file = "aiohttp-3.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8617c96a20dd57e7e9d398ff9d04f3d11c4d28b1767273a5b1a018ada5a654d3"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdbeff1b062751c2a2a55b171f7050fb7073633c699299d042e962aacdbe1a07"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea35d849cdd4a9268f910bff4497baebbc1aa3f2f625fd8ccd9ac99c860c621"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473961b3252f3b949bb84873d6e268fb6d8aa0ccc6eb7404fa58c76a326bb8e1"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d2665c5df629eb2f981dab244c01bfa6cdc185f4ffa026639286c4d56fafb54"}, - {file = "aiohttp-3.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25d92f794f1332f656e3765841fc2b7ad5c26c3f3d01e8949eeb3495691cf9f4"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9bd6b2033993d5ae80883bb29b83fb2b432270bbe067c2f53cc73bb57c46065f"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d7f408c43f5e75ea1edc152fb375e8f46ef916f545fb66d4aebcbcfad05e2796"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:cf8b8560aa965f87bf9c13bf9fed7025993a155ca0ce8422da74bf46d18c2f5f"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14477c4e52e2f17437b99893fd220ffe7d7ee41df5ebf931a92b8ca82e6fd094"}, - {file = "aiohttp-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb138fbf9f53928e779650f5ed26d0ea1ed8b2cab67f0ea5d63afa09fdc07593"}, - {file = "aiohttp-3.10.6-cp310-cp310-win32.whl", hash = "sha256:9843d683b8756971797be171ead21511d2215a2d6e3c899c6e3107fbbe826791"}, - {file = "aiohttp-3.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:f8b8e49fe02f744d38352daca1dbef462c3874900bd8166516f6ea8e82b5aacf"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f52e54fd776ad0da1006708762213b079b154644db54bcfc62f06eaa5b896402"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:995ab1a238fd0d19dc65f2d222e5eb064e409665c6426a3e51d5101c1979ee84"}, - {file = "aiohttp-3.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0749c4d5a08a802dd66ecdf59b2df4d76b900004017468a7bb736c3b5a3dd902"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e05b39158f2af0e2438cc2075cfc271f4ace0c3cc4a81ec95b27a0432e161951"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f196c970db2dcde4f24317e06615363349dc357cf4d7a3b0716c20ac6d7bcd"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47647c8af04a70e07a2462931b0eba63146a13affa697afb4ecbab9d03a480ce"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c0efe7e99f6d94d63274c06344bd0e9c8daf184ce5602a29bc39e00a18720"}, - {file = "aiohttp-3.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9721cdd83a994225352ca84cd537760d41a9da3c0eacb3ff534747ab8fba6d0"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b82c8ebed66ce182893e7c0b6b60ba2ace45b1df104feb52380edae266a4850"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b169f8e755e541b72e714b89a831b315bbe70db44e33fead28516c9e13d5f931"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0be3115753baf8b4153e64f9aa7bf6c0c64af57979aa900c31f496301b374570"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e1f80cd17d81a404b6e70ef22bfe1870bafc511728397634ad5f5efc8698df56"}, - {file = "aiohttp-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6419728b08fb6380c66a470d2319cafcec554c81780e2114b7e150329b9a9a7f"}, - {file = "aiohttp-3.10.6-cp311-cp311-win32.whl", hash = "sha256:bd294dcdc1afdc510bb51d35444003f14e327572877d016d576ac3b9a5888a27"}, - {file = "aiohttp-3.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:bf861da9a43d282d6dd9dcd64c23a0fccf2c5aa5cd7c32024513c8c79fb69de3"}, - {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2708baccdc62f4b1251e59c2aac725936a900081f079b88843dabcab0feeeb27"}, - {file = "aiohttp-3.10.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7475da7a5e2ccf1a1c86c8fee241e277f4874c96564d06f726d8df8e77683ef7"}, - {file = "aiohttp-3.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02108326574ff60267b7b35b17ac5c0bbd0008ccb942ce4c48b657bb90f0b8aa"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:029a019627b37fa9eac5c75cc54a6bb722c4ebbf5a54d8c8c0fb4dd8facf2702"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a637d387db6fdad95e293fab5433b775fd104ae6348d2388beaaa60d08b38c4"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1a16f3fc1944c61290d33c88dc3f09ba62d159b284c38c5331868425aca426"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b292f37969f9cc54f4643f0be7dacabf3612b3b4a65413661cf6c350226787"}, - {file = "aiohttp-3.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0754690a3a26e819173a34093798c155bafb21c3c640bff13be1afa1e9d421f9"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:164ecd32e65467d86843dbb121a6666c3deb23b460e3f8aefdcaacae79eb718a"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438c5863feb761f7ca3270d48c292c334814459f61cc12bab5ba5b702d7c9e56"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ba18573bb1de1063d222f41de64a0d3741223982dcea863b3f74646faf618ec7"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c82a94ddec996413a905f622f3da02c4359952aab8d817c01cf9915419525e95"}, - {file = "aiohttp-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92351aa5363fc3c1f872ca763f86730ced32b01607f0c9662b1fa711087968d0"}, - {file = "aiohttp-3.10.6-cp312-cp312-win32.whl", hash = "sha256:3e15e33bfc73fa97c228f72e05e8795e163a693fd5323549f49367c76a6e5883"}, - {file = "aiohttp-3.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:fe517113fe4d35d9072b826c3e147d63c5f808ca8167d450b4f96c520c8a1d8d"}, - {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:482f74057ea13d387a7549d7a7ecb60e45146d15f3e58a2d93a0ad2d5a8457cd"}, - {file = "aiohttp-3.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:03fa40d1450ee5196e843315ddf74a51afc7e83d489dbfc380eecefea74158b1"}, - {file = "aiohttp-3.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e52e59ed5f4cc3a3acfe2a610f8891f216f486de54d95d6600a2c9ba1581f4d"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b3935a22c9e41a8000d90588bed96cf395ef572dbb409be44c6219c61d900d"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bef1480ee50f75abcfcb4b11c12de1005968ca9d0172aec4a5057ba9f2b644f"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:671745ea7db19693ce867359d503772177f0b20fa8f6ee1e74e00449f4c4151d"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50b367308ca8c12e0b50cba5773bc9abe64c428d3fd2bbf5cd25aab37c77bf"}, - {file = "aiohttp-3.10.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a504d7cdb431a777d05a124fd0b21efb94498efa743103ea01b1e3136d2e4fb"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66bc81361131763660b969132a22edce2c4d184978ba39614e8f8f95db5c95f8"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:27cf19a38506e2e9f12fc17e55f118f04897b0a78537055d93a9de4bf3022e3d"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3468b39f977a11271517c6925b226720e148311039a380cc9117b1e2258a721f"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9d26da22a793dfd424be1050712a70c0afd96345245c29aced1e35dbace03413"}, - {file = "aiohttp-3.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:844d48ff9173d0b941abed8b2ea6a412f82b56d9ab1edb918c74000c15839362"}, - {file = "aiohttp-3.10.6-cp313-cp313-win32.whl", hash = "sha256:2dd56e3c43660ed3bea67fd4c5025f1ac1f9ecf6f0b991a6e5efe2e678c490c5"}, - {file = "aiohttp-3.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:c91781d969fbced1993537f45efe1213bd6fccb4b37bfae2a026e20d6fbed206"}, - {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4407a80bca3e694f2d2a523058e20e1f9f98a416619e04f6dc09dc910352ac8b"}, - {file = "aiohttp-3.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cb045ec5961f51af3e2c08cd6fe523f07cc6e345033adee711c49b7b91bb954"}, - {file = "aiohttp-3.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4fabdcdc781a36b8fd7b2ca9dea8172f29a99e11d00ca0f83ffeb50958da84a1"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a9f42efcc2681790595ab3d03c0e52d01edc23a0973ea09f0dc8d295e12b8e"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cca776a440795db437d82c07455761c85bbcf3956221c3c23b8c93176c278ce7"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5582de171f0898139cf51dd9fcdc79b848e28d9abd68e837f0803fc9f30807b1"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:370e2d47575c53c817ee42a18acc34aad8da4dbdaac0a6c836d58878955f1477"}, - {file = "aiohttp-3.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:444d1704e2af6b30766debed9be8a795958029e552fe77551355badb1944012c"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40271a2a375812967401c9ca8077de9368e09a43a964f4dce0ff603301ec9358"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f3af26f86863fad12e25395805bb0babbd49d512806af91ec9708a272b696248"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4752df44df48fd42b80f51d6a97553b482cda1274d9dc5df214a3a1aa5d8f018"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2cd5290ab66cfca2f90045db2cc6434c1f4f9fbf97c9f1c316e785033782e7d2"}, - {file = "aiohttp-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3427031064b0d5c95647e6369c4aa3c556402f324a3e18107cb09517abe5f962"}, - {file = "aiohttp-3.10.6-cp38-cp38-win32.whl", hash = "sha256:614fc21e86adc28e4165a6391f851a6da6e9cbd7bb232d0df7718b453a89ee98"}, - {file = "aiohttp-3.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:58c5d7318a136a3874c78717dd6de57519bc64f6363c5827c2b1cb775bea71dd"}, - {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5db26bbca8e7968c4c977a0c640e0b9ce7224e1f4dcafa57870dc6ee28e27de6"}, - {file = "aiohttp-3.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fb4216e3ec0dbc01db5ba802f02ed78ad8f07121be54eb9e918448cc3f61b7c"}, - {file = "aiohttp-3.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a976ef488f26e224079deb3d424f29144c6d5ba4ded313198169a8af8f47fb82"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a86610174de8a85a920e956e2d4f9945e7da89f29a00e95ac62a4a414c4ef4e"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:217791c6a399cc4f2e6577bb44344cba1f5714a2aebf6a0bea04cfa956658284"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba3662d41abe2eab0eeec7ee56f33ef4e0b34858f38abf24377687f9e1fb00a5"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4dfa5ad4bce9ca30a76117fbaa1c1decf41ebb6c18a4e098df44298941566f9"}, - {file = "aiohttp-3.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0009258e97502936d3bd5bf2ced15769629097d0abb81e6495fba1047824fe0"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0a75d5c9fb4f06c41d029ae70ad943c3a844c40c0a769d12be4b99b04f473d3d"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8198b7c002aae2b40b2d16bfe724b9a90bcbc9b78b2566fc96131ef4e382574d"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4611db8c907f90fe86be112efdc2398cd7b4c8eeded5a4f0314b70fdea8feab0"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ff99ae06eef85c7a565854826114ced72765832ee16c7e3e766c5e4c5b98d20e"}, - {file = "aiohttp-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7641920bdcc7cd2d3ddfb8bb9133a6c9536b09dbd49490b79e125180b2d25b93"}, - {file = "aiohttp-3.10.6-cp39-cp39-win32.whl", hash = "sha256:e2e7d5591ea868d5ec82b90bbeb366a198715672841d46281b623e23079593db"}, - {file = "aiohttp-3.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:b504c08c45623bf5c7ca41be380156d925f00199b3970efd758aef4a77645feb"}, - {file = "aiohttp-3.10.6.tar.gz", hash = "sha256:d2578ef941be0c2ba58f6f421a703527d08427237ed45ecb091fed6f83305336"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, + {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, + {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, + {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, + {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, + {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, + {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, + {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, + {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, + {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, + {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, + {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, + {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, ] [package.dependencies] @@ -421,13 +421,13 @@ graph = ["gremlinpython (==3.4.6)"] [[package]] name = "cassio" -version = "0.1.9" +version = "0.1.10" description = "A framework-agnostic Python library to seamlessly integrate Apache Cassandra(R) with ML/LLM/genAI workloads." optional = false -python-versions = "<4.0,>=3.8" +python-versions = "<4.0,>=3.9" files = [ - {file = "cassio-0.1.9-py3-none-any.whl", hash = "sha256:0139d44d5bbd475df77806366c845465f6b08181c0e98ad9acec9f4047d6ab53"}, - {file = "cassio-0.1.9.tar.gz", hash = "sha256:5c3e5d15769396a98f0f260aead6a2c6e707ab1a13fe94f24341d5ef6bdddd6a"}, + {file = "cassio-0.1.10-py3-none-any.whl", hash = "sha256:9eebe5f18b627d0f328de4dbbf22c68cc76dbeecf46d846c0277e410de5cb1dc"}, + {file = "cassio-0.1.10.tar.gz", hash = "sha256:577f0a2ce5898a57c83195bf74811dec8794282477eb6fa4debd4ccec6cfab98"}, ] [package.dependencies] @@ -1290,13 +1290,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -1307,7 +1307,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -1938,7 +1938,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.3.6" +version = "0.3.8" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -2032,13 +2032,13 @@ types-requests = ">=2.31.0.2,<3.0.0.0" [[package]] name = "langsmith" -version = "0.1.128" +version = "0.1.130" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.128-py3-none-any.whl", hash = "sha256:c1b59d947584be7487ac53dffb4e232704626964011b714fd3d9add4b3694cbc"}, - {file = "langsmith-0.1.128.tar.gz", hash = "sha256:3299e17a659f3c47725c97c47f4445fc34113ac668becce425919866fbcb6ec2"}, + {file = "langsmith-0.1.130-py3-none-any.whl", hash = "sha256:acf27d77e699d84b03045f3f226e78be1dffb3e756aa1a085f9993a45380e8b2"}, + {file = "langsmith-0.1.130.tar.gz", hash = "sha256:3e43f87655a86395133e3a745d5968667d4d05dc9a24c617f89224c8cbf54dce"}, ] [package.dependencies] @@ -2049,6 +2049,7 @@ pydantic = [ {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "lark" @@ -2517,13 +2518,13 @@ files = [ [[package]] name = "openai" -version = "1.48.0" +version = "1.51.0" description = "The official Python library for the openai API" optional = true python-versions = ">=3.7.1" files = [ - {file = "openai-1.48.0-py3-none-any.whl", hash = "sha256:7c4af223f0bf615ce4a12453729952c9a8b04ffe8c78aa77981b12fd970149cf"}, - {file = "openai-1.48.0.tar.gz", hash = "sha256:1d3b69ea62c287c4885a6f3ce840768564cd5f52c60ac5f890fef80d43cc4799"}, + {file = "openai-1.51.0-py3-none-any.whl", hash = "sha256:d9affafb7e51e5a27dce78589d4964ce4d6f6d560307265933a94b2e3f3c5d2c"}, + {file = "openai-1.51.0.tar.gz", hash = "sha256:8dc4f9d75ccdd5466fc8c99a952186eddceb9fd6ba694044773f3736a847149d"}, ] [package.dependencies] @@ -3632,6 +3633,20 @@ requests = ">=2.22,<3" [package.extras] fixture = ["fixtures"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "responses" version = "0.22.0" @@ -4120,13 +4135,13 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -4237,13 +4252,13 @@ types-cffi = "*" [[package]] name = "types-python-dateutil" -version = "2.9.0.20240906" +version = "2.9.0.20241003" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20240906.tar.gz", hash = "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e"}, - {file = "types_python_dateutil-2.9.0.20240906-py3-none-any.whl", hash = "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6"}, + {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, + {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, ] [[package]] @@ -4420,6 +4435,7 @@ description = "Automatically mock your HTTP interactions to simplify and speed u optional = false python-versions = ">=3.8" files = [ + {file = "vcrpy-6.0.1-py2.py3-none-any.whl", hash = "sha256:621c3fb2d6bd8aa9f87532c688e4575bcbbde0c0afeb5ebdb7e14cac409edfdd"}, {file = "vcrpy-6.0.1.tar.gz", hash = "sha256:9e023fee7f892baa0bbda2f7da7c8ac51165c1c6e38ff8688683a12a4bde9278"}, ] @@ -4434,41 +4450,41 @@ tests = ["Werkzeug (==2.0.3)", "aiohttp", "boto3", "httplib2", "httpx", "pytest" [[package]] name = "watchdog" -version = "5.0.2" +version = "5.0.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -4619,103 +4635,103 @@ files = [ [[package]] name = "yarl" -version = "1.12.1" +version = "1.13.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64c5b0f2b937fe40d0967516eee5504b23cb247b8b7ffeba7213a467d9646fdc"}, - {file = "yarl-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e430ac432f969ef21770645743611c1618362309e3ad7cab45acd1ad1a540ff"}, - {file = "yarl-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e26e64f42bce5ddf9002092b2c37b13071c2e6413d5c05f9fa9de58ed2f7749"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0103c52f8dfe5d573c856322149ddcd6d28f51b4d4a3ee5c4b3c1b0a05c3d034"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b63465b53baeaf2122a337d4ab57d6bbdd09fcadceb17a974cfa8a0300ad9c67"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17d4dc4ff47893a06737b8788ed2ba2f5ac4e8bb40281c8603920f7d011d5bdd"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b54949267bd5704324397efe9fbb6aa306466dee067550964e994d309db5f1"}, - {file = "yarl-1.12.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10b690cd78cbaca2f96a7462f303fdd2b596d3978b49892e4b05a7567c591572"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c85ab016e96a975afbdb9d49ca90f3bca9920ef27c64300843fe91c3d59d8d20"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c1caa5763d1770216596e0a71b5567f27aac28c95992110212c108ec74589a48"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:595bbcdbfc4a9c6989d7489dca8510cba053ff46b16c84ffd95ac8e90711d419"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e64f0421892a207d3780903085c1b04efeb53b16803b23d947de5a7261b71355"}, - {file = "yarl-1.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:319c206e83e46ec2421b25b300c8482b6fe8a018baca246be308c736d9dab267"}, - {file = "yarl-1.12.1-cp310-cp310-win32.whl", hash = "sha256:da045bd1147d12bd43fb032296640a7cc17a7f2eaba67495988362e99db24fd2"}, - {file = "yarl-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:aebbd47df77190ada603157f0b3670d578c110c31746ecc5875c394fdcc59a99"}, - {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:28389a68981676bf74e2e199fe42f35d1aa27a9c98e3a03e6f58d2d3d054afe1"}, - {file = "yarl-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f736f54565f8dd7e3ab664fef2bc461d7593a389a7f28d4904af8d55a91bd55f"}, - {file = "yarl-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dee0496d5f1a8f57f0f28a16f81a2033fc057a2cf9cd710742d11828f8c80e2"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8981a94a27ac520a398302afb74ae2c0be1c3d2d215c75c582186a006c9e7b0"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff54340fc1129e8e181827e2234af3ff659b4f17d9bbe77f43bc19e6577fadec"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54c8cee662b5f8c30ad7eedfc26123f845f007798e4ff1001d9528fe959fd23c"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e97a29b37830ba1262d8dfd48ddb5b28ad4d3ebecc5d93a9c7591d98641ec737"}, - {file = "yarl-1.12.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c89894cc6f6ddd993813e79244b36b215c14f65f9e4f1660b1f2ba9e5594b95"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:712ba8722c0699daf186de089ddc4677651eb9875ed7447b2ad50697522cbdd9"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6e9a9f50892153bad5046c2a6df153224aa6f0573a5a8ab44fc54a1e886f6e21"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1d4017e78fb22bc797c089b746230ad78ecd3cdb215bc0bd61cb72b5867da57e"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f494c01b28645c431239863cb17af8b8d15b93b0d697a0320d5dd34cd9d7c2fa"}, - {file = "yarl-1.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de4544b1fb29cf14870c4e2b8a897c0242449f5dcebd3e0366aa0aa3cf58a23a"}, - {file = "yarl-1.12.1-cp311-cp311-win32.whl", hash = "sha256:7564525a4673fde53dee7d4c307a961c0951918f0b8c7f09b2c9e02067cf6504"}, - {file = "yarl-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:f23bb1a7a6e8e8b612a164fdd08e683bcc16c76f928d6dbb7bdbee2374fbfee6"}, - {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3e2aff8b822ab0e0bdbed9f50494b3a35629c4b9488ae391659973a37a9f53f"}, - {file = "yarl-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22dda2799c8d39041d731e02bf7690f0ef34f1691d9ac9dfcb98dd1e94c8b058"}, - {file = "yarl-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18c2a7757561f05439c243f517dbbb174cadfae3a72dee4ae7c693f5b336570f"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:835010cc17d0020e7931d39e487d72c8e01c98e669b6896a8b8c9aa8ca69a949"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2254fe137c4a360b0a13173a56444f756252c9283ba4d267ca8e9081cd140ea"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a071d2c3d39b4104f94fc08ab349e9b19b951ad4b8e3b6d7ea92d6ef7ccaf8"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73a183042ae0918c82ce2df38c3db2409b0eeae88e3afdfc80fb67471a95b33b"}, - {file = "yarl-1.12.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326b8a079a9afcac0575971e56dabdf7abb2ea89a893e6949b77adfeb058b50e"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:126309c0f52a2219b3d1048aca00766429a1346596b186d51d9fa5d2070b7b13"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ba1c779b45a399cc25f511c681016626f69e51e45b9d350d7581998722825af9"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:af1107299cef049ad00a93df4809517be432283a0847bcae48343ebe5ea340dc"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:20d817c0893191b2ab0ba30b45b77761e8dfec30a029b7c7063055ca71157f84"}, - {file = "yarl-1.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d4f818f6371970d6a5d1e42878389bbfb69dcde631e4bbac5ec1cb11158565ca"}, - {file = "yarl-1.12.1-cp312-cp312-win32.whl", hash = "sha256:0ac33d22b2604b020569a82d5f8a03ba637ba42cc1adf31f616af70baf81710b"}, - {file = "yarl-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd24996e12e1ba7c397c44be75ca299da14cde34d74bc5508cce233676cc68d0"}, - {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dea360778e0668a7ad25d7727d03364de8a45bfd5d808f81253516b9f2217765"}, - {file = "yarl-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1f50a37aeeb5179d293465e522fd686080928c4d89e0ff215e1f963405ec4def"}, - {file = "yarl-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0274b1b7a9c9c32b7bf250583e673ff99fb9fccb389215841e2652d9982de740"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4f3ab9eb8ab2d585ece959c48d234f7b39ac0ca1954a34d8b8e58a52064bdb3"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d31dd0245d88cf7239e96e8f2a99f815b06e458a5854150f8e6f0e61618d41b"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a96198d5d26f40557d986c1253bfe0e02d18c9d9b93cf389daf1a3c9f7c755fa"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddae504cfb556fe220efae65e35be63cd11e3c314b202723fc2119ce19f0ca2e"}, - {file = "yarl-1.12.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bce00f3b1f7f644faae89677ca68645ed5365f1c7f874fdd5ebf730a69640d38"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eee5ff934b0c9f4537ff9596169d56cab1890918004791a7a06b879b3ba2a7ef"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4ea99e64b2ad2635e0f0597b63f5ea6c374791ff2fa81cdd4bad8ed9f047f56f"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c667b383529520b8dd6bd496fc318678320cb2a6062fdfe6d3618da6b8790f6"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d920401941cb898ef089422e889759dd403309eb370d0e54f1bdf6ca07fef603"}, - {file = "yarl-1.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:501a1576716032cc6d48c7c47bcdc42d682273415a8f2908e7e72cb4625801f3"}, - {file = "yarl-1.12.1-cp313-cp313-win32.whl", hash = "sha256:24416bb5e221e29ddf8aac5b97e94e635ca2c5be44a1617ad6fe32556df44294"}, - {file = "yarl-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:71af3766bb46738d12cc288d9b8de7ef6f79c31fd62757e2b8a505fe3680b27f"}, - {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c924deab8105f86980983eced740433fb7554a7f66db73991affa4eda99d5402"}, - {file = "yarl-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5fb475a4cdde582c9528bb412b98f899680492daaba318231e96f1a0a1bb0d53"}, - {file = "yarl-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:36ee0115b9edca904153a66bb74a9ff1ce38caff015de94eadfb9ba8e6ecd317"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2631c9d7386bd2d4ce24ecc6ebf9ae90b3efd713d588d90504eaa77fec4dba01"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2376d8cf506dffd0e5f2391025ae8675b09711016656590cb03b55894161fcfa"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24197ba3114cc85ddd4091e19b2ddc62650f2e4a899e51b074dfd52d56cf8c72"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfdf419bf5d3644f94cd7052954fc233522f5a1b371fc0b00219ebd9c14d5798"}, - {file = "yarl-1.12.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8112f640a4f7e7bf59f7cabf0d47a29b8977528c521d73a64d5cc9e99e48a174"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:607d12f0901f6419a8adceb139847c42c83864b85371f58270e42753f9780fa6"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:664380c7ed524a280b6a2d5d9126389c3e96cd6e88986cdb42ca72baa27421d6"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:0d0a5e87bc48d76dfcfc16295201e9812d5f33d55b4a0b7cad1025b92bf8b91b"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:eff6bac402719c14e17efe845d6b98593c56c843aca6def72080fbede755fd1f"}, - {file = "yarl-1.12.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:22839d1d1eab9e4b427828a88a22beb86f67c14d8ff81175505f1cc8493f3500"}, - {file = "yarl-1.12.1-cp38-cp38-win32.whl", hash = "sha256:717f185086bb9d817d4537dd18d5df5d657598cd00e6fc22e4d54d84de266c1d"}, - {file = "yarl-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:71978ba778948760cff528235c951ea0ef7a4f9c84ac5a49975f8540f76c3f73"}, - {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ffc046ebddccb3c4cac72c1a3e1bc343492336f3ca86d24672e90ccc5e788a"}, - {file = "yarl-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f10954b233d4df5cc3137ffa5ced97f8894152df817e5d149bf05a0ef2ab8134"}, - {file = "yarl-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2e912b282466444023610e4498e3795c10e7cfd641744524876239fcf01d538d"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6af871f70cfd5b528bd322c65793b5fd5659858cdfaa35fbe563fb99b667ed1f"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3e4e1f7b08d1ec6b685ccd3e2d762219c550164fbf524498532e39f9413436e"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a7ee79183f0b17dcede8b6723e7da2ded529cf159a878214be9a5d3098f5b1e"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96c8ff1e1dd680e38af0887927cab407a4e51d84a5f02ae3d6eb87233036c763"}, - {file = "yarl-1.12.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e9905fc2dc1319e4c39837b906a024cf71b1261cc66b0cd89678f779c0c61f5"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:01549468858b87d36f967c97d02e6e54106f444aeb947ed76f8f71f85ed07cec"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:96b34830bd6825ca0220bf005ea99ac83eb9ce51301ddb882dcf613ae6cd95fb"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2aee7594d2c2221c717a8e394bbed4740029df4c0211ceb0f04815686e99c795"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:15871130439ad10abb25a4631120d60391aa762b85fcab971411e556247210a0"}, - {file = "yarl-1.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:838dde2cb570cfbb4cab8a876a0974e8b90973ea40b3ac27a79b8a74c8a2db15"}, - {file = "yarl-1.12.1-cp39-cp39-win32.whl", hash = "sha256:eacbcf30efaca7dc5cb264228ffecdb95fdb1e715b1ec937c0ce6b734161e0c8"}, - {file = "yarl-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:76a59d1b63de859398bc7764c860a769499511463c1232155061fe0147f13e01"}, - {file = "yarl-1.12.1-py3-none-any.whl", hash = "sha256:dc3192a81ecd5ff954cecd690327badd5a84d00b877e1573f7c9097ce13e5bfb"}, - {file = "yarl-1.12.1.tar.gz", hash = "sha256:5b860055199aec8d6fe4dcee3c5196ce506ca198a50aab0059ffd26e8e815828"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -4744,4 +4760,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "5ce212cd91d45ab39cfe6e8af2953c5768fc793c54372befb43932ad845e44ba" +content-hash = "131b80f5dffb618dcb91a61508c08c7e7e126df1b7c0fb77368f758cf818f676" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 38d4a411833..a7324993cfd 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -1,10 +1,10 @@ [build-system] -requires = ["poetry-core>=1.0.0"] +requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain" -version = "0.3.1" +version = "0.3.2" description = "Building applications with LLMs through composability" authors = [] license = "MIT" @@ -12,12 +12,12 @@ readme = "README.md" repository = "https://github.com/langchain-ai/langchain" [tool.ruff] -exclude = ["tests/integration_tests/examples/non-utf8-encoding.py"] +exclude = [ "tests/integration_tests/examples/non-utf8-encoding.py",] [tool.mypy] ignore_missing_imports = "True" disallow_untyped_defs = "True" -exclude = ["notebooks", "examples", "example_data"] +exclude = [ "notebooks", "examples", "example_data",] [tool.codespell] skip = ".git,*.pdf,*.svg,*.pdf,*.yaml,*.ipynb,poetry.lock,*.min.js,*.css,package-lock.json,example_data,_dist,examples,*.trig" @@ -33,7 +33,7 @@ langchain-server = "langchain.server:main" [tool.poetry.dependencies] python = ">=3.9,<4.0" -langchain-core = "^0.3.6" +langchain-core = "^0.3.8" langchain-text-splitters = "^0.3.0" langsmith = "^0.1.17" pydantic = "^2.7.4" @@ -51,24 +51,16 @@ version = "^1.26.0" python = ">=3.12" [tool.ruff.lint] -select = ["E", "F", "I", "T201"] +select = [ "E", "F", "I", "T201",] [tool.coverage.run] -omit = ["tests/*"] +omit = [ "tests/*",] [tool.pytest.ini_options] addopts = "--strict-markers --strict-config --durations=5 --snapshot-warn-unused -vv" -markers = [ - "requires: mark tests as requiring a specific library", - "scheduled: mark tests to run in scheduled testing", - "compile: mark placeholder test used to compile integration tests without running them", -] +markers = [ "requires: mark tests as requiring a specific library", "scheduled: mark tests to run in scheduled testing", "compile: mark placeholder test used to compile integration tests without running them",] asyncio_mode = "auto" -filterwarnings = [ - "ignore::langchain_core._api.beta_decorator.LangChainBetaWarning", - "ignore::langchain_core._api.deprecation.LangChainDeprecationWarning:tests", - "ignore::langchain_core._api.deprecation.LangChainPendingDeprecationWarning:tests", -] +filterwarnings = [ "ignore::langchain_core._api.beta_decorator.LangChainBetaWarning", "ignore::langchain_core._api.deprecation.LangChainDeprecationWarning:tests", "ignore::langchain_core._api.deprecation.LangChainPendingDeprecationWarning:tests",] [tool.poetry.dependencies.async-timeout] version = "^4.0.0" @@ -107,11 +99,13 @@ pytest-mock = "^3.10.0" pytest-socket = "^0.6.0" syrupy = "^4.0.2" requests-mock = "^1.11.0" -# TODO: hack to fix 3.9 builds -cffi = [ - { version = "<1.17.1", python = "<3.10" }, - { version = "*", python = ">=3.10" }, -] +[[tool.poetry.group.test.dependencies.cffi]] +version = "<1.17.1" +python = "<3.10" + +[[tool.poetry.group.test.dependencies.cffi]] +version = "*" +python = ">=3.10" [tool.poetry.group.codespell.dependencies] codespell = "^2.2.0" @@ -125,11 +119,13 @@ langchainhub = "^0.1.16" [tool.poetry.group.lint.dependencies] ruff = "^0.5" -# TODO: hack to fix 3.9 builds -cffi = [ - { version = "<1.17.1", python = "<3.10" }, - { version = "*", python = ">=3.10" }, -] +[[tool.poetry.group.lint.dependencies.cffi]] +version = "<1.17.1" +python = "<3.10" + +[[tool.poetry.group.lint.dependencies.cffi]] +version = "*" +python = ">=3.10" [tool.poetry.group.typing.dependencies] mypy = "^1.10" From 47a9199fa6ed72510814dcdffbb1f6749eae5c21 Mon Sep 17 00:00:00 2001 From: Tibor Reiss <75096465+tibor-reiss@users.noreply.github.com> Date: Thu, 3 Oct 2024 22:12:11 +0200 Subject: [PATCH 13/62] community[patch]: Fix missing protected_namespaces (#27076) Fixes #26861 --------- Co-authored-by: Eugene Yurtsev --- libs/community/langchain_community/llms/azureml_endpoint.py | 4 +++- libs/community/langchain_community/llms/bedrock.py | 2 ++ libs/community/langchain_community/llms/minimax.py | 4 +++- libs/community/langchain_community/llms/vertexai.py | 4 +++- libs/community/langchain_community/llms/volcengine_maas.py | 4 +++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/libs/community/langchain_community/llms/azureml_endpoint.py b/libs/community/langchain_community/llms/azureml_endpoint.py index f2b5eed2e1c..5c34ca15477 100644 --- a/libs/community/langchain_community/llms/azureml_endpoint.py +++ b/libs/community/langchain_community/llms/azureml_endpoint.py @@ -9,7 +9,7 @@ from langchain_core.callbacks.manager import CallbackManagerForLLMRun from langchain_core.language_models.llms import BaseLLM from langchain_core.outputs import Generation, LLMResult from langchain_core.utils import convert_to_secret_str, get_from_dict_or_env -from pydantic import BaseModel, SecretStr, model_validator, validator +from pydantic import BaseModel, ConfigDict, SecretStr, model_validator, validator DEFAULT_TIMEOUT = 50 @@ -382,6 +382,8 @@ class AzureMLBaseEndpoint(BaseModel): model_kwargs: Optional[dict] = None """Keyword arguments to pass to the model.""" + model_config = ConfigDict(protected_namespaces=()) + @model_validator(mode="before") @classmethod def validate_environ(cls, values: Dict) -> Any: diff --git a/libs/community/langchain_community/llms/bedrock.py b/libs/community/langchain_community/llms/bedrock.py index 2436ca765b1..a0de3fb81e2 100644 --- a/libs/community/langchain_community/llms/bedrock.py +++ b/libs/community/langchain_community/llms/bedrock.py @@ -295,6 +295,8 @@ class LLMInputOutputAdapter: class BedrockBase(BaseModel, ABC): """Base class for Bedrock models.""" + model_config = ConfigDict(protected_namespaces=()) + client: Any = Field(exclude=True) #: :meta private: region_name: Optional[str] = None diff --git a/libs/community/langchain_community/llms/minimax.py b/libs/community/langchain_community/llms/minimax.py index e508eb4f959..5a1822fffb2 100644 --- a/libs/community/langchain_community/llms/minimax.py +++ b/libs/community/langchain_community/llms/minimax.py @@ -16,7 +16,7 @@ from langchain_core.callbacks import ( ) from langchain_core.language_models.llms import LLM from langchain_core.utils import convert_to_secret_str, get_from_dict_or_env, pre_init -from pydantic import BaseModel, Field, SecretStr, model_validator +from pydantic import BaseModel, ConfigDict, Field, SecretStr, model_validator from langchain_community.llms.utils import enforce_stop_tokens @@ -58,6 +58,8 @@ class _MinimaxEndpointClient(BaseModel): class MinimaxCommon(BaseModel): """Common parameters for Minimax large language models.""" + model_config = ConfigDict(protected_namespaces=()) + _client: _MinimaxEndpointClient model: str = "abab5.5-chat" """Model name to use.""" diff --git a/libs/community/langchain_community/llms/vertexai.py b/libs/community/langchain_community/llms/vertexai.py index 35fd883fdd7..0b42bd535ef 100644 --- a/libs/community/langchain_community/llms/vertexai.py +++ b/libs/community/langchain_community/llms/vertexai.py @@ -11,7 +11,7 @@ from langchain_core.callbacks.manager import ( from langchain_core.language_models.llms import BaseLLM from langchain_core.outputs import Generation, GenerationChunk, LLMResult from langchain_core.utils import pre_init -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field from langchain_community.utilities.vertexai import ( create_retry_decorator, @@ -100,6 +100,8 @@ async def acompletion_with_retry( class _VertexAIBase(BaseModel): + model_config = ConfigDict(protected_namespaces=()) + project: Optional[str] = None "The default GCP project to use when making Vertex API calls." location: str = "us-central1" diff --git a/libs/community/langchain_community/llms/volcengine_maas.py b/libs/community/langchain_community/llms/volcengine_maas.py index c62c3523bb3..e737a0a5569 100644 --- a/libs/community/langchain_community/llms/volcengine_maas.py +++ b/libs/community/langchain_community/llms/volcengine_maas.py @@ -6,12 +6,14 @@ from langchain_core.callbacks import CallbackManagerForLLMRun from langchain_core.language_models.llms import LLM from langchain_core.outputs import GenerationChunk from langchain_core.utils import convert_to_secret_str, get_from_dict_or_env, pre_init -from pydantic import BaseModel, Field, SecretStr +from pydantic import BaseModel, ConfigDict, Field, SecretStr class VolcEngineMaasBase(BaseModel): """Base class for VolcEngineMaas models.""" + model_config = ConfigDict(protected_namespaces=()) + client: Any = None volc_engine_maas_ak: Optional[SecretStr] = None From 7f730ce8b228776e35b2aa01fbb1f332b429a0c0 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Thu, 3 Oct 2024 13:34:24 -0700 Subject: [PATCH 14/62] docs: remove spaces in percent pip (#27082) --- docs/docs/integrations/document_loaders/airbyte.ipynb | 2 +- docs/docs/integrations/document_loaders/browserbase.ipynb | 2 +- docs/docs/tutorials/local_rag.ipynb | 2 +- docs/docs/versions/migrating_chains/map_reduce_chain.ipynb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/integrations/document_loaders/airbyte.ipynb b/docs/docs/integrations/document_loaders/airbyte.ipynb index 1c992782f19..e0afa4e603b 100644 --- a/docs/docs/integrations/document_loaders/airbyte.ipynb +++ b/docs/docs/integrations/document_loaders/airbyte.ipynb @@ -29,7 +29,7 @@ "metadata": {}, "outputs": [], "source": [ - "% pip install -qU langchain-airbyte" + "%pip install -qU langchain-airbyte" ] }, { diff --git a/docs/docs/integrations/document_loaders/browserbase.ipynb b/docs/docs/integrations/document_loaders/browserbase.ipynb index ae497ba6dad..149fef73861 100644 --- a/docs/docs/integrations/document_loaders/browserbase.ipynb +++ b/docs/docs/integrations/document_loaders/browserbase.ipynb @@ -26,7 +26,7 @@ "metadata": {}, "outputs": [], "source": [ - "% pip install browserbase" + "%pip install browserbase" ] }, { diff --git a/docs/docs/tutorials/local_rag.ipynb b/docs/docs/tutorials/local_rag.ipynb index bdff9dfdfcf..01712fa94a5 100644 --- a/docs/docs/tutorials/local_rag.ipynb +++ b/docs/docs/tutorials/local_rag.ipynb @@ -60,7 +60,7 @@ "%pip install -qU langchain_ollama\n", "\n", "# Web Loader\n", - "% pip install -qU beautifulsoup4" + "%pip install -qU beautifulsoup4" ] }, { diff --git a/docs/docs/versions/migrating_chains/map_reduce_chain.ipynb b/docs/docs/versions/migrating_chains/map_reduce_chain.ipynb index 40ca0040082..4f03f98092e 100644 --- a/docs/docs/versions/migrating_chains/map_reduce_chain.ipynb +++ b/docs/docs/versions/migrating_chains/map_reduce_chain.ipynb @@ -196,7 +196,7 @@ "metadata": {}, "outputs": [], "source": [ - "% pip install -qU langgraph" + "%pip install -qU langgraph" ] }, { From cc1b8b3d30fd022735f07f72e0a691060aaa790c Mon Sep 17 00:00:00 2001 From: Sean Date: Thu, 3 Oct 2024 13:36:04 -0700 Subject: [PATCH 15/62] docs: Documentation update for Document Parse (#26844) Renamed `Layout Analysis` to `Document Parser` in the doc as we have recently renamed it! --------- Co-authored-by: Erick Friis --- docs/docs/integrations/document_loaders/upstage.ipynb | 8 ++++---- docs/docs/integrations/providers/upstage.ipynb | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/docs/integrations/document_loaders/upstage.ipynb b/docs/docs/integrations/document_loaders/upstage.ipynb index c6348b758a8..6eb29aec203 100644 --- a/docs/docs/integrations/document_loaders/upstage.ipynb +++ b/docs/docs/integrations/document_loaders/upstage.ipynb @@ -25,9 +25,9 @@ } }, "source": [ - "# UpstageLayoutAnalysisLoader\n", + "# UpstageDocumentParseLoader\n", "\n", - "This notebook covers how to get started with `UpstageLayoutAnalysisLoader`.\n", + "This notebook covers how to get started with `UpstageDocumentParseLoader`.\n", "\n", "## Installation\n", "\n", @@ -89,10 +89,10 @@ } ], "source": [ - "from langchain_upstage import UpstageLayoutAnalysisLoader\n", + "from langchain_upstage import UpstageDocumentParseLoader\n", "\n", "file_path = \"/PATH/TO/YOUR/FILE.pdf\"\n", - "layzer = UpstageLayoutAnalysisLoader(file_path, split=\"page\")\n", + "layzer = UpstageDocumentParseLoader(file_path, split=\"page\")\n", "\n", "# For improved memory efficiency, consider using the lazy_load method to load documents page by page.\n", "docs = layzer.load() # or layzer.lazy_load()\n", diff --git a/docs/docs/integrations/providers/upstage.ipynb b/docs/docs/integrations/providers/upstage.ipynb index 9dfce63e351..8e5cb603109 100644 --- a/docs/docs/integrations/providers/upstage.ipynb +++ b/docs/docs/integrations/providers/upstage.ipynb @@ -10,7 +10,7 @@ ">\n", ">**Solar Mini Chat** is a fast yet powerful advanced large language model focusing on English and Korean. It has been specifically fine-tuned for multi-turn chat purposes, showing enhanced performance across a wide range of natural language processing tasks, like multi-turn conversation or tasks that require an understanding of long contexts, such as RAG (Retrieval-Augmented Generation), compared to other models of a similar size. This fine-tuning equips it with the ability to handle longer conversations more effectively, making it particularly adept for interactive applications.\n", "\n", - ">Other than Solar, Upstage also offers features for real-world RAG (retrieval-augmented generation), such as **Groundedness Check** and **Layout Analysis**. \n" + ">Other than Solar, Upstage also offers features for real-world RAG (retrieval-augmented generation), such as **Document Parse** and **Groundedness Check**. \n" ] }, { @@ -24,7 +24,7 @@ "| Chat | Build assistants using Solar Mini Chat | `from langchain_upstage import ChatUpstage` | [Go](../../chat/upstage) |\n", "| Text Embedding | Embed strings to vectors | `from langchain_upstage import UpstageEmbeddings` | [Go](../../text_embedding/upstage) |\n", "| Groundedness Check | Verify groundedness of assistant's response | `from langchain_upstage import UpstageGroundednessCheck` | [Go](../../tools/upstage_groundedness_check) |\n", - "| Layout Analysis | Serialize documents with tables and figures | `from langchain_upstage import UpstageLayoutAnalysisLoader` | [Go](../../document_loaders/upstage) |\n", + "| Document Parse | Serialize documents with tables and figures | `from langchain_upstage import UpstageDocumentParseLoader` | [Go](../../document_loaders/upstage) |\n", "\n", "See [documentations](https://developers.upstage.ai/) for more details about the features." ] @@ -122,7 +122,7 @@ "source": [ "## Document loader\n", "\n", - "### Layout Analysis\n", + "### Document Parse\n", "\n", "See [a usage example](/docs/integrations/document_loaders/upstage)." ] @@ -133,10 +133,10 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain_upstage import UpstageLayoutAnalysisLoader\n", + "from langchain_upstage import UpstageDocumentParseLoader\n", "\n", "file_path = \"/PATH/TO/YOUR/FILE.pdf\"\n", - "layzer = UpstageLayoutAnalysisLoader(file_path, split=\"page\")\n", + "layzer = UpstageDocumentParseLoader(file_path, split=\"page\")\n", "\n", "# For improved memory efficiency, consider using the lazy_load method to load documents page by page.\n", "docs = layzer.load() # or layzer.lazy_load()\n", From 546dc44da58c189b8f8f987f361d721075c3b06d Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:36:17 -0700 Subject: [PATCH 16/62] core[patch]: add UsageMetadata details (#27072) --- libs/core/langchain_core/messages/ai.py | 97 ++- libs/core/pyproject.toml | 2 +- .../prompts/__snapshots__/test_chat.ambr | 180 ++++- .../runnables/__snapshots__/test_graph.ambr | 90 ++- .../__snapshots__/test_runnable.ambr | 720 +++++++++++++++++- .../integration_tests/chat_models.py | 65 ++ .../unit_tests/chat_models.py | 14 + 7 files changed, 1127 insertions(+), 41 deletions(-) diff --git a/libs/core/langchain_core/messages/ai.py b/libs/core/langchain_core/messages/ai.py index 03a22e79764..dece1e575ee 100644 --- a/libs/core/langchain_core/messages/ai.py +++ b/libs/core/langchain_core/messages/ai.py @@ -2,7 +2,7 @@ import json from typing import Any, Literal, Optional, Union from pydantic import model_validator -from typing_extensions import Self, TypedDict +from typing_extensions import NotRequired, Self, TypedDict from langchain_core.messages.base import ( BaseMessage, @@ -29,6 +29,66 @@ from langchain_core.utils._merge import merge_dicts, merge_lists from langchain_core.utils.json import parse_partial_json +class InputTokenDetails(TypedDict, total=False): + """Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + """ + + audio: int + """Audio input tokens.""" + cache_creation: int + """Input tokens that were cached and there was a cache miss. + + Since there was a cache miss, the cache was created from these tokens. + """ + cache_read: int + """Input tokens that were cached and there was a cache hit. + + Since there was a cache hit, the tokens were read from the cache. More precisely, + the model state given these tokens was read from the cache. + """ + + +class OutputTokenDetails(TypedDict, total=False): + """Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + """ + + audio: int + """Audio output tokens.""" + reasoning: int + """Reasoning output tokens. + + Tokens generated by the model in a chain of thought process (i.e. by OpenAI's o1 + models) that are not returned as part of model output. + """ + + class UsageMetadata(TypedDict): """Usage metadata for a message, such as token counts. @@ -39,18 +99,41 @@ class UsageMetadata(TypedDict): .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. """ input_tokens: int - """Count of input (or prompt) tokens.""" + """Count of input (or prompt) tokens. Sum of all input token types.""" output_tokens: int - """Count of output (or completion) tokens.""" + """Count of output (or completion) tokens. Sum of all output token types.""" total_tokens: int - """Total token count.""" + """Total token count. Sum of input_tokens + output_tokens.""" + input_token_details: NotRequired[InputTokenDetails] + """Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + """ + output_token_details: NotRequired[OutputTokenDetails] + """Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + """ class AIMessage(BaseMessage): diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index 11a2e85aa37..20dbf792c95 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -45,7 +45,7 @@ python = ">=3.12.4" [tool.ruff.lint] select = [ "B", "C4", "E", "F", "I", "N", "PIE", "SIM", "T201", "UP", "W",] -ignore = [ "UP007",] +ignore = [ "UP007", 'W293'] [tool.coverage.run] omit = [ "tests/*",] diff --git a/libs/core/tests/unit_tests/prompts/__snapshots__/test_chat.ambr b/libs/core/tests/unit_tests/prompts/__snapshots__/test_chat.ambr index 5a235a0f9f9..7e35bd6c465 100644 --- a/libs/core/tests/unit_tests/prompts/__snapshots__/test_chat.ambr +++ b/libs/core/tests/unit_tests/prompts/__snapshots__/test_chat.ambr @@ -677,6 +677,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -743,6 +778,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'SystemMessage': dict({ 'additionalProperties': True, 'description': ''' @@ -1245,16 +1310,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/$defs/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/$defs/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -2008,6 +2092,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -2074,6 +2193,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'SystemMessage': dict({ 'additionalProperties': True, 'description': ''' @@ -2576,16 +2725,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/$defs/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/$defs/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', diff --git a/libs/core/tests/unit_tests/runnables/__snapshots__/test_graph.ambr b/libs/core/tests/unit_tests/runnables/__snapshots__/test_graph.ambr index aa70b9bb5a3..ba9d742b374 100644 --- a/libs/core/tests/unit_tests/runnables/__snapshots__/test_graph.ambr +++ b/libs/core/tests/unit_tests/runnables/__snapshots__/test_graph.ambr @@ -1037,6 +1037,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -1103,6 +1138,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'SystemMessage': dict({ 'additionalProperties': True, 'description': ''' @@ -1605,16 +1670,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/$defs/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/$defs/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', diff --git a/libs/core/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr b/libs/core/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr index 045b9eced27..85b53552716 100644 --- a/libs/core/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr +++ b/libs/core/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr @@ -2639,6 +2639,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -2705,6 +2740,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'SystemMessage': dict({ 'additionalProperties': True, 'description': ''' @@ -3207,16 +3272,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/$defs/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/$defs/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -4028,6 +4112,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -4094,6 +4213,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'StringPromptValue': dict({ 'description': 'String prompt value.', 'properties': dict({ @@ -4615,16 +4764,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/$defs/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/$defs/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -5448,6 +5616,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -5514,6 +5717,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'StringPromptValue': dict({ 'description': 'String prompt value.', 'properties': dict({ @@ -6035,16 +6268,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/definitions/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/definitions/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -6744,6 +6996,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -6810,6 +7097,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'SystemMessage': dict({ 'additionalProperties': True, 'description': ''' @@ -7312,16 +7629,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/definitions/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/definitions/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -8175,6 +8511,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -8241,6 +8612,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'StringPromptValue': dict({ 'description': 'String prompt value.', 'properties': dict({ @@ -8762,16 +9163,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/definitions/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/definitions/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -9516,6 +9936,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -9582,6 +10037,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'SystemMessage': dict({ 'additionalProperties': True, 'description': ''' @@ -10084,16 +10569,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/definitions/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/definitions/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -10855,6 +11359,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -10921,6 +11460,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'PromptTemplateOutput': dict({ 'anyOf': list([ dict({ @@ -11453,16 +12022,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/definitions/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/definitions/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', @@ -12236,6 +12824,41 @@ 'title': 'HumanMessageChunk', 'type': 'object', }), + 'InputTokenDetails': dict({ + 'description': ''' + Breakdown of input token counts. + + Does *not* need to sum to full input token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'cache_creation': dict({ + 'title': 'Cache Creation', + 'type': 'integer', + }), + 'cache_read': dict({ + 'title': 'Cache Read', + 'type': 'integer', + }), + }), + 'title': 'InputTokenDetails', + 'type': 'object', + }), 'InvalidToolCall': dict({ 'description': ''' Allowance for errors made by LLM. @@ -12302,6 +12925,36 @@ 'title': 'InvalidToolCall', 'type': 'object', }), + 'OutputTokenDetails': dict({ + 'description': ''' + Breakdown of output token counts. + + Does *not* need to sum to full output token count. Does *not* need to have all keys. + + Example: + + .. code-block:: python + + { + "audio": 10, + "reasoning": 200, + } + + .. versionadded:: 0.3.9 + ''', + 'properties': dict({ + 'audio': dict({ + 'title': 'Audio', + 'type': 'integer', + }), + 'reasoning': dict({ + 'title': 'Reasoning', + 'type': 'integer', + }), + }), + 'title': 'OutputTokenDetails', + 'type': 'object', + }), 'StringPromptValue': dict({ 'description': 'String prompt value.', 'properties': dict({ @@ -12823,16 +13476,35 @@ .. code-block:: python { - "input_tokens": 10, - "output_tokens": 20, - "total_tokens": 30 + "input_tokens": 350, + "output_tokens": 240, + "total_tokens": 590, + "input_token_details": { + "audio": 10, + "cache_creation": 200, + "cache_read": 100, + }, + "output_token_details": { + "audio": 10, + "reasoning": 200, + } } + + .. versionchanged:: 0.3.9 + + Added ``input_token_details`` and ``output_token_details``. ''', 'properties': dict({ + 'input_token_details': dict({ + '$ref': '#/definitions/InputTokenDetails', + }), 'input_tokens': dict({ 'title': 'Input Tokens', 'type': 'integer', }), + 'output_token_details': dict({ + '$ref': '#/definitions/OutputTokenDetails', + }), 'output_tokens': dict({ 'title': 'Output Tokens', 'type': 'integer', diff --git a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py index c5ac855cdc6..1da209095ef 100644 --- a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py @@ -151,6 +151,31 @@ class ChatModelIntegrationTests(ChatModelTests): assert isinstance(result.usage_metadata["output_tokens"], int) assert isinstance(result.usage_metadata["total_tokens"], int) + if "audio_input" in self.supported_usage_metadata_details: + msg = self.invoke_with_audio_input() + assert isinstance(msg.usage_metadata["input_token_details"]["audio"], int) # type: ignore[index] + if "audio_output" in self.supported_usage_metadata_details: + msg = self.invoke_with_audio_output() + assert isinstance(msg.usage_metadata["output_token_details"]["audio"], int) # type: ignore[index] + if "reasoning_output" in self.supported_usage_metadata_details: + msg = self.invoke_with_reasoning_output() + assert isinstance( + msg.usage_metadata["output_token_details"]["reasoning"], # type: ignore[index] + int, + ) + if "cache_read_input" in self.supported_usage_metadata_details: + msg = self.invoke_with_cache_read_input() + assert isinstance( + msg.usage_metadata["input_token_details"]["cache_read"], # type: ignore[index] + int, + ) + if "cache_creation_input" in self.supported_usage_metadata_details: + msg = self.invoke_with_cache_creation_input() + assert isinstance( + msg.usage_metadata["input_token_details"]["cache_creation"], # type: ignore[index] + int, + ) + def test_usage_metadata_streaming(self, model: BaseChatModel) -> None: if not self.returns_usage_metadata: pytest.skip("Not implemented.") @@ -164,6 +189,31 @@ class ChatModelIntegrationTests(ChatModelTests): assert isinstance(full.usage_metadata["output_tokens"], int) assert isinstance(full.usage_metadata["total_tokens"], int) + if "audio_input" in self.supported_usage_metadata_details: + msg = self.invoke_with_audio_input(stream=True) + assert isinstance(msg.usage_metadata["input_token_details"]["audio"], int) # type: ignore[index] + if "audio_output" in self.supported_usage_metadata_details: + msg = self.invoke_with_audio_output(stream=True) + assert isinstance(msg.usage_metadata["output_token_details"]["audio"], int) # type: ignore[index] + if "reasoning_output" in self.supported_usage_metadata_details: + msg = self.invoke_with_reasoning_output(stream=True) + assert isinstance( + msg.usage_metadata["output_token_details"]["reasoning"], # type: ignore[index] + int, + ) + if "cache_read_input" in self.supported_usage_metadata_details: + msg = self.invoke_with_cache_read_input(stream=True) + assert isinstance( + msg.usage_metadata["input_token_details"]["cache_read"], # type: ignore[index] + int, + ) + if "cache_creation_input" in self.supported_usage_metadata_details: + msg = self.invoke_with_cache_creation_input(stream=True) + assert isinstance( + msg.usage_metadata["input_token_details"]["cache_creation"], # type: ignore[index] + int, + ) + def test_stop_sequence(self, model: BaseChatModel) -> None: result = model.invoke("hi", stop=["you"]) assert isinstance(result, AIMessage) @@ -608,3 +658,18 @@ class ChatModelIntegrationTests(ChatModelTests): assert isinstance(result, AIMessage) assert isinstance(result.content, str) assert len(result.content) > 0 + + def invoke_with_audio_input(self, *, stream: bool = False) -> AIMessage: + raise NotImplementedError() + + def invoke_with_audio_output(self, *, stream: bool = False) -> AIMessage: + raise NotImplementedError() + + def invoke_with_reasoning_output(self, *, stream: bool = False) -> AIMessage: + raise NotImplementedError() + + def invoke_with_cache_read_input(self, *, stream: bool = False) -> AIMessage: + raise NotImplementedError() + + def invoke_with_cache_creation_input(self, *, stream: bool = False) -> AIMessage: + raise NotImplementedError() diff --git a/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py index 1a611f1800f..1298c022852 100644 --- a/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py @@ -138,6 +138,20 @@ class ChatModelTests(BaseStandardTests): def supports_image_tool_message(self) -> bool: return False + @property + def supported_usage_metadata_details( + self, + ) -> List[ + Literal[ + "audio_input", + "audio_output", + "reasoning_output", + "cache_read_input", + "cache_creation_input", + ] + ]: + return [] + class ChatModelUnitTests(ChatModelTests): @property From c09da539788e8531de2c03ec588409f2cbb8508c Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 3 Oct 2024 14:01:03 -0700 Subject: [PATCH 17/62] openai[patch]: add usage metadata details (#27080) --- .../langchain_openai/chat_models/base.py | 57 +++++++++++++------ .../chat_models/test_base_standard.py | 51 ++++++++++++++++- 2 files changed, 91 insertions(+), 17 deletions(-) diff --git a/libs/partners/openai/langchain_openai/chat_models/base.py b/libs/partners/openai/langchain_openai/chat_models/base.py index 21754937d18..27d4adf0681 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -63,7 +63,11 @@ from langchain_core.messages import ( ToolMessage, ToolMessageChunk, ) -from langchain_core.messages.ai import UsageMetadata +from langchain_core.messages.ai import ( + InputTokenDetails, + OutputTokenDetails, + UsageMetadata, +) from langchain_core.messages.tool import tool_call_chunk from langchain_core.output_parsers import JsonOutputParser, PydanticOutputParser from langchain_core.output_parsers.openai_tools import ( @@ -286,16 +290,10 @@ def _convert_chunk_to_generation_chunk( ) -> Optional[ChatGenerationChunk]: token_usage = chunk.get("usage") choices = chunk.get("choices", []) - usage_metadata: Optional[UsageMetadata] = ( - UsageMetadata( - input_tokens=token_usage.get("prompt_tokens", 0), - output_tokens=token_usage.get("completion_tokens", 0), - total_tokens=token_usage.get("total_tokens", 0), - ) - if token_usage - else None - ) + usage_metadata: Optional[UsageMetadata] = ( + _create_usage_metadata(token_usage) if token_usage else None + ) if len(choices) == 0: # logprobs is implicitly None generation_chunk = ChatGenerationChunk( @@ -721,15 +719,11 @@ class BaseChatOpenAI(BaseChatModel): if response_dict.get("error"): raise ValueError(response_dict.get("error")) - token_usage = response_dict.get("usage", {}) + token_usage = response_dict.get("usage") for res in response_dict["choices"]: message = _convert_dict_to_message(res["message"]) if token_usage and isinstance(message, AIMessage): - message.usage_metadata = { - "input_tokens": token_usage.get("prompt_tokens", 0), - "output_tokens": token_usage.get("completion_tokens", 0), - "total_tokens": token_usage.get("total_tokens", 0), - } + message.usage_metadata = _create_usage_metadata(token_usage) generation_info = generation_info or {} generation_info["finish_reason"] = ( res.get("finish_reason") @@ -2160,3 +2154,34 @@ class OpenAIRefusalError(Exception): .. versionadded:: 0.1.21 """ + + +def _create_usage_metadata(oai_token_usage: dict) -> UsageMetadata: + input_tokens = oai_token_usage.get("prompt_tokens", 0) + output_tokens = oai_token_usage.get("completion_tokens", 0) + total_tokens = oai_token_usage.get("total_tokens", input_tokens + output_tokens) + input_token_details: dict = { + "audio": oai_token_usage.get("prompt_tokens_details", {}).get("audio_tokens"), + "cache_read": oai_token_usage.get("prompt_tokens_details", {}).get( + "cached_tokens" + ), + } + output_token_details: dict = { + "audio": oai_token_usage.get("completion_tokens_details", {}).get( + "audio_tokens" + ), + "reasoning": oai_token_usage.get("completion_tokens_details", {}).get( + "reasoning_tokens" + ), + } + return UsageMetadata( + input_tokens=input_tokens, + output_tokens=output_tokens, + total_tokens=total_tokens, + input_token_details=InputTokenDetails( + **{k: v for k, v in input_token_details.items() if v is not None} + ), + output_token_details=OutputTokenDetails( + **{k: v for k, v in output_token_details.items() if v is not None} + ), + ) diff --git a/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py b/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py index 22b305c9753..b91b590ad7c 100644 --- a/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py +++ b/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py @@ -1,12 +1,16 @@ """Standard LangChain interface tests""" -from typing import Type +from pathlib import Path +from typing import List, Literal, Type, cast from langchain_core.language_models import BaseChatModel +from langchain_core.messages import AIMessage from langchain_standard_tests.integration_tests import ChatModelIntegrationTests from langchain_openai import ChatOpenAI +REPO_ROOT_DIR = Path(__file__).parents[6] + class TestOpenAIStandard(ChatModelIntegrationTests): @property @@ -20,3 +24,48 @@ class TestOpenAIStandard(ChatModelIntegrationTests): @property def supports_image_inputs(self) -> bool: return True + + @property + def supported_usage_metadata_details( + self, + ) -> List[ + Literal[ + "audio_input", + "audio_output", + "reasoning_output", + "cache_read_input", + "cache_creation_input", + ] + ]: + return ["reasoning_output", "cache_read_input"] + + def invoke_with_cache_read_input(self, *, stream: bool = False) -> AIMessage: + with open(REPO_ROOT_DIR / "README.md", "r") as f: + readme = f.read() + + input_ = f"""What's langchain? Here's the langchain README: + + {readme} + """ + llm = ChatOpenAI(model="gpt-4o-mini", stream_usage=True) + _invoke(llm, input_, stream) + # invoke twice so first invocation is cached + return _invoke(llm, input_, stream) + + def invoke_with_reasoning_output(self, *, stream: bool = False) -> AIMessage: + llm = ChatOpenAI(model="o1-mini", stream_usage=True, temperature=1) + input_ = ( + "explain the relationship between the 2008/9 economic crisis and the " + "startup ecosystem in the early 2010s" + ) + return _invoke(llm, input_, stream) + + +def _invoke(llm: ChatOpenAI, input_: str, stream: bool) -> AIMessage: + if stream: + full = None + for chunk in llm.stream(input_): + full = full + chunk if full else chunk # type: ignore[operator] + return cast(AIMessage, full) + else: + return cast(AIMessage, llm.invoke(input_)) From 87fc5ce688d04ebaabe404be788588ebc7e9927d Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 3 Oct 2024 15:00:31 -0700 Subject: [PATCH 18/62] core[patch]: exclude model cache from ser (#27086) --- .../langchain_core/language_models/base.py | 2 +- .../language_models/chat_models/test_cache.py | 30 +------------------ .../tests/unit_tests/chat_models/test_base.py | 2 -- 3 files changed, 2 insertions(+), 32 deletions(-) diff --git a/libs/core/langchain_core/language_models/base.py b/libs/core/langchain_core/language_models/base.py index 2df436f780f..93ebe523d89 100644 --- a/libs/core/langchain_core/language_models/base.py +++ b/libs/core/langchain_core/language_models/base.py @@ -98,7 +98,7 @@ class BaseLanguageModel( All language model wrappers inherited from BaseLanguageModel. """ - cache: Union[BaseCache, bool, None] = None + cache: Union[BaseCache, bool, None] = Field(default=None, exclude=True) """Whether to cache the response. * If true, will use the global cache. diff --git a/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py b/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py index 3992420621a..d2455f7a619 100644 --- a/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py +++ b/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py @@ -303,9 +303,7 @@ def test_llm_representation_for_serializable() -> None: chat = CustomChat(cache=cache, messages=iter([])) assert chat._get_llm_string() == ( '{"id": ["tests", "unit_tests", "language_models", "chat_models", ' - '"test_cache", "CustomChat"], "kwargs": {"cache": {"id": ["tests", ' - '"unit_tests", "language_models", "chat_models", "test_cache", ' - '"InMemoryCache"], "lc": 1, "type": "not_implemented"}, "messages": {"id": ' + '"test_cache", "CustomChat"], "kwargs": {"messages": {"id": ' '["builtins", "list_iterator"], "lc": 1, "type": "not_implemented"}}, "lc": ' '1, "name": "CustomChat", "type": "constructor"}---[(\'stop\', None)]' ) @@ -324,20 +322,6 @@ def test_cleanup_serialized() -> None: "CustomChat", ], "kwargs": { - "cache": { - "lc": 1, - "type": "not_implemented", - "id": [ - "tests", - "unit_tests", - "language_models", - "chat_models", - "test_cache", - "InMemoryCache", - ], - "repr": "", - }, "messages": { "lc": 1, "type": "not_implemented", @@ -380,18 +364,6 @@ def test_cleanup_serialized() -> None: "CustomChat", ], "kwargs": { - "cache": { - "id": [ - "tests", - "unit_tests", - "language_models", - "chat_models", - "test_cache", - "InMemoryCache", - ], - "lc": 1, - "type": "not_implemented", - }, "messages": { "id": ["builtins", "list_iterator"], "lc": 1, diff --git a/libs/langchain/tests/unit_tests/chat_models/test_base.py b/libs/langchain/tests/unit_tests/chat_models/test_base.py index b82dead3099..8b7f6445697 100644 --- a/libs/langchain/tests/unit_tests/chat_models/test_base.py +++ b/libs/langchain/tests/unit_tests/chat_models/test_base.py @@ -101,7 +101,6 @@ def test_configurable() -> None: "name": None, "bound": { "name": None, - "cache": None, "disable_streaming": False, "disabled_params": None, "model_name": "gpt-4o", @@ -189,7 +188,6 @@ def test_configurable_with_default() -> None: "name": None, "bound": { "name": None, - "cache": None, "disable_streaming": False, "model": "claude-3-sonnet-20240229", "max_tokens": 1024, From ab4dab9a0c174fea5a80da21579f418ad6d329bd Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Thu, 3 Oct 2024 16:14:31 -0700 Subject: [PATCH 19/62] core: fix batch race condition in FakeListChatModel (#26924) fixed #26273 --- .../language_models/fake_chat_models.py | 28 +++++++++++++++++++ .../unit_tests/fake/test_fake_chat_model.py | 19 ++++++++++++- .../language_models/chat_models/test_cache.py | 10 ++----- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/libs/core/langchain_core/language_models/fake_chat_models.py b/libs/core/langchain_core/language_models/fake_chat_models.py index 6476db5f825..8dc4e55695c 100644 --- a/libs/core/langchain_core/language_models/fake_chat_models.py +++ b/libs/core/langchain_core/language_models/fake_chat_models.py @@ -13,6 +13,7 @@ from langchain_core.callbacks import ( from langchain_core.language_models.chat_models import BaseChatModel, SimpleChatModel from langchain_core.messages import AIMessage, AIMessageChunk, BaseMessage from langchain_core.outputs import ChatGeneration, ChatGenerationChunk, ChatResult +from langchain_core.runnables import RunnableConfig class FakeMessagesListChatModel(BaseChatModel): @@ -128,6 +129,33 @@ class FakeListChatModel(SimpleChatModel): def _identifying_params(self) -> dict[str, Any]: return {"responses": self.responses} + # manually override batch to preserve batch ordering with no concurrency + def batch( + self, + inputs: list[Any], + config: Optional[Union[RunnableConfig, list[RunnableConfig]]] = None, + *, + return_exceptions: bool = False, + **kwargs: Any, + ) -> list[BaseMessage]: + if isinstance(config, list): + return [self.invoke(m, c, **kwargs) for m, c in zip(inputs, config)] + return [self.invoke(m, config, **kwargs) for m in inputs] + + async def abatch( + self, + inputs: list[Any], + config: Optional[Union[RunnableConfig, list[RunnableConfig]]] = None, + *, + return_exceptions: bool = False, + **kwargs: Any, + ) -> list[BaseMessage]: + if isinstance(config, list): + # do Not use an async iterator here because need explicit ordering + return [await self.ainvoke(m, c, **kwargs) for m, c in zip(inputs, config)] + # do Not use an async iterator here because need explicit ordering + return [await self.ainvoke(m, config, **kwargs) for m in inputs] + class FakeChatModel(SimpleChatModel): """Fake Chat Model wrapper for testing purposes.""" diff --git a/libs/core/tests/unit_tests/fake/test_fake_chat_model.py b/libs/core/tests/unit_tests/fake/test_fake_chat_model.py index 1829bf773ce..7502e17c50f 100644 --- a/libs/core/tests/unit_tests/fake/test_fake_chat_model.py +++ b/libs/core/tests/unit_tests/fake/test_fake_chat_model.py @@ -5,7 +5,11 @@ from typing import Any, Optional, Union from uuid import UUID from langchain_core.callbacks.base import AsyncCallbackHandler -from langchain_core.language_models import GenericFakeChatModel, ParrotFakeChatModel +from langchain_core.language_models import ( + FakeListChatModel, + GenericFakeChatModel, + ParrotFakeChatModel, +) from langchain_core.messages import AIMessage, AIMessageChunk, BaseMessage from langchain_core.outputs import ChatGenerationChunk, GenerationChunk from tests.unit_tests.stubs import ( @@ -205,3 +209,16 @@ def test_chat_model_inputs() -> None: assert fake.invoke([AIMessage(content="blah")]) == _any_id_ai_message( content="blah" ) + + +def test_fake_list_chat_model_batch() -> None: + expected = [ + _any_id_ai_message(content="a"), + _any_id_ai_message(content="b"), + _any_id_ai_message(content="c"), + ] + for _ in range(20): + # run this 20 times to test race condition in batch + fake = FakeListChatModel(responses=["a", "b", "c"]) + resp = fake.batch(["1", "2", "3"]) + assert resp == expected diff --git a/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py b/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py index d2455f7a619..0d5b89de7c3 100644 --- a/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py +++ b/libs/core/tests/unit_tests/language_models/chat_models/test_cache.py @@ -199,19 +199,13 @@ async def test_global_cache_abatch() -> None: assert results[0].content == "hello" assert results[1].content == "hello" - ## RACE CONDITION -- note behavior is different from sync - # Now, reset cache and test the race condition - # For now we just hard-code the result, if this changes - # we can investigate further global_cache = InMemoryCache() set_llm_cache(global_cache) assert global_cache._cache == {} results = await chat_model.abatch(["prompt", "prompt"]) - # suspecting that tasks will be scheduled and executed in order - # if this ever fails, we can relax to a set comparison - # Cache misses likely guaranteed? + assert results[0].content == "meow" - assert results[1].content == "woof" + assert results[1].content == "meow" finally: set_llm_cache(None) From 47142eb6ee3ce29dc52c21601a0d118475687b94 Mon Sep 17 00:00:00 2001 From: Rashmi Pawar <168514198+raspawar@users.noreply.github.com> Date: Fri, 4 Oct 2024 05:02:45 +0530 Subject: [PATCH 20/62] docs: Integrations NVIDIA llm documentation (#26934) **Description:** Add Notebook for NVIDIA prompt completion llm class. cc: @sumitkbh @mattf @dglogo --------- Co-authored-by: Erick Friis --- .../llms/nvidia_ai_endpoints.ipynb | 309 ++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 docs/docs/integrations/llms/nvidia_ai_endpoints.ipynb diff --git a/docs/docs/integrations/llms/nvidia_ai_endpoints.ipynb b/docs/docs/integrations/llms/nvidia_ai_endpoints.ipynb new file mode 100644 index 00000000000..190cf8db74d --- /dev/null +++ b/docs/docs/integrations/llms/nvidia_ai_endpoints.ipynb @@ -0,0 +1,309 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NVIDIA\n", + "\n", + "This will help you getting started with NVIDIA [models](/docs/concepts/#llms). For detailed documentation of all `NVIDIA` features and configurations head to the [API reference](https://python.langchain.com/api_reference/nvidia_ai_endpoints/llms/langchain_nvidia_ai_endpoints.chat_models.NVIDIA.html).\n", + "\n", + "## Overview\n", + "The `langchain-nvidia-ai-endpoints` package contains LangChain integrations building applications with models on \n", + "NVIDIA NIM inference microservice. These models are optimized by NVIDIA to deliver the best performance on NVIDIA \n", + "accelerated infrastructure and deployed as a NIM, an easy-to-use, prebuilt containers that deploy anywhere using a single \n", + "command on NVIDIA accelerated infrastructure.\n", + "\n", + "NVIDIA hosted deployments of NIMs are available to test on the [NVIDIA API catalog](https://build.nvidia.com/). After testing, \n", + "NIMs can be exported from NVIDIA’s API catalog using the NVIDIA AI Enterprise license and run on-premises or in the cloud, \n", + "giving enterprises ownership and full control of their IP and AI application.\n", + "\n", + "NIMs are packaged as container images on a per model basis and are distributed as NGC container images through the NVIDIA NGC Catalog. \n", + "At their core, NIMs provide easy, consistent, and familiar APIs for running inference on an AI model.\n", + "\n", + "This example goes over how to use LangChain to interact with NVIDIA supported via the `NVIDIA` class.\n", + "\n", + "For more information on accessing the llm models through this api, check out the [NVIDIA](https://python.langchain.com/docs/integrations/llms/nvidia_ai_endpoints/) documentation.\n", + "\n", + "### Integration details\n", + "\n", + "| Class | Package | Local | Serializable | JS support | Package downloads | Package latest |\n", + "| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n", + "| [NVIDIA](https://python.langchain.com/api_reference/nvidia_ai_endpoints/llms/langchain_nvidia_ai_endpoints.chat_models.ChatNVIDIA.html) | [langchain_nvidia_ai_endpoints](https://python.langchain.com/api_reference/nvidia_ai_endpoints/index.html) | ✅ | beta | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain_nvidia_ai_endpoints?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain_nvidia_ai_endpoints?style=flat-square&label=%20) |\n", + "\n", + "### Model features\n", + "| JSON mode | [Image input](/docs/how_to/multimodal_inputs/) | Audio input | Video input | [Token-level streaming](/docs/how_to/chat_streaming/) | Native async | [Token usage](/docs/how_to/chat_token_usage_tracking/) | [Logprobs](/docs/how_to/logprobs/) |\n", + "| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |\n", + "| ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | \n", + "\n", + "## Setup\n", + "\n", + "**To get started:**\n", + "\n", + "1. Create a free account with [NVIDIA](https://build.nvidia.com/), which hosts NVIDIA AI Foundation models.\n", + "\n", + "2. Click on your model of choice.\n", + "\n", + "3. Under `Input` select the `Python` tab, and click `Get API Key`. Then click `Generate Key`.\n", + "\n", + "4. Copy and save the generated key as `NVIDIA_API_KEY`. From there, you should have access to the endpoints.\n", + "\n", + "### Credentials\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "if not os.getenv(\"NVIDIA_API_KEY\"):\n", + " # Note: the API key should start with \"nvapi-\"\n", + " os.environ[\"NVIDIA_API_KEY\"] = getpass.getpass(\"Enter your NVIDIA API key: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Installation\n", + "\n", + "The LangChain NVIDIA AI Endpoints integration lives in the `langchain_nvidia_ai_endpoints` package:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install --upgrade --quiet langchain-nvidia-ai-endpoints" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Instantiation\n", + "\n", + "See [LLM](/docs/how_to#llms) for full functionality." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_nvidia_ai_endpoints import NVIDIA" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "llm = NVIDIA().bind(max_tokens=256)\n", + "llm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Invocation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "prompt = \"# Function that does quicksort written in Rust without comments:\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(llm.invoke(prompt))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Stream, Batch, and Async\n", + "\n", + "These models natively support streaming, and as is the case with all LangChain LLMs they expose a batch method to handle concurrent requests, as well as async methods for invoke, stream, and batch. Below are a few examples." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for chunk in llm.stream(prompt):\n", + " print(chunk, end=\"\", flush=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "llm.batch([prompt])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "await llm.ainvoke(prompt)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "async for chunk in llm.astream(prompt):\n", + " print(chunk, end=\"\", flush=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "await llm.abatch([prompt])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "async for chunk in llm.astream_log(prompt):\n", + " print(chunk)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = llm.invoke(\n", + " \"X_train, y_train, X_test, y_test = train_test_split(X, y, test_size=0.1) #Train a logistic regression model, predict the labels on the test set and compute the accuracy score\"\n", + ")\n", + "print(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Supported models\n", + "\n", + "Querying `available_models` will still give you all of the other models offered by your API credentials." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "NVIDIA.get_available_models()\n", + "# llm.get_available_models()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chaining\n", + "\n", + "We can [chain](/docs/how_to/sequence/) our model with a prompt template like so:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.prompts import ChatPromptTemplate\n", + "\n", + "prompt = ChatPromptTemplate(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"You are a helpful assistant that translates {input_language} to {output_language}.\",\n", + " ),\n", + " (\"human\", \"{input}\"),\n", + " ]\n", + ")\n", + "\n", + "chain = prompt | llm\n", + "chain.invoke(\n", + " {\n", + " \"input_language\": \"English\",\n", + " \"output_language\": \"German\",\n", + " \"input\": \"I love programming.\",\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## API reference\n", + "\n", + "For detailed documentation of all `NVIDIA` features and configurations head to the API reference: https://python.langchain.com/api_reference/nvidia_ai_endpoints/llms/langchain_nvidia_ai_endpoints.llms.NVIDIA.html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "langchain-nvidia-ai-endpoints-m0-Y4aGr-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 2715bed70e8f85c4f4c040b7423fc3f0bd973166 Mon Sep 17 00:00:00 2001 From: Vadym Barda Date: Thu, 3 Oct 2024 19:52:01 -0400 Subject: [PATCH 21/62] docs[patch]: update links w/ new langgraph API ref (#26961) Co-authored-by: Erick Friis --- docs/scripts/generate_api_reference_links.py | 169 ++++++------------- 1 file changed, 49 insertions(+), 120 deletions(-) diff --git a/docs/scripts/generate_api_reference_links.py b/docs/scripts/generate_api_reference_links.py index 2f94390838b..662d1dd12f7 100644 --- a/docs/scripts/generate_api_reference_links.py +++ b/docs/scripts/generate_api_reference_links.py @@ -20,111 +20,53 @@ _LANGGRAPH_API_REFERENCE = "https://langchain-ai.github.io/langgraph/reference/" code_block_re = re.compile(r"^(```\s?python\n)(.*?)(```)", re.DOTALL | re.MULTILINE) +# (alias/re-exported modules, source module, class, docs namespace) MANUAL_API_REFERENCES_LANGGRAPH = [ - ("langgraph.prebuilt", "create_react_agent"), ( - "langgraph.prebuilt", - "ToolNode", + ["langgraph.prebuilt"], + "langgraph.prebuilt.chat_agent_executor", + "create_react_agent", + "prebuilt", + ), + (["langgraph.prebuilt"], "langgraph.prebuilt.tool_node", "ToolNode", "prebuilt"), + ( + ["langgraph.prebuilt"], + "langgraph.prebuilt.tool_node", + "tools_condition", + "prebuilt", ), ( - "langgraph.prebuilt", - "ToolExecutor", - ), - ( - "langgraph.prebuilt", - "ToolInvocation", - ), - ("langgraph.prebuilt", "tools_condition"), - ( - "langgraph.prebuilt", - "ValidationNode", - ), - ( - "langgraph.prebuilt", + ["langgraph.prebuilt"], + "langgraph.prebuilt.tool_node", "InjectedState", + "prebuilt", ), # Graph - ( - "langgraph.graph", - "StateGraph", - ), - ( - "langgraph.graph.message", - "MessageGraph", - ), - ("langgraph.graph.message", "add_messages"), - ( - "langgraph.graph.graph", - "CompiledGraph", - ), - ( - "langgraph.types", - "StreamMode", - ), - ( - "langgraph.graph", - "START", - ), - ( - "langgraph.graph", - "END", - ), - ( - "langgraph.types", - "Send", - ), - ( - "langgraph.types", - "Interrupt", - ), - ( - "langgraph.types", - "RetryPolicy", - ), - ( - "langgraph.checkpoint.base", - "Checkpoint", - ), - ( - "langgraph.checkpoint.base", - "CheckpointMetadata", - ), - ( - "langgraph.checkpoint.base", - "BaseCheckpointSaver", - ), - ( - "langgraph.checkpoint.base", - "SerializerProtocol", - ), - ( - "langgraph.checkpoint.serde.jsonplus", - "JsonPlusSerializer", - ), - ( - "langgraph.checkpoint.memory", - "MemorySaver", - ), - ( - "langgraph.checkpoint.sqlite.aio", - "AsyncSqliteSaver", - ), - ( - "langgraph.checkpoint.sqlite", - "SqliteSaver", - ), - ( - "langgraph.checkpoint.postgres.aio", - "AsyncPostgresSaver", - ), - ( - "langgraph.checkpoint.postgres", - "PostgresSaver", - ), + (["langgraph.graph"], "langgraph.graph.message", "add_messages", "graphs"), + (["langgraph.graph"], "langgraph.graph.state", "StateGraph", "graphs"), + (["langgraph.graph"], "langgraph.graph.state", "CompiledStateGraph", "graphs"), + ([], "langgraph.types", "StreamMode", "types"), + (["langgraph.graph"], "langgraph.constants", "START", "constants"), + (["langgraph.graph"], "langgraph.constants", "END", "constants"), + (["langgraph.constants"], "langgraph.types", "Send", "types"), + (["langgraph.constants"], "langgraph.types", "Interrupt", "types"), + ([], "langgraph.types", "RetryPolicy", "types"), + ([], "langgraph.checkpoint.base", "Checkpoint", "checkpoints"), + ([], "langgraph.checkpoint.base", "CheckpointMetadata", "checkpoints"), + ([], "langgraph.checkpoint.base", "BaseCheckpointSaver", "checkpoints"), + ([], "langgraph.checkpoint.base", "SerializerProtocol", "checkpoints"), + ([], "langgraph.checkpoint.serde.jsonplus", "JsonPlusSerializer", "checkpoints"), + ([], "langgraph.checkpoint.memory", "MemorySaver", "checkpoints"), + ([], "langgraph.checkpoint.sqlite.aio", "AsyncSqliteSaver", "checkpoints"), + ([], "langgraph.checkpoint.sqlite", "SqliteSaver", "checkpoints"), + ([], "langgraph.checkpoint.postgres.aio", "AsyncPostgresSaver", "checkpoints"), + ([], "langgraph.checkpoint.postgres", "PostgresSaver", "checkpoints"), ] WELL_KNOWN_LANGGRAPH_OBJECTS = { - (module_, class_) for module_, class_ in MANUAL_API_REFERENCES_LANGGRAPH + (module_, class_): (source_module, namespace) + for (modules, source_module, class_, namespace) in MANUAL_API_REFERENCES_LANGGRAPH + for module_ in modules + [source_module] } @@ -308,34 +250,21 @@ def _get_imports( + ".html" ) elif package_ecosystem == "langgraph": - if module.startswith("langgraph.checkpoint"): - namespace = "checkpoints" - elif module.startswith("langgraph.graph"): - namespace = "graphs" - elif module.startswith("langgraph.prebuilt"): - namespace = "prebuilt" - elif module.startswith("langgraph.errors"): - namespace = "errors" - else: + if (module, class_name) not in WELL_KNOWN_LANGGRAPH_OBJECTS: # Likely not documented yet - # Unable to determine the namespace continue - if module.startswith("langgraph.errors"): - # Has different URL structure than other modules - url = ( - _LANGGRAPH_API_REFERENCE - + namespace - + "/#langgraph.errors." - + class_name # Uses the actual class name here. - ) - else: - if (module, class_name) not in WELL_KNOWN_LANGGRAPH_OBJECTS: - # Likely not documented yet - continue - url = ( - _LANGGRAPH_API_REFERENCE + namespace + "/#" + class_name.lower() - ) + source_module, namespace = WELL_KNOWN_LANGGRAPH_OBJECTS[ + (module, class_name) + ] + url = ( + _LANGGRAPH_API_REFERENCE + + namespace + + "/#" + + source_module + + "." + + class_name + ) else: raise ValueError(f"Invalid package ecosystem: {package_ecosystem}") From e8e5d67a8d8839c96dc54552b5ff007b95992345 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Thu, 3 Oct 2024 18:25:38 -0700 Subject: [PATCH 22/62] openai: fix None token detail (#27091) happens in Azure --- .../langchain_openai/chat_models/base.py | 10 ++++++---- .../tests/unit_tests/chat_models/test_base.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/libs/partners/openai/langchain_openai/chat_models/base.py b/libs/partners/openai/langchain_openai/chat_models/base.py index 27d4adf0681..4e91fab34a8 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -2161,16 +2161,18 @@ def _create_usage_metadata(oai_token_usage: dict) -> UsageMetadata: output_tokens = oai_token_usage.get("completion_tokens", 0) total_tokens = oai_token_usage.get("total_tokens", input_tokens + output_tokens) input_token_details: dict = { - "audio": oai_token_usage.get("prompt_tokens_details", {}).get("audio_tokens"), - "cache_read": oai_token_usage.get("prompt_tokens_details", {}).get( + "audio": (oai_token_usage.get("prompt_tokens_details") or {}).get( + "audio_tokens" + ), + "cache_read": (oai_token_usage.get("prompt_tokens_details") or {}).get( "cached_tokens" ), } output_token_details: dict = { - "audio": oai_token_usage.get("completion_tokens_details", {}).get( + "audio": (oai_token_usage.get("completion_tokens_details") or {}).get( "audio_tokens" ), - "reasoning": oai_token_usage.get("completion_tokens_details", {}).get( + "reasoning": (oai_token_usage.get("completion_tokens_details") or {}).get( "reasoning_tokens" ), } diff --git a/libs/partners/openai/tests/unit_tests/chat_models/test_base.py b/libs/partners/openai/tests/unit_tests/chat_models/test_base.py index d2052767040..cc03698e5ef 100644 --- a/libs/partners/openai/tests/unit_tests/chat_models/test_base.py +++ b/libs/partners/openai/tests/unit_tests/chat_models/test_base.py @@ -23,6 +23,7 @@ from langchain_openai import ChatOpenAI from langchain_openai.chat_models.base import ( _convert_dict_to_message, _convert_message_to_dict, + _create_usage_metadata, _format_message_content, ) @@ -730,3 +731,21 @@ def test_schema_from_with_structured_output(schema: Type) -> None: } actual = structured_llm.get_output_schema().model_json_schema() assert actual == expected + + +def test__create_usage_metadata() -> None: + usage_metadata = { + "completion_tokens": 15, + "prompt_tokens_details": None, + "completion_tokens_details": None, + "prompt_tokens": 11, + "total_tokens": 26, + } + result = _create_usage_metadata(usage_metadata) + assert result == UsageMetadata( + output_tokens=15, + input_tokens=11, + total_tokens=26, + input_token_details={}, + output_token_details={}, + ) From 0495b7f44117eb7859ccf8420003795736f1d11e Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 08:46:49 -0700 Subject: [PATCH 23/62] anthropic[patch]: add usage_metadata details (#27087) fixes https://github.com/langchain-ai/langchain/pull/27087 --- .../langchain_anthropic/chat_models.py | 43 +++---- .../tests/integration_tests/test_standard.py | 106 +++++++++++++++++- .../tests/unit_tests/test_chat_models.py | 64 +++++++---- 3 files changed, 172 insertions(+), 41 deletions(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 08c3ff66ce2..93ec406fc5e 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -41,7 +41,7 @@ from langchain_core.messages import ( ToolCall, ToolMessage, ) -from langchain_core.messages.ai import UsageMetadata +from langchain_core.messages.ai import InputTokenDetails, UsageMetadata from langchain_core.messages.tool import tool_call_chunk as create_tool_call_chunk from langchain_core.output_parsers import ( JsonOutputKeyToolsParser, @@ -766,12 +766,7 @@ class ChatAnthropic(BaseChatModel): ) else: msg = AIMessage(content=content) - # Collect token usage - msg.usage_metadata = { - "input_tokens": data.usage.input_tokens, - "output_tokens": data.usage.output_tokens, - "total_tokens": data.usage.input_tokens + data.usage.output_tokens, - } + msg.usage_metadata = _create_usage_metadata(data.usage) return ChatResult( generations=[ChatGeneration(message=msg)], llm_output=llm_output, @@ -1182,14 +1177,10 @@ def _make_message_chunk_from_anthropic_event( message_chunk: Optional[AIMessageChunk] = None # See https://github.com/anthropics/anthropic-sdk-python/blob/main/src/anthropic/lib/streaming/_messages.py # noqa: E501 if event.type == "message_start" and stream_usage: - input_tokens = event.message.usage.input_tokens + usage_metadata = _create_usage_metadata(event.message.usage) message_chunk = AIMessageChunk( content="" if coerce_content_to_string else [], - usage_metadata=UsageMetadata( - input_tokens=input_tokens, - output_tokens=0, - total_tokens=input_tokens, - ), + usage_metadata=usage_metadata, ) elif ( event.type == "content_block_start" @@ -1235,14 +1226,10 @@ def _make_message_chunk_from_anthropic_event( tool_call_chunks=[tool_call_chunk], # type: ignore ) elif event.type == "message_delta" and stream_usage: - output_tokens = event.usage.output_tokens + usage_metadata = _create_usage_metadata(event.usage) message_chunk = AIMessageChunk( content="", - usage_metadata=UsageMetadata( - input_tokens=0, - output_tokens=output_tokens, - total_tokens=output_tokens, - ), + usage_metadata=usage_metadata, response_metadata={ "stop_reason": event.delta.stop_reason, "stop_sequence": event.delta.stop_sequence, @@ -1257,3 +1244,21 @@ def _make_message_chunk_from_anthropic_event( @deprecated(since="0.1.0", removal="0.3.0", alternative="ChatAnthropic") class ChatAnthropicMessages(ChatAnthropic): pass + + +def _create_usage_metadata(anthropic_usage: BaseModel) -> UsageMetadata: + input_token_details: Dict = { + "cache_read": getattr(anthropic_usage, "cache_read_input_tokens", None), + "cache_creation": getattr(anthropic_usage, "cache_creation_input_tokens", None), + } + + input_tokens = getattr(anthropic_usage, "input_tokens", 0) + output_tokens = getattr(anthropic_usage, "output_tokens", 0) + return UsageMetadata( + input_tokens=input_tokens, + output_tokens=output_tokens, + total_tokens=input_tokens + output_tokens, + input_token_details=InputTokenDetails( + **{k: v for k, v in input_token_details.items() if v is not None} + ), + ) diff --git a/libs/partners/anthropic/tests/integration_tests/test_standard.py b/libs/partners/anthropic/tests/integration_tests/test_standard.py index e439fffc74f..24f8766ad06 100644 --- a/libs/partners/anthropic/tests/integration_tests/test_standard.py +++ b/libs/partners/anthropic/tests/integration_tests/test_standard.py @@ -1,12 +1,16 @@ """Standard LangChain interface tests""" -from typing import Type +from pathlib import Path +from typing import List, Literal, Type, cast from langchain_core.language_models import BaseChatModel +from langchain_core.messages import AIMessage from langchain_standard_tests.integration_tests import ChatModelIntegrationTests from langchain_anthropic import ChatAnthropic +REPO_ROOT_DIR = Path(__file__).parents[5] + class TestAnthropicStandard(ChatModelIntegrationTests): @property @@ -28,3 +32,103 @@ class TestAnthropicStandard(ChatModelIntegrationTests): @property def supports_anthropic_inputs(self) -> bool: return True + + @property + def supported_usage_metadata_details( + self, + ) -> List[ + Literal[ + "audio_input", + "audio_output", + "reasoning_output", + "cache_read_input", + "cache_creation_input", + ] + ]: + return ["cache_read_input", "cache_creation_input"] + + def invoke_with_cache_creation_input(self, *, stream: bool = False) -> AIMessage: + llm = ChatAnthropic( + model="claude-3-5-sonnet-20240620", # type: ignore[call-arg] + extra_headers={"anthropic-beta": "prompt-caching-2024-07-31"}, # type: ignore[call-arg] + ) + with open(REPO_ROOT_DIR / "README.md", "r") as f: + readme = f.read() + + input_ = f"""What's langchain? Here's the langchain README: + + {readme} + """ + return _invoke( + llm, + [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": input_, + "cache_control": {"type": "ephemeral"}, + } + ], + } + ], + stream, + ) + + def invoke_with_cache_read_input(self, *, stream: bool = False) -> AIMessage: + llm = ChatAnthropic( + model="claude-3-5-sonnet-20240620", # type: ignore[call-arg] + extra_headers={"anthropic-beta": "prompt-caching-2024-07-31"}, # type: ignore[call-arg] + ) + with open(REPO_ROOT_DIR / "README.md", "r") as f: + readme = f.read() + + input_ = f"""What's langchain? Here's the langchain README: + + {readme} + """ + + # invoke twice so first invocation is cached + _invoke( + llm, + [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": input_, + "cache_control": {"type": "ephemeral"}, + } + ], + } + ], + stream, + ) + return _invoke( + llm, + [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": input_, + "cache_control": {"type": "ephemeral"}, + } + ], + } + ], + stream, + ) + + +def _invoke(llm: ChatAnthropic, input_: list, stream: bool) -> AIMessage: + if stream: + full = None + for chunk in llm.stream(input_): + full = full + chunk if full else chunk # type: ignore[operator] + return cast(AIMessage, full) + else: + return cast(AIMessage, llm.invoke(input_)) diff --git a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py index 781a3b6e747..8c9f908c19f 100644 --- a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py +++ b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py @@ -5,8 +5,11 @@ from typing import Any, Callable, Dict, Literal, Type, cast import pytest from anthropic.types import Message, TextBlock, Usage +from anthropic.types.beta.prompt_caching import ( + PromptCachingBetaMessage, + PromptCachingBetaUsage, +) from langchain_core.messages import AIMessage, HumanMessage, SystemMessage, ToolMessage -from langchain_core.outputs import ChatGeneration, ChatResult from langchain_core.runnables import RunnableBinding from langchain_core.tools import BaseTool from pydantic import BaseModel, Field, SecretStr @@ -89,30 +92,49 @@ def test__format_output() -> None: usage=Usage(input_tokens=2, output_tokens=1), type="message", ) - expected = ChatResult( - generations=[ - ChatGeneration( - message=AIMessage( # type: ignore[misc] - "bar", - usage_metadata={ - "input_tokens": 2, - "output_tokens": 1, - "total_tokens": 3, - }, - ) - ), - ], - llm_output={ - "id": "foo", - "model": "baz", - "stop_reason": None, - "stop_sequence": None, - "usage": {"input_tokens": 2, "output_tokens": 1}, + expected = AIMessage( # type: ignore[misc] + "bar", + usage_metadata={ + "input_tokens": 2, + "output_tokens": 1, + "total_tokens": 3, + "input_token_details": {}, }, ) llm = ChatAnthropic(model="test", anthropic_api_key="test") # type: ignore[call-arg, call-arg] actual = llm._format_output(anthropic_msg) - assert expected == actual + assert actual.generations[0].message == expected + + +def test__format_output_cached() -> None: + anthropic_msg = PromptCachingBetaMessage( + id="foo", + content=[TextBlock(type="text", text="bar")], + model="baz", + role="assistant", + stop_reason=None, + stop_sequence=None, + usage=PromptCachingBetaUsage( + input_tokens=2, + output_tokens=1, + cache_creation_input_tokens=3, + cache_read_input_tokens=4, + ), + type="message", + ) + expected = AIMessage( # type: ignore[misc] + "bar", + usage_metadata={ + "input_tokens": 2, + "output_tokens": 1, + "total_tokens": 3, + "input_token_details": {"cache_creation": 3, "cache_read": 4}, + }, + ) + + llm = ChatAnthropic(model="test", anthropic_api_key="test") # type: ignore[call-arg, call-arg] + actual = llm._format_output(anthropic_msg) + assert actual.generations[0].message == expected def test__merge_messages() -> None: From 4935a14314a7039b87b626997889f0f8ff35ac53 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:30:27 -0700 Subject: [PATCH 24/62] core,integrations[minor]: Dont error on fields in model_kwargs (#27110) Given the current erroring behavior, every time we've moved a kwarg from model_kwargs and made it its own field that was a breaking change. Updating this behavior to support the old instantiations / serializations. Assuming build_extra_kwargs was not something that itself is being used externally and needs to be kept backwards compatible --- .../chat_models/snowflake.py | 7 +-- .../langchain_community/llms/anthropic.py | 7 +-- .../langchain_community/llms/llamacpp.py | 7 +-- .../langchain_community/llms/openai.py | 7 +-- .../unit_tests/chat_models/test_anthropic.py | 9 ++-- .../tests/unit_tests/llms/test_openai.py | 13 +++--- libs/core/langchain_core/utils/__init__.py | 2 +- libs/core/langchain_core/utils/utils.py | 45 +++++++++++++++++++ .../tests/unit_tests/utils/test_imports.py | 2 +- .../langchain_anthropic/chat_models.py | 7 +-- .../anthropic/langchain_anthropic/llms.py | 7 +-- .../tests/unit_tests/test_chat_models.py | 9 ++-- .../langchain_fireworks/chat_models.py | 7 +-- .../fireworks/langchain_fireworks/llms.py | 7 +-- .../langchain_openai/chat_models/base.py | 7 +-- .../openai/langchain_openai/llms/base.py | 7 +-- .../openai/tests/unit_tests/llms/test_base.py | 9 ++-- 17 files changed, 91 insertions(+), 68 deletions(-) diff --git a/libs/community/langchain_community/chat_models/snowflake.py b/libs/community/langchain_community/chat_models/snowflake.py index 52483818830..84883b2cd87 100644 --- a/libs/community/langchain_community/chat_models/snowflake.py +++ b/libs/community/langchain_community/chat_models/snowflake.py @@ -17,7 +17,7 @@ from langchain_core.utils import ( get_pydantic_field_names, pre_init, ) -from langchain_core.utils.utils import build_extra_kwargs +from langchain_core.utils.utils import _build_model_kwargs from pydantic import Field, SecretStr, model_validator SUPPORTED_ROLES: List[str] = [ @@ -131,10 +131,7 @@ class ChatSnowflakeCortex(BaseChatModel): def build_extra(cls, values: Dict[str, Any]) -> Any: """Build extra kwargs from additional params that were passed in.""" all_required_field_names = get_pydantic_field_names(cls) - extra = values.get("model_kwargs", {}) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @pre_init diff --git a/libs/community/langchain_community/llms/anthropic.py b/libs/community/langchain_community/llms/anthropic.py index 07b40d6eda7..0a6af6799d8 100644 --- a/libs/community/langchain_community/llms/anthropic.py +++ b/libs/community/langchain_community/llms/anthropic.py @@ -26,7 +26,7 @@ from langchain_core.utils import ( get_pydantic_field_names, pre_init, ) -from langchain_core.utils.utils import build_extra_kwargs, convert_to_secret_str +from langchain_core.utils.utils import _build_model_kwargs, convert_to_secret_str from pydantic import ConfigDict, Field, SecretStr, model_validator @@ -69,11 +69,8 @@ class _AnthropicCommon(BaseLanguageModel): @model_validator(mode="before") @classmethod def build_extra(cls, values: Dict) -> Any: - extra = values.get("model_kwargs", {}) all_required_field_names = get_pydantic_field_names(cls) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @pre_init diff --git a/libs/community/langchain_community/llms/llamacpp.py b/libs/community/langchain_community/llms/llamacpp.py index 15d1119fcad..a045878fd26 100644 --- a/libs/community/langchain_community/llms/llamacpp.py +++ b/libs/community/langchain_community/llms/llamacpp.py @@ -8,7 +8,7 @@ from langchain_core.callbacks import CallbackManagerForLLMRun from langchain_core.language_models.llms import LLM from langchain_core.outputs import GenerationChunk from langchain_core.utils import get_pydantic_field_names, pre_init -from langchain_core.utils.utils import build_extra_kwargs +from langchain_core.utils.utils import _build_model_kwargs from pydantic import Field, model_validator logger = logging.getLogger(__name__) @@ -199,10 +199,7 @@ class LlamaCpp(LLM): def build_model_kwargs(cls, values: Dict[str, Any]) -> Any: """Build extra kwargs from additional params that were passed in.""" all_required_field_names = get_pydantic_field_names(cls) - extra = values.get("model_kwargs", {}) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @property diff --git a/libs/community/langchain_community/llms/openai.py b/libs/community/langchain_community/llms/openai.py index aeb16883fd4..cc33d07ac4e 100644 --- a/libs/community/langchain_community/llms/openai.py +++ b/libs/community/langchain_community/llms/openai.py @@ -34,7 +34,7 @@ from langchain_core.utils import ( pre_init, ) from langchain_core.utils.pydantic import get_fields -from langchain_core.utils.utils import build_extra_kwargs +from langchain_core.utils.utils import _build_model_kwargs from pydantic import ConfigDict, Field, model_validator from langchain_community.utils.openai import is_openai_v1 @@ -268,10 +268,7 @@ class BaseOpenAI(BaseLLM): def build_extra(cls, values: Dict[str, Any]) -> Any: """Build extra kwargs from additional params that were passed in.""" all_required_field_names = get_pydantic_field_names(cls) - extra = values.get("model_kwargs", {}) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @pre_init diff --git a/libs/community/tests/unit_tests/chat_models/test_anthropic.py b/libs/community/tests/unit_tests/chat_models/test_anthropic.py index 41452ce0b83..8e6a659743b 100644 --- a/libs/community/tests/unit_tests/chat_models/test_anthropic.py +++ b/libs/community/tests/unit_tests/chat_models/test_anthropic.py @@ -33,9 +33,12 @@ def test_anthropic_model_kwargs() -> None: @pytest.mark.requires("anthropic") -def test_anthropic_invalid_model_kwargs() -> None: - with pytest.raises(ValueError): - ChatAnthropic(model_kwargs={"max_tokens_to_sample": 5}) +def test_anthropic_fields_in_model_kwargs() -> None: + """Test that for backwards compatibility fields can be passed in as model_kwargs.""" + llm = ChatAnthropic(model_kwargs={"max_tokens_to_sample": 5}) + assert llm.max_tokens_to_sample == 5 + llm = ChatAnthropic(model_kwargs={"max_tokens": 5}) + assert llm.max_tokens_to_sample == 5 @pytest.mark.requires("anthropic") diff --git a/libs/community/tests/unit_tests/llms/test_openai.py b/libs/community/tests/unit_tests/llms/test_openai.py index 83b229d8c2e..bd5f8b3bd90 100644 --- a/libs/community/tests/unit_tests/llms/test_openai.py +++ b/libs/community/tests/unit_tests/llms/test_openai.py @@ -26,13 +26,12 @@ def test_openai_model_kwargs() -> None: @pytest.mark.requires("openai") -def test_openai_invalid_model_kwargs() -> None: - with pytest.raises(ValueError): - OpenAI(model_kwargs={"model_name": "foo"}) - - # Test that "model" cannot be specified in kwargs - with pytest.raises(ValueError): - OpenAI(model_kwargs={"model": "gpt-3.5-turbo-instruct"}) +def test_openai_fields_model_kwargs() -> None: + """Test that for backwards compatibility fields can be passed in as model_kwargs.""" + llm = OpenAI(model_kwargs={"model_name": "foo"}, api_key="foo") + assert llm.model_name == "foo" + llm = OpenAI(model_kwargs={"model": "foo"}, api_key="foo") + assert llm.model_name == "foo" @pytest.mark.requires("openai") diff --git a/libs/core/langchain_core/utils/__init__.py b/libs/core/langchain_core/utils/__init__.py index 2e560b21e96..7822d3b6251 100644 --- a/libs/core/langchain_core/utils/__init__.py +++ b/libs/core/langchain_core/utils/__init__.py @@ -32,6 +32,7 @@ from langchain_core.utils.utils import ( ) __all__ = [ + "build_extra_kwargs", "StrictFormatter", "check_package_version", "convert_to_secret_str", @@ -46,7 +47,6 @@ __all__ = [ "raise_for_status_with_text", "xor_args", "try_load_from_hub", - "build_extra_kwargs", "image", "get_from_env", "get_from_dict_or_env", diff --git a/libs/core/langchain_core/utils/utils.py b/libs/core/langchain_core/utils/utils.py index e8d7b34bd26..7bbea2d4e0c 100644 --- a/libs/core/langchain_core/utils/utils.py +++ b/libs/core/langchain_core/utils/utils.py @@ -210,6 +210,51 @@ def get_pydantic_field_names(pydantic_cls: Any) -> set[str]: return all_required_field_names +def _build_model_kwargs( + values: dict[str, Any], + all_required_field_names: set[str], +) -> dict[str, Any]: + """Build "model_kwargs" param from Pydanitc constructor values. + + Args: + values: All init args passed in by user. + all_required_field_names: All required field names for the pydantic class. + + Returns: + Dict[str, Any]: Extra kwargs. + + Raises: + ValueError: If a field is specified in both values and extra_kwargs. + ValueError: If a field is specified in model_kwargs. + """ + extra_kwargs = values.get("model_kwargs", {}) + for field_name in list(values): + if field_name in extra_kwargs: + raise ValueError(f"Found {field_name} supplied twice.") + if field_name not in all_required_field_names: + warnings.warn( + f"""WARNING! {field_name} is not default parameter. + {field_name} was transferred to model_kwargs. + Please confirm that {field_name} is what you intended.""", + stacklevel=7, + ) + extra_kwargs[field_name] = values.pop(field_name) + + invalid_model_kwargs = all_required_field_names.intersection(extra_kwargs.keys()) + if invalid_model_kwargs: + warnings.warn( + f"Parameters {invalid_model_kwargs} should be specified explicitly. " + f"Instead they were passed in as part of `model_kwargs` parameter.", + stacklevel=7, + ) + for k in invalid_model_kwargs: + values[k] = extra_kwargs.pop(k) + + values["model_kwargs"] = extra_kwargs + return values + + +# DON'T USE! Kept for backwards-compatibility but should never have been public. def build_extra_kwargs( extra_kwargs: dict[str, Any], values: dict[str, Any], diff --git a/libs/core/tests/unit_tests/utils/test_imports.py b/libs/core/tests/unit_tests/utils/test_imports.py index f33491ed295..67fe97e6569 100644 --- a/libs/core/tests/unit_tests/utils/test_imports.py +++ b/libs/core/tests/unit_tests/utils/test_imports.py @@ -17,8 +17,8 @@ EXPECTED_ALL = [ "raise_for_status_with_text", "xor_args", "try_load_from_hub", - "build_extra_kwargs", "image", + "build_extra_kwargs", "get_from_dict_or_env", "get_from_env", "stringify_dict", diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 93ec406fc5e..251afb015c5 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -56,13 +56,13 @@ from langchain_core.runnables import ( ) from langchain_core.tools import BaseTool from langchain_core.utils import ( - build_extra_kwargs, from_env, get_pydantic_field_names, secret_from_env, ) from langchain_core.utils.function_calling import convert_to_openai_tool from langchain_core.utils.pydantic import is_basemodel_subclass +from langchain_core.utils.utils import _build_model_kwargs from pydantic import ( BaseModel, ConfigDict, @@ -646,11 +646,8 @@ class ChatAnthropic(BaseChatModel): @model_validator(mode="before") @classmethod def build_extra(cls, values: Dict) -> Any: - extra = values.get("model_kwargs", {}) all_required_field_names = get_pydantic_field_names(cls) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @model_validator(mode="after") diff --git a/libs/partners/anthropic/langchain_anthropic/llms.py b/libs/partners/anthropic/langchain_anthropic/llms.py index 99e7df965fb..5b53663d7e2 100644 --- a/libs/partners/anthropic/langchain_anthropic/llms.py +++ b/libs/partners/anthropic/langchain_anthropic/llms.py @@ -25,7 +25,7 @@ from langchain_core.utils import ( get_pydantic_field_names, ) from langchain_core.utils.utils import ( - build_extra_kwargs, + _build_model_kwargs, from_env, secret_from_env, ) @@ -88,11 +88,8 @@ class _AnthropicCommon(BaseLanguageModel): @model_validator(mode="before") @classmethod def build_extra(cls, values: Dict) -> Any: - extra = values.get("model_kwargs", {}) all_required_field_names = get_pydantic_field_names(cls) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @model_validator(mode="after") diff --git a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py index 8c9f908c19f..90906edf547 100644 --- a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py +++ b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py @@ -61,9 +61,12 @@ def test_anthropic_model_kwargs() -> None: @pytest.mark.requires("anthropic") -def test_anthropic_invalid_model_kwargs() -> None: - with pytest.raises(ValueError): - ChatAnthropic(model="foo", model_kwargs={"max_tokens_to_sample": 5}) # type: ignore[call-arg] +def test_anthropic_fields_in_model_kwargs() -> None: + """Test that for backwards compatibility fields can be passed in as model_kwargs.""" + llm = ChatAnthropic(model="foo", model_kwargs={"max_tokens_to_sample": 5}) # type: ignore[call-arg] + assert llm.max_tokens == 5 + llm = ChatAnthropic(model="foo", model_kwargs={"max_tokens": 5}) # type: ignore[call-arg] + assert llm.max_tokens == 5 @pytest.mark.requires("anthropic") diff --git a/libs/partners/fireworks/langchain_fireworks/chat_models.py b/libs/partners/fireworks/langchain_fireworks/chat_models.py index a07398f6d35..11b24197f60 100644 --- a/libs/partners/fireworks/langchain_fireworks/chat_models.py +++ b/libs/partners/fireworks/langchain_fireworks/chat_models.py @@ -79,7 +79,7 @@ from langchain_core.utils.function_calling import ( convert_to_openai_tool, ) from langchain_core.utils.pydantic import is_basemodel_subclass -from langchain_core.utils.utils import build_extra_kwargs, from_env, secret_from_env +from langchain_core.utils.utils import _build_model_kwargs, from_env, secret_from_env from pydantic import ( BaseModel, ConfigDict, @@ -366,10 +366,7 @@ class ChatFireworks(BaseChatModel): def build_extra(cls, values: Dict[str, Any]) -> Any: """Build extra kwargs from additional params that were passed in.""" all_required_field_names = get_pydantic_field_names(cls) - extra = values.get("model_kwargs", {}) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @model_validator(mode="after") diff --git a/libs/partners/fireworks/langchain_fireworks/llms.py b/libs/partners/fireworks/langchain_fireworks/llms.py index 3189483c914..fad10e9039f 100644 --- a/libs/partners/fireworks/langchain_fireworks/llms.py +++ b/libs/partners/fireworks/langchain_fireworks/llms.py @@ -11,7 +11,7 @@ from langchain_core.callbacks import ( ) from langchain_core.language_models.llms import LLM from langchain_core.utils import get_pydantic_field_names -from langchain_core.utils.utils import build_extra_kwargs, secret_from_env +from langchain_core.utils.utils import _build_model_kwargs, secret_from_env from pydantic import ConfigDict, Field, SecretStr, model_validator from langchain_fireworks.version import __version__ @@ -93,10 +93,7 @@ class Fireworks(LLM): def build_extra(cls, values: Dict[str, Any]) -> Any: """Build extra kwargs from additional params that were passed in.""" all_required_field_names = get_pydantic_field_names(cls) - extra = values.get("model_kwargs", {}) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @property diff --git a/libs/partners/openai/langchain_openai/chat_models/base.py b/libs/partners/openai/langchain_openai/chat_models/base.py index 4e91fab34a8..baaa74f637b 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -90,7 +90,7 @@ from langchain_core.utils.pydantic import ( TypeBaseModel, is_basemodel_subclass, ) -from langchain_core.utils.utils import build_extra_kwargs, from_env, secret_from_env +from langchain_core.utils.utils import _build_model_kwargs, from_env, secret_from_env from pydantic import BaseModel, ConfigDict, Field, SecretStr, model_validator from typing_extensions import Self @@ -477,10 +477,7 @@ class BaseChatOpenAI(BaseChatModel): def build_extra(cls, values: Dict[str, Any]) -> Any: """Build extra kwargs from additional params that were passed in.""" all_required_field_names = get_pydantic_field_names(cls) - extra = values.get("model_kwargs", {}) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @model_validator(mode="after") diff --git a/libs/partners/openai/langchain_openai/llms/base.py b/libs/partners/openai/langchain_openai/llms/base.py index 0c773b347a6..633d473ae81 100644 --- a/libs/partners/openai/langchain_openai/llms/base.py +++ b/libs/partners/openai/langchain_openai/llms/base.py @@ -27,7 +27,7 @@ from langchain_core.callbacks import ( from langchain_core.language_models.llms import BaseLLM from langchain_core.outputs import Generation, GenerationChunk, LLMResult from langchain_core.utils import get_pydantic_field_names -from langchain_core.utils.utils import build_extra_kwargs, from_env, secret_from_env +from langchain_core.utils.utils import _build_model_kwargs, from_env, secret_from_env from pydantic import ConfigDict, Field, SecretStr, model_validator from typing_extensions import Self @@ -160,10 +160,7 @@ class BaseOpenAI(BaseLLM): def build_extra(cls, values: Dict[str, Any]) -> Any: """Build extra kwargs from additional params that were passed in.""" all_required_field_names = get_pydantic_field_names(cls) - extra = values.get("model_kwargs", {}) - values["model_kwargs"] = build_extra_kwargs( - extra, values, all_required_field_names - ) + values = _build_model_kwargs(values, all_required_field_names) return values @model_validator(mode="after") diff --git a/libs/partners/openai/tests/unit_tests/llms/test_base.py b/libs/partners/openai/tests/unit_tests/llms/test_base.py index 45955b097c3..e9b43190cd6 100644 --- a/libs/partners/openai/tests/unit_tests/llms/test_base.py +++ b/libs/partners/openai/tests/unit_tests/llms/test_base.py @@ -30,9 +30,12 @@ def test_openai_model_kwargs() -> None: assert llm.model_kwargs == {"foo": "bar"} -def test_openai_invalid_model_kwargs() -> None: - with pytest.raises(ValueError): - OpenAI(model_kwargs={"model_name": "foo"}) +def test_openai_fields_in_model_kwargs() -> None: + """Test that for backwards compatibility fields can be passed in as model_kwargs.""" + llm = OpenAI(model_kwargs={"model_name": "foo"}) + assert llm.model_name == "foo" + llm = OpenAI(model_kwargs={"model": "foo"}) + assert llm.model_name == "foo" def test_openai_incorrect_field() -> None: From 1e768a9ec7875c342658add3fa9e7a3cd50658e1 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:30:50 -0700 Subject: [PATCH 25/62] anthropic[patch]: correctly handle tool msg with empty list (#27109) --- .../langchain_anthropic/chat_models.py | 10 ++++++--- .../tests/unit_tests/test_chat_models.py | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 251afb015c5..dd55d4062c6 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -118,9 +118,13 @@ def _merge_messages( for curr in messages: curr = curr.model_copy(deep=True) if isinstance(curr, ToolMessage): - if isinstance(curr.content, list) and all( - isinstance(block, dict) and block.get("type") == "tool_result" - for block in curr.content + if ( + isinstance(curr.content, list) + and curr.content + and all( + isinstance(block, dict) and block.get("type") == "tool_result" + for block in curr.content + ) ): curr = HumanMessage(curr.content) # type: ignore[misc] else: diff --git a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py index 90906edf547..fd84fd338b1 100644 --- a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py +++ b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py @@ -162,6 +162,13 @@ def test__merge_messages() -> None: "text": None, "name": "blah", }, + { + "tool_input": {"a": "c"}, + "type": "tool_use", + "id": "3", + "text": None, + "name": "blah", + }, ] ), ToolMessage("buz output", tool_call_id="1", status="error"), # type: ignore[misc] @@ -178,6 +185,7 @@ def test__merge_messages() -> None: ], tool_call_id="2", ), # type: ignore[misc] + ToolMessage([], tool_call_id="3"), # type: ignore[misc] HumanMessage("next thing"), # type: ignore[misc] ] expected = [ @@ -201,6 +209,13 @@ def test__merge_messages() -> None: "text": None, "name": "blah", }, + { + "tool_input": {"a": "c"}, + "type": "tool_use", + "id": "3", + "text": None, + "name": "blah", + }, ] ), HumanMessage( # type: ignore[misc] @@ -226,6 +241,12 @@ def test__merge_messages() -> None: "tool_use_id": "2", "is_error": False, }, + { + "type": "tool_result", + "content": [], + "tool_use_id": "3", + "is_error": False, + }, {"type": "text", "text": "next thing"}, ] ), From 558fb4d66d0ab40f8053c5870b9b6bb94589a140 Mon Sep 17 00:00:00 2001 From: Scott Hurrey Date: Fri, 4 Oct 2024 14:32:34 -0400 Subject: [PATCH 26/62] box: Add citation support to langchain_box.retrievers.BoxRetriever when used with Box AI (#27012) Thank you for contributing to LangChain! **Description:** Box AI can return responses, but it can also be configured to return citations. This change allows the developer to decide if they want the answer, the citations, or both. Regardless of the combination, this is returned as a single List[Document] object. **Dependencies:** Updated to the latest Box Python SDK, v1.5.1 **Twitter handle:** BoxPlatform - [x] **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. - [x] **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, ccurme, vbarda, hwchase17. Co-authored-by: Erick Friis --- docs/docs/integrations/retrievers/box.ipynb | 116 ++++++++++++++---- .../box/langchain_box/retrievers/box.py | 24 +++- .../box/langchain_box/utilities/box.py | 47 +++++-- libs/partners/box/poetry.lock | 32 ++--- libs/partners/box/pyproject.toml | 2 +- .../retrievers/test_box_retriever.py | 70 +++++++++++ 6 files changed, 242 insertions(+), 49 deletions(-) diff --git a/docs/docs/integrations/retrievers/box.ipynb b/docs/docs/integrations/retrievers/box.ipynb index 8b25c1089e8..a4abf132ac5 100644 --- a/docs/docs/integrations/retrievers/box.ipynb +++ b/docs/docs/integrations/retrievers/box.ipynb @@ -52,18 +52,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "b87a8e8b-9b5a-4e78-97e4-274b6b0dd29f", "metadata": {}, - "outputs": [ - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Enter your Box Developer Token: ········\n" - ] - } - ], + "outputs": [], "source": [ "import getpass\n", "import os\n", @@ -81,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "a15d341e-3e26-4ca3-830b-5aab30ed66de", "metadata": {}, "outputs": [], @@ -102,10 +94,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "652d6238-1f87-422a-b135-f5abbb8652fc", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ "%pip install -qU langchain-box" ] @@ -124,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "id": "70cc8e65-2a02-408a-bbc6-8ef649057d82", "metadata": {}, "outputs": [], @@ -146,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 6, "id": "97f3ae67", "metadata": {}, "outputs": [ @@ -156,7 +156,7 @@ "[Document(metadata={'source': 'https://dl.boxcloud.com/api/2.0/internal_files/1514555423624/versions/1663171610024/representations/extracted_text/content/', 'title': 'Invoice-A5555_txt'}, page_content='Vendor: AstroTech Solutions\\nInvoice Number: A5555\\n\\nLine Items:\\n - Gravitational Wave Detector Kit: $800\\n - Exoplanet Terrarium: $120\\nTotal: $920')]" ] }, - "execution_count": 33, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -192,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "id": "ee0e726d-9974-4aa0-9ce1-0057ec3e540a", "metadata": {}, "outputs": [], @@ -216,17 +216,17 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "id": "51a60dbe-9f2e-4e04-bb62-23968f17164a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[Document(metadata={'source': 'Box AI', 'title': 'Box AI What was the most expensive item purchased'}, page_content='The most expensive item purchased was the **Gravitational Wave Detector Kit** from AstroTech Solutions, which cost $800.')]" + "[Document(metadata={'source': 'Box AI', 'title': 'Box AI What was the most expensive item purchased'}, page_content='The most expensive item purchased is the **Gravitational Wave Detector Kit** from AstroTech Solutions, which costs **$800**.')]" ] }, - "execution_count": 5, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -237,6 +237,80 @@ "retriever.invoke(query)" ] }, + { + "cell_type": "markdown", + "id": "31a59a51", + "metadata": {}, + "source": [ + "## Citations\n", + "\n", + "With Box AI and the `BoxRetriever`, you can return the answer to your prompt, return the citations used by Box to get that answer, or both. No matter how you choose to use Box AI, the retriever returns a `List[Document]` object. We offer this flexibility with two `bool` arguments, `answer` and `citations`. Answer defaults to `True` and citations defaults to `False`, do you can omit both if you just want the answer. If you want both, you can just include `citations=True` and if you only want citations, you would include `answer=False` and `citations=True`\n", + "\n", + "### Get both" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "2eddc8c1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(metadata={'source': 'Box AI', 'title': 'Box AI What was the most expensive item purchased'}, page_content='The most expensive item purchased is the **Gravitational Wave Detector Kit** from AstroTech Solutions, which costs **$800**.'),\n", + " Document(metadata={'source': 'Box AI What was the most expensive item purchased', 'file_name': 'Invoice-A5555.txt', 'file_id': '1514555423624', 'file_type': 'file'}, page_content='Vendor: AstroTech Solutions\\nInvoice Number: A5555\\n\\nLine Items:\\n - Gravitational Wave Detector Kit: $800\\n - Exoplanet Terrarium: $120\\nTotal: $920')]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "retriever = BoxRetriever(\n", + " box_developer_token=box_developer_token, box_file_ids=box_file_ids, citations=True\n", + ")\n", + "\n", + "retriever.invoke(query)" + ] + }, + { + "cell_type": "markdown", + "id": "d2e93a2e", + "metadata": {}, + "source": [ + "### Citations only" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c1892b07", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(metadata={'source': 'Box AI What was the most expensive item purchased', 'file_name': 'Invoice-A5555.txt', 'file_id': '1514555423624', 'file_type': 'file'}, page_content='Vendor: AstroTech Solutions\\nInvoice Number: A5555\\n\\nLine Items:\\n - Gravitational Wave Detector Kit: $800\\n - Exoplanet Terrarium: $120\\nTotal: $920')]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "retriever = BoxRetriever(\n", + " box_developer_token=box_developer_token,\n", + " box_file_ids=box_file_ids,\n", + " answer=False,\n", + " citations=True,\n", + ")\n", + "\n", + "retriever.invoke(query)" + ] + }, { "cell_type": "markdown", "id": "dfe8aad4-8626-4330-98a9-7ea1ca5d2e0e", @@ -260,7 +334,7 @@ "metadata": {}, "outputs": [ { - "name": "stdin", + "name": "stdout", "output_type": "stream", "text": [ "Enter your OpenAI key: ········\n" diff --git a/libs/partners/box/langchain_box/retrievers/box.py b/libs/partners/box/langchain_box/retrievers/box.py index b216115af3d..1c8dc550665 100644 --- a/libs/partners/box/langchain_box/retrievers/box.py +++ b/libs/partners/box/langchain_box/retrievers/box.py @@ -3,7 +3,8 @@ from typing import List, Optional from langchain_core.callbacks import CallbackManagerForRetrieverRun from langchain_core.documents import Document from langchain_core.retrievers import BaseRetriever -from pydantic import ConfigDict, model_validator +from langchain_core.utils import from_env +from pydantic import ConfigDict, Field, model_validator from typing_extensions import Self from langchain_box.utilities import BoxAuth, BoxSearchOptions, _BoxAPIWrapper @@ -113,8 +114,9 @@ class BoxRetriever(BaseRetriever): he decides to go to the pool with Carlos.' """ # noqa: E501 - box_developer_token: Optional[str] = None - """String containing the Box Developer Token generated in the developer console""" + box_developer_token: Optional[str] = Field( + default_factory=from_env("BOX_DEVELOPER_TOKEN", default=None) + ) box_auth: Optional[BoxAuth] = None """Configured @@ -131,6 +133,15 @@ class BoxRetriever(BaseRetriever): box_search_options: Optional[BoxSearchOptions] = None """Search options to configure BoxRetriever to narrow search results.""" + answer: Optional[bool] = True + """When using Box AI, return the answer to the prompt as a `Document` + object. Returned as `List[Document`]. Default is `True`.""" + + citations: Optional[bool] = False + """When using Box AI, return the citations from to the prompt as + `Document` objects. Can be used with answer. Returned as `List[Document`]. + Default is `False`.""" + _box: Optional[_BoxAPIWrapper] model_config = ConfigDict( @@ -164,6 +175,11 @@ class BoxRetriever(BaseRetriever): self, query: str, *, run_manager: CallbackManagerForRetrieverRun ) -> List[Document]: if self.box_file_ids: # If using Box AI - return self._box.ask_box_ai(query=query, box_file_ids=self.box_file_ids) # type: ignore[union-attr] + return self._box.ask_box_ai( # type: ignore[union-attr] + query=query, + box_file_ids=self.box_file_ids, + answer=self.answer, # type: ignore[arg-type] + citations=self.citations, # type: ignore[arg-type] + ) else: # If using Search return self._box.search_box(query=query) # type: ignore[union-attr] diff --git a/libs/partners/box/langchain_box/utilities/box.py b/libs/partners/box/langchain_box/utilities/box.py index 758f454a9da..8c87a8dc4cd 100644 --- a/libs/partners/box/langchain_box/utilities/box.py +++ b/libs/partners/box/langchain_box/utilities/box.py @@ -805,7 +805,13 @@ class _BoxAPIWrapper(BaseModel): f"BoxSDKError: Error getting search results: {bse.message}" ) - def ask_box_ai(self, query: str, box_file_ids: List[str]) -> List[Document]: + def ask_box_ai( + self, + query: str, + box_file_ids: List[str], + answer: bool = True, + citations: bool = False, + ) -> List[Document]: if self._box is None: self.get_box_client() @@ -819,13 +825,16 @@ class _BoxAPIWrapper(BaseModel): items = [] for file_id in box_file_ids: - item = box_sdk_gen.CreateAiAskItems( - id=file_id, type=box_sdk_gen.CreateAiAskItemsTypeField.FILE.value + item = box_sdk_gen.AiItemBase( + id=file_id, type=box_sdk_gen.AiItemBaseTypeField.FILE.value ) items.append(item) try: - response = self._box.ai.create_ai_ask(ai_mode, query, items) # type: ignore[union-attr] + response = self._box.ai.create_ai_ask( # type: ignore[union-attr] + mode=ai_mode, prompt=query, items=items, include_citations=citations + ) + except box_sdk_gen.BoxAPIError as bae: raise RuntimeError( f"BoxAPIError: Error getting Box AI result: {bae.message}" @@ -835,8 +844,32 @@ class _BoxAPIWrapper(BaseModel): f"BoxSDKError: Error getting Box AI result: {bse.message}" ) - content = response.answer + docs = [] - metadata = {"source": "Box AI", "title": f"Box AI {query}"} + if answer: + content = response.answer + metadata = {"source": "Box AI", "title": f"Box AI {query}"} - return [Document(page_content=content, metadata=metadata)] + document = Document(page_content=content, metadata=metadata) + docs.append(document) + + if citations: + box_citations = response.citations + + for citation in box_citations: + content = citation.content + file_name = citation.name + file_id = citation.id + file_type = citation.type.value + + metadata = { + "source": f"Box AI {query}", + "file_name": file_name, + "file_id": file_id, + "file_type": file_type, + } + + document = Document(page_content=content, metadata=metadata) + docs.append(document) + + return docs diff --git a/libs/partners/box/poetry.lock b/libs/partners/box/poetry.lock index 49e70f6fca4..c09158c9e79 100644 --- a/libs/partners/box/poetry.lock +++ b/libs/partners/box/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" +version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [package.dependencies] @@ -29,19 +29,19 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "box-sdk-gen" -version = "1.5.0" +version = "1.5.1" description = "Official Box Python Generated SDK" optional = false python-versions = "*" files = [ - {file = "box_sdk_gen-1.5.0-py3-none-any.whl", hash = "sha256:37763ace35fcb02ef84e28b4f61a93fe0d74ae22ceb9e1815ec1309b737cc016"}, - {file = "box_sdk_gen-1.5.0.tar.gz", hash = "sha256:49440a5dc4744261a877d149f0cad0a68f6096c2ad2a0c3392fe443269adca5f"}, + {file = "box_sdk_gen-1.5.1-py3-none-any.whl", hash = "sha256:3aba4615940566df86a236781ac34defd33ac127b9027a8a73775997b6a1ef97"}, + {file = "box_sdk_gen-1.5.1.tar.gz", hash = "sha256:2171b5a9b9d93014aecd4a883767459839515ecab18c6358868a5457401d896e"}, ] [package.dependencies] @@ -444,7 +444,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.3.1" +version = "0.3.6" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -453,7 +453,7 @@ develop = true [package.dependencies] jsonpatch = "^1.33" -langsmith = "^0.1.117" +langsmith = "^0.1.125" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -469,13 +469,13 @@ url = "../../core" [[package]] name = "langsmith" -version = "0.1.122" +version = "0.1.129" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.122-py3-none-any.whl", hash = "sha256:9c9cde442d7321e8557f5c45c14b1b643b8aa28acc3f844d3a0021a9571aad7c"}, - {file = "langsmith-0.1.122.tar.gz", hash = "sha256:56dff727ca529fe8df300e6e4759dc920efe10ab8cd602b4d6b51e33599214e6"}, + {file = "langsmith-0.1.129-py3-none-any.whl", hash = "sha256:31393fbbb17d6be5b99b9b22d530450094fab23c6c37281a6a6efb2143d05347"}, + {file = "langsmith-0.1.129.tar.gz", hash = "sha256:6c3ba66471bef41b9f87da247cc0b493268b3f54656f73648a256a205261b6a0"}, ] [package.dependencies] @@ -1076,4 +1076,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = ">=3.9.0,<3.13" -content-hash = "5fc4a4313b1be5863c4abe9d237ce4eef744c4ad9173a7496e138020db6673de" +content-hash = "fe5ad1ad0e68ef281c8fc11b19ddb9494343dd4931a9b33804bb9698fa5d3b3d" diff --git a/libs/partners/box/pyproject.toml b/libs/partners/box/pyproject.toml index 7487325be3c..af8cd16502b 100644 --- a/libs/partners/box/pyproject.toml +++ b/libs/partners/box/pyproject.toml @@ -14,7 +14,7 @@ license = "MIT" [tool.poetry.dependencies] python = ">=3.9.0,<3.13" langchain-core = "^0.3.1" -box-sdk-gen = { extras = ["jwt"], version = "^1.1.0" } +box-sdk-gen = { extras = ["jwt"], version = "^1.5.0" } pydantic = "^2" [tool.poetry.group.test] diff --git a/libs/partners/box/tests/unit_tests/retrievers/test_box_retriever.py b/libs/partners/box/tests/unit_tests/retrievers/test_box_retriever.py index 82a0a304207..054f7ed205c 100644 --- a/libs/partners/box/tests/unit_tests/retrievers/test_box_retriever.py +++ b/libs/partners/box/tests/unit_tests/retrievers/test_box_retriever.py @@ -131,3 +131,73 @@ def test_ai(mocker: MockerFixture) -> None: metadata={"title": "Testing Files"}, ) ] + + +# test ai retrieval with answer and citations +def test_ai_answer_citations(mocker: MockerFixture) -> None: + mocker.patch( + "langchain_box.utilities._BoxAPIWrapper.ask_box_ai", + return_value=( + [ + Document( + page_content="Test file mode\ndocument contents", + metadata={"title": "Testing Files"}, + ), + Document(page_content="citation 1", metadata={"source": "source 1"}), + Document(page_content="citation 2", metadata={"source": "source 2"}), + Document(page_content="citation 3", metadata={"source": "source 3"}), + Document(page_content="citation 4", metadata={"source": "source 4"}), + Document(page_content="citation 5", metadata={"source": "source 5"}), + ] + ), + ) + + retriever = BoxRetriever( # type: ignore[call-arg] + box_developer_token="box_developer_token", + box_file_ids=["box_file_ids"], + citations=True, + ) + + documents = retriever.invoke("query") + assert documents == [ + Document( + page_content="Test file mode\ndocument contents", + metadata={"title": "Testing Files"}, + ), + Document(page_content="citation 1", metadata={"source": "source 1"}), + Document(page_content="citation 2", metadata={"source": "source 2"}), + Document(page_content="citation 3", metadata={"source": "source 3"}), + Document(page_content="citation 4", metadata={"source": "source 4"}), + Document(page_content="citation 5", metadata={"source": "source 5"}), + ] + + +# test ai retrieval with citations only +def test_ai_citations_only(mocker: MockerFixture) -> None: + mocker.patch( + "langchain_box.utilities._BoxAPIWrapper.ask_box_ai", + return_value=( + [ + Document(page_content="citation 1", metadata={"source": "source 1"}), + Document(page_content="citation 2", metadata={"source": "source 2"}), + Document(page_content="citation 3", metadata={"source": "source 3"}), + Document(page_content="citation 4", metadata={"source": "source 4"}), + Document(page_content="citation 5", metadata={"source": "source 5"}), + ] + ), + ) + + retriever = BoxRetriever( # type: ignore[call-arg] + box_developer_token="box_developer_token", + box_file_ids=["box_file_ids"], + citations=True, + ) + + documents = retriever.invoke("query") + assert documents == [ + Document(page_content="citation 1", metadata={"source": "source 1"}), + Document(page_content="citation 2", metadata={"source": "source 2"}), + Document(page_content="citation 3", metadata={"source": "source 3"}), + Document(page_content="citation 4", metadata={"source": "source 4"}), + Document(page_content="citation 5", metadata={"source": "source 5"}), + ] From 11df1b2b8d1f99cb0455c8c8fd896c65fbd5433f Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:35:33 -0700 Subject: [PATCH 27/62] core[patch]: Release 0.3.9 (#27117) --- libs/core/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index 20dbf792c95..36a6cb9f593 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-core" -version = "0.3.8" +version = "0.3.9" description = "Building applications with LLMs through composability" authors = [] license = "MIT" @@ -45,7 +45,7 @@ python = ">=3.12.4" [tool.ruff.lint] select = [ "B", "C4", "E", "F", "I", "N", "PIE", "SIM", "T201", "UP", "W",] -ignore = [ "UP007", 'W293'] +ignore = [ "UP007", "W293",] [tool.coverage.run] omit = [ "tests/*",] From 414fe16071a79b70d3fb6ba5d7b2c989b7d0ad27 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:53:53 -0700 Subject: [PATCH 28/62] anthropic[patch]: Release 0.2.2 (#27118) --- libs/partners/anthropic/poetry.lock | 131 ++++++++++++++----------- libs/partners/anthropic/pyproject.toml | 4 +- 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/libs/partners/anthropic/poetry.lock b/libs/partners/anthropic/poetry.lock index e5ec26cb27c..5e783dda5a4 100644 --- a/libs/partners/anthropic/poetry.lock +++ b/libs/partners/anthropic/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "anthropic" -version = "0.34.2" +version = "0.35.0" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.7" files = [ - {file = "anthropic-0.34.2-py3-none-any.whl", hash = "sha256:f50a628eb71e2c76858b106c8cbea278c45c6bd2077cb3aff716a112abddc9fc"}, - {file = "anthropic-0.34.2.tar.gz", hash = "sha256:808ea19276f26646bfde9ee535669735519376e4eeb301a2974fc69892be1d6e"}, + {file = "anthropic-0.35.0-py3-none-any.whl", hash = "sha256:777983989ed9e444eb4a6d92dad84027f14a6639cba6f48772c0078d51959828"}, + {file = "anthropic-0.35.0.tar.gz", hash = "sha256:d2f998246413c309a7770d1faa617500f505377a04ab45a13a66f8559daf3742"}, ] [package.dependencies] @@ -38,13 +38,13 @@ vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "4.4.0" +version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [package.dependencies] @@ -54,9 +54,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "certifi" @@ -314,13 +314,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -331,7 +331,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -360,13 +360,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.25.0" +version = "0.25.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.25.0-py3-none-any.whl", hash = "sha256:e2f357b35d72d5012cfd127108c4e14abcd61ba4ebc90a5a374dc2456cb34e12"}, - {file = "huggingface_hub-0.25.0.tar.gz", hash = "sha256:fb5fbe6c12fcd99d187ec7db95db9110fb1a20505f23040a5449a717c1a0db4d"}, + {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"}, + {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"}, ] [package.dependencies] @@ -514,7 +514,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.3.1" +version = "0.3.9" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -523,7 +523,7 @@ develop = true [package.dependencies] jsonpatch = "^1.33" -langsmith = "^0.1.117" +langsmith = "^0.1.125" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -558,13 +558,13 @@ url = "../../standard-tests" [[package]] name = "langsmith" -version = "0.1.121" +version = "0.1.131" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.121-py3-none-any.whl", hash = "sha256:fdb1ac8a671d3904201bfeea197d87bded46a10d08f1034af464211872e29893"}, - {file = "langsmith-0.1.121.tar.gz", hash = "sha256:e9381b82a5bd484af9a51c3e96faea572746b8d617b070c1cda40cbbe48e33df"}, + {file = "langsmith-0.1.131-py3-none-any.whl", hash = "sha256:80c106b1c42307195cc0bb3a596472c41ef91b79d15bcee9938307800336c563"}, + {file = "langsmith-0.1.131.tar.gz", hash = "sha256:626101a3bf3ca481e5110d5155ace8aa066e4e9cc2fa7d96c8290ade0fbff797"}, ] [package.dependencies] @@ -575,6 +575,7 @@ pydantic = [ {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "mypy" @@ -1019,6 +1020,20 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "ruff" version = "0.5.7" @@ -1216,13 +1231,13 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -1275,41 +1290,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "5.0.2" +version = "5.0.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -1318,4 +1333,4 @@ watchmedo = ["PyYAML (>=3.10)"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "3e91787d600949b4f2530c3eb00c854945aec2a8ce8977b724360b4d084db133" +content-hash = "ff45241f112ccfe1ca845dfc9685f7b63d7cb0a362acffbb17d81ff4691af9d4" diff --git a/libs/partners/anthropic/pyproject.toml b/libs/partners/anthropic/pyproject.toml index 76c802cf41a..834474d5afc 100644 --- a/libs/partners/anthropic/pyproject.toml +++ b/libs/partners/anthropic/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-anthropic" -version = "0.2.1" +version = "0.2.2" description = "An integration package connecting AnthropicMessages and LangChain" authors = [] readme = "README.md" @@ -21,7 +21,7 @@ disallow_untyped_defs = "True" [tool.poetry.dependencies] python = ">=3.9,<4.0" anthropic = ">=0.30.0,<1" -langchain-core = "^0.3.1" +langchain-core = "^0.3.9" pydantic = "^2.7.4" [tool.ruff.lint] From 98942edcc90b3789723dbf1395270855c51b20c0 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:54:01 -0700 Subject: [PATCH 29/62] openai[patch]: Release 0.2.2 (#27119) --- libs/partners/openai/poetry.lock | 395 ++++++++++++++-------------- libs/partners/openai/pyproject.toml | 4 +- 2 files changed, 206 insertions(+), 193 deletions(-) diff --git a/libs/partners/openai/poetry.lock b/libs/partners/openai/poetry.lock index 0f9b08324cc..9d9e88d6a47 100644 --- a/libs/partners/openai/poetry.lock +++ b/libs/partners/openai/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" +version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [package.dependencies] @@ -29,9 +29,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "certifi" @@ -310,13 +310,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -327,7 +327,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -356,15 +356,18 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -473,7 +476,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.3.0" +version = "0.3.9" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -482,7 +485,7 @@ develop = true [package.dependencies] jsonpatch = "^1.33" -langsmith = "^0.1.117" +langsmith = "^0.1.125" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -507,7 +510,7 @@ develop = true [package.dependencies] httpx = "^0.27.0" -langchain-core = ">=0.3.0.dev1" +langchain-core = "^0.3.0" pytest = ">=7,<9" syrupy = "^4" @@ -517,13 +520,13 @@ url = "../../standard-tests" [[package]] name = "langsmith" -version = "0.1.120" +version = "0.1.131" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.120-py3-none-any.whl", hash = "sha256:54d2785e301646c0988e0a69ebe4d976488c87b41928b358cb153b6ddd8db62b"}, - {file = "langsmith-0.1.120.tar.gz", hash = "sha256:25499ca187b41bd89d784b272b97a8d76f60e0e21bdf20336e8a2aa6a9b23ac9"}, + {file = "langsmith-0.1.131-py3-none-any.whl", hash = "sha256:80c106b1c42307195cc0bb3a596472c41ef91b79d15bcee9938307800336c563"}, + {file = "langsmith-0.1.131.tar.gz", hash = "sha256:626101a3bf3ca481e5110d5155ace8aa066e4e9cc2fa7d96c8290ade0fbff797"}, ] [package.dependencies] @@ -534,6 +537,7 @@ pydantic = [ {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "mypy" @@ -640,13 +644,13 @@ files = [ [[package]] name = "openai" -version = "1.45.0" +version = "1.51.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.45.0-py3-none-any.whl", hash = "sha256:2f1f7b7cf90f038a9f1c24f0d26c0f1790c102ec5acd07ffd70a9b7feac1ff4e"}, - {file = "openai-1.45.0.tar.gz", hash = "sha256:731207d10637335413aa3c0955f8f8df30d7636a4a0f9c381f2209d32cf8de97"}, + {file = "openai-1.51.0-py3-none-any.whl", hash = "sha256:d9affafb7e51e5a27dce78589d4964ce4d6f6d560307265933a94b2e3f3c5d2c"}, + {file = "openai-1.51.0.tar.gz", hash = "sha256:8dc4f9d75ccdd5466fc8c99a952186eddceb9fd6ba694044773f3736a847149d"}, ] [package.dependencies] @@ -853,18 +857,18 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, @@ -876,100 +880,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -1265,6 +1269,20 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "ruff" version = "0.5.7" @@ -1345,47 +1363,42 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tiktoken" -version = "0.7.0" +version = "0.8.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, - {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, - {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, - {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, - {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, - {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, - {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, - {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"}, + {file = "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"}, + {file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"}, + {file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"}, + {file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"}, + {file = "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"}, + {file = "tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"}, + {file = "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"}, + {file = "tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"}, + {file = "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"}, + {file = "tiktoken-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"}, + {file = "tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"}, ] [package.dependencies] @@ -1397,13 +1410,13 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -1467,41 +1480,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "5.0.2" +version = "5.0.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -1510,4 +1523,4 @@ watchmedo = ["PyYAML (>=3.10)"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "d166346e440b35690981e166fd6d92f254afcdd57a661ba9f811842cc96622e7" +content-hash = "fec30c155fdf4518310435f840b374ff86183936452fed3f59ad8ee0fcfefac5" diff --git a/libs/partners/openai/pyproject.toml b/libs/partners/openai/pyproject.toml index 24ea6eb1536..d4c3a5875d7 100644 --- a/libs/partners/openai/pyproject.toml +++ b/libs/partners/openai/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-openai" -version = "0.2.1" +version = "0.2.2" description = "An integration package connecting OpenAI and LangChain" authors = [] readme = "README.md" @@ -23,7 +23,7 @@ ignore_missing_imports = true [tool.poetry.dependencies] python = ">=3.9,<4.0" -langchain-core = "^0.3" +langchain-core = "^0.3.9" openai = "^1.40.0" tiktoken = ">=0.7,<1" From 827bdf4f5104d7c88d0241aff0782f7070b96758 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:59:15 -0700 Subject: [PATCH 30/62] fireworks[patch]: Release 0.2.1 (#27120) --- libs/partners/fireworks/poetry.lock | 716 +++++++++++++------------ libs/partners/fireworks/pyproject.toml | 16 +- 2 files changed, 373 insertions(+), 359 deletions(-) diff --git a/libs/partners/fireworks/poetry.lock b/libs/partners/fireworks/poetry.lock index 6773ca4f626..5f424993371 100644 --- a/libs/partners/fireworks/poetry.lock +++ b/libs/partners/fireworks/poetry.lock @@ -1,114 +1,114 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.9" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"}, + {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"}, + {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"}, + {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"}, + {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"}, + {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, + {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, + {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, + {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, + {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, + {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"}, + {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"}, + {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"}, + {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"}, + {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"}, + {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"}, + {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"}, + {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"}, + {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"}, + {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"}, + {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"}, + {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"}, + {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"}, + {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"}, + {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"}, + {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"}, + {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"}, + {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"}, + {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"}, + {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"}, + {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"}, + {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, ] [package.dependencies] @@ -118,7 +118,7 @@ async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -150,13 +150,13 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" +version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [package.dependencies] @@ -166,9 +166,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "async-timeout" @@ -365,13 +365,13 @@ test = ["pytest (>=6)"] [[package]] name = "fireworks-ai" -version = "0.15.1" +version = "0.15.4" description = "Python client library for the Fireworks.ai Generative AI Platform" optional = false python-versions = ">=3.7" files = [ - {file = "fireworks_ai-0.15.1-py3-none-any.whl", hash = "sha256:56aeeb694019db95377ba7cecc45dbc575c4de56cb411a5bda5ca78e6871ab22"}, - {file = "fireworks_ai-0.15.1.tar.gz", hash = "sha256:fb78df46eef3a23b9cc63cb9bbb5242c3851bce40d9c1ae059161cd6b3e430b8"}, + {file = "fireworks_ai-0.15.4-py3-none-any.whl", hash = "sha256:fb2e5c6aef53ee4bf489110c3fd838bfc73f0c7f129611771037d0d30cf4f920"}, + {file = "fireworks_ai-0.15.4.tar.gz", hash = "sha256:414c6a791257eecd6dc571eb33a86e53dcc3768322aef82a5ac3151b1c2a209f"}, ] [package.dependencies] @@ -493,13 +493,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -510,7 +510,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -550,15 +550,18 @@ files = [ [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -667,7 +670,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.3.0" +version = "0.3.9" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.9,<4.0" @@ -676,7 +679,7 @@ develop = true [package.dependencies] jsonpatch = "^1.33" -langsmith = "^0.1.117" +langsmith = "^0.1.125" packaging = ">=23.2,<25" pydantic = [ {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, @@ -701,7 +704,7 @@ develop = true [package.dependencies] httpx = "^0.27.0" -langchain-core = ">=0.3.0.dev1" +langchain-core = "^0.3.0" pytest = ">=7,<9" syrupy = "^4" @@ -711,13 +714,13 @@ url = "../../standard-tests" [[package]] name = "langsmith" -version = "0.1.120" +version = "0.1.131" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.120-py3-none-any.whl", hash = "sha256:54d2785e301646c0988e0a69ebe4d976488c87b41928b358cb153b6ddd8db62b"}, - {file = "langsmith-0.1.120.tar.gz", hash = "sha256:25499ca187b41bd89d784b272b97a8d76f60e0e21bdf20336e8a2aa6a9b23ac9"}, + {file = "langsmith-0.1.131-py3-none-any.whl", hash = "sha256:80c106b1c42307195cc0bb3a596472c41ef91b79d15bcee9938307800336c563"}, + {file = "langsmith-0.1.131.tar.gz", hash = "sha256:626101a3bf3ca481e5110d5155ace8aa066e4e9cc2fa7d96c8290ade0fbff797"}, ] [package.dependencies] @@ -728,6 +731,7 @@ pydantic = [ {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] requests = ">=2,<3" +requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "multidict" @@ -893,13 +897,13 @@ files = [ [[package]] name = "openai" -version = "1.45.0" +version = "1.51.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.45.0-py3-none-any.whl", hash = "sha256:2f1f7b7cf90f038a9f1c24f0d26c0f1790c102ec5acd07ffd70a9b7feac1ff4e"}, - {file = "openai-1.45.0.tar.gz", hash = "sha256:731207d10637335413aa3c0955f8f8df30d7636a4a0f9c381f2209d32cf8de97"}, + {file = "openai-1.51.0-py3-none-any.whl", hash = "sha256:d9affafb7e51e5a27dce78589d4964ce4d6f6d560307265933a94b2e3f3c5d2c"}, + {file = "openai-1.51.0.tar.gz", hash = "sha256:8dc4f9d75ccdd5466fc8c99a952186eddceb9fd6ba694044773f3736a847149d"}, ] [package.dependencies] @@ -1106,18 +1110,18 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, @@ -1129,100 +1133,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -1397,6 +1401,20 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "ruff" version = "0.5.7" @@ -1477,13 +1495,13 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -1508,13 +1526,13 @@ telegram = ["requests"] [[package]] name = "types-requests" -version = "2.32.0.20240907" +version = "2.32.0.20240914" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.32.0.20240907.tar.gz", hash = "sha256:ff33935f061b5e81ec87997e91050f7b4af4f82027a7a7a9d9aaea04a963fdf8"}, - {file = "types_requests-2.32.0.20240907-py3-none-any.whl", hash = "sha256:1d1e79faeaf9d42def77f3c304893dea17a97cae98168ac69f3cb465516ee8da"}, + {file = "types-requests-2.32.0.20240914.tar.gz", hash = "sha256:2850e178db3919d9bf809e434eef65ba49d0e7e33ac92d588f4a5e295fffd405"}, + {file = "types_requests-2.32.0.20240914-py3-none-any.whl", hash = "sha256:59c2f673eb55f32a99b2894faf6020e1a9f4a402ad0f192bfee0b64469054310"}, ] [package.dependencies] @@ -1550,41 +1568,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "5.0.2" +version = "5.0.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -1592,103 +1610,103 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "yarl" -version = "1.11.1" +version = "1.13.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, - {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, - {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, - {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, - {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, - {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, - {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, - {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, - {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, - {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, - {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, - {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, - {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, - {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, - {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -1698,4 +1716,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "bbe033083912607ce26fc35f7d73a95ff7d1d16d115a0fb9f2c8768d7d119788" +content-hash = "56f279717e189244fb82561676aac12e1be0d39400d261a1587302335563a091" diff --git a/libs/partners/fireworks/pyproject.toml b/libs/partners/fireworks/pyproject.toml index 44f26c99710..dd44828ff59 100644 --- a/libs/partners/fireworks/pyproject.toml +++ b/libs/partners/fireworks/pyproject.toml @@ -1,10 +1,10 @@ [build-system] -requires = ["poetry-core>=1.0.0"] +requires = [ "poetry-core>=1.0.0",] build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-fireworks" -version = "0.2.0" +version = "0.2.1" description = "An integration package connecting Fireworks and LangChain" authors = [] readme = "README.md" @@ -20,25 +20,21 @@ disallow_untyped_defs = "True" [tool.poetry.dependencies] python = ">=3.9,<4.0" -langchain-core = "^0.3.0" +langchain-core = "^0.3.9" fireworks-ai = ">=0.13.0" openai = "^1.10.0" requests = "^2" aiohttp = "^3.9.1" [tool.ruff.lint] -select = ["E", "F", "I", "T201"] +select = [ "E", "F", "I", "T201",] [tool.coverage.run] -omit = ["tests/*"] +omit = [ "tests/*",] [tool.pytest.ini_options] addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5" -markers = [ - "requires: mark tests as requiring a specific library", - "asyncio: mark tests as requiring asyncio", - "compile: mark placeholder test used to compile integration tests without running them", -] +markers = [ "requires: mark tests as requiring a specific library", "asyncio: mark tests as requiring asyncio", "compile: mark placeholder test used to compile integration tests without running them",] asyncio_mode = "auto" [tool.poetry.group.test] From bd5b335cb47d7da1598ae6d48e221aa6f511b6c7 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 13:00:48 -0700 Subject: [PATCH 31/62] standard-tests[patch]: fix oai usage metadata test (#27122) --- .../tests/integration_tests/test_standard.py | 26 ++++++++++++------- .../chat_models/test_base.py | 24 ----------------- .../chat_models/test_base_standard.py | 23 +++++++++------- .../integration_tests/chat_models.py | 20 +++++++------- .../unit_tests/chat_models.py | 23 +++++++++------- 5 files changed, 52 insertions(+), 64 deletions(-) diff --git a/libs/partners/anthropic/tests/integration_tests/test_standard.py b/libs/partners/anthropic/tests/integration_tests/test_standard.py index 24f8766ad06..241588f32a3 100644 --- a/libs/partners/anthropic/tests/integration_tests/test_standard.py +++ b/libs/partners/anthropic/tests/integration_tests/test_standard.py @@ -1,7 +1,7 @@ """Standard LangChain interface tests""" from pathlib import Path -from typing import List, Literal, Type, cast +from typing import Dict, List, Literal, Type, cast from langchain_core.language_models import BaseChatModel from langchain_core.messages import AIMessage @@ -36,16 +36,22 @@ class TestAnthropicStandard(ChatModelIntegrationTests): @property def supported_usage_metadata_details( self, - ) -> List[ - Literal[ - "audio_input", - "audio_output", - "reasoning_output", - "cache_read_input", - "cache_creation_input", - ] + ) -> Dict[ + Literal["invoke", "stream"], + List[ + Literal[ + "audio_input", + "audio_output", + "reasoning_output", + "cache_read_input", + "cache_creation_input", + ] + ], ]: - return ["cache_read_input", "cache_creation_input"] + return { + "invoke": ["cache_read_input", "cache_creation_input"], + "stream": ["cache_read_input", "cache_creation_input"], + } def invoke_with_cache_creation_input(self, *, stream: bool = False) -> AIMessage: llm = ChatAnthropic( diff --git a/libs/partners/openai/tests/integration_tests/chat_models/test_base.py b/libs/partners/openai/tests/integration_tests/chat_models/test_base.py index fb2a150efd2..950a52ce3ee 100644 --- a/libs/partners/openai/tests/integration_tests/chat_models/test_base.py +++ b/libs/partners/openai/tests/integration_tests/chat_models/test_base.py @@ -238,30 +238,6 @@ async def test_async_chat_openai_bind_functions() -> None: assert isinstance(generation, AIMessage) -def test_chat_openai_extra_kwargs() -> None: - """Test extra kwargs to chat openai.""" - # Check that foo is saved in extra_kwargs. - llm = ChatOpenAI(foo=3, max_tokens=10) # type: ignore[call-arg] - assert llm.max_tokens == 10 - assert llm.model_kwargs == {"foo": 3} - - # Test that if extra_kwargs are provided, they are added to it. - llm = ChatOpenAI(foo=3, model_kwargs={"bar": 2}) # type: ignore[call-arg] - assert llm.model_kwargs == {"foo": 3, "bar": 2} - - # Test that if provided twice it errors - with pytest.raises(ValueError): - ChatOpenAI(foo=3, model_kwargs={"foo": 2}) # type: ignore[call-arg] - - # Test that if explicit param is specified in kwargs it errors - with pytest.raises(ValueError): - ChatOpenAI(model_kwargs={"temperature": 0.2}) - - # Test that "model" cannot be specified in kwargs - with pytest.raises(ValueError): - ChatOpenAI(model_kwargs={"model": "gpt-3.5-turbo-instruct"}) - - @pytest.mark.scheduled def test_openai_streaming() -> None: """Test streaming tokens from OpenAI.""" diff --git a/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py b/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py index b91b590ad7c..b021603aace 100644 --- a/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py +++ b/libs/partners/openai/tests/integration_tests/chat_models/test_base_standard.py @@ -1,7 +1,7 @@ """Standard LangChain interface tests""" from pathlib import Path -from typing import List, Literal, Type, cast +from typing import Dict, List, Literal, Type, cast from langchain_core.language_models import BaseChatModel from langchain_core.messages import AIMessage @@ -28,16 +28,19 @@ class TestOpenAIStandard(ChatModelIntegrationTests): @property def supported_usage_metadata_details( self, - ) -> List[ - Literal[ - "audio_input", - "audio_output", - "reasoning_output", - "cache_read_input", - "cache_creation_input", - ] + ) -> Dict[ + Literal["invoke", "stream"], + List[ + Literal[ + "audio_input", + "audio_output", + "reasoning_output", + "cache_read_input", + "cache_creation_input", + ] + ], ]: - return ["reasoning_output", "cache_read_input"] + return {"invoke": ["reasoning_output", "cache_read_input"], "stream": []} def invoke_with_cache_read_input(self, *, stream: bool = False) -> AIMessage: with open(REPO_ROOT_DIR / "README.md", "r") as f: diff --git a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py index 1da209095ef..fc5814cba7e 100644 --- a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py @@ -151,25 +151,25 @@ class ChatModelIntegrationTests(ChatModelTests): assert isinstance(result.usage_metadata["output_tokens"], int) assert isinstance(result.usage_metadata["total_tokens"], int) - if "audio_input" in self.supported_usage_metadata_details: + if "audio_input" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_audio_input() assert isinstance(msg.usage_metadata["input_token_details"]["audio"], int) # type: ignore[index] - if "audio_output" in self.supported_usage_metadata_details: + if "audio_output" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_audio_output() assert isinstance(msg.usage_metadata["output_token_details"]["audio"], int) # type: ignore[index] - if "reasoning_output" in self.supported_usage_metadata_details: + if "reasoning_output" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_reasoning_output() assert isinstance( msg.usage_metadata["output_token_details"]["reasoning"], # type: ignore[index] int, ) - if "cache_read_input" in self.supported_usage_metadata_details: + if "cache_read_input" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_cache_read_input() assert isinstance( msg.usage_metadata["input_token_details"]["cache_read"], # type: ignore[index] int, ) - if "cache_creation_input" in self.supported_usage_metadata_details: + if "cache_creation_input" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_cache_creation_input() assert isinstance( msg.usage_metadata["input_token_details"]["cache_creation"], # type: ignore[index] @@ -189,25 +189,25 @@ class ChatModelIntegrationTests(ChatModelTests): assert isinstance(full.usage_metadata["output_tokens"], int) assert isinstance(full.usage_metadata["total_tokens"], int) - if "audio_input" in self.supported_usage_metadata_details: + if "audio_input" in self.supported_usage_metadata_details["stream"]: msg = self.invoke_with_audio_input(stream=True) assert isinstance(msg.usage_metadata["input_token_details"]["audio"], int) # type: ignore[index] - if "audio_output" in self.supported_usage_metadata_details: + if "audio_output" in self.supported_usage_metadata_details["stream"]: msg = self.invoke_with_audio_output(stream=True) assert isinstance(msg.usage_metadata["output_token_details"]["audio"], int) # type: ignore[index] - if "reasoning_output" in self.supported_usage_metadata_details: + if "reasoning_output" in self.supported_usage_metadata_details["stream"]: msg = self.invoke_with_reasoning_output(stream=True) assert isinstance( msg.usage_metadata["output_token_details"]["reasoning"], # type: ignore[index] int, ) - if "cache_read_input" in self.supported_usage_metadata_details: + if "cache_read_input" in self.supported_usage_metadata_details["stream"]: msg = self.invoke_with_cache_read_input(stream=True) assert isinstance( msg.usage_metadata["input_token_details"]["cache_read"], # type: ignore[index] int, ) - if "cache_creation_input" in self.supported_usage_metadata_details: + if "cache_creation_input" in self.supported_usage_metadata_details["stream"]: msg = self.invoke_with_cache_creation_input(stream=True) assert isinstance( msg.usage_metadata["input_token_details"]["cache_creation"], # type: ignore[index] diff --git a/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py index 1298c022852..1321eb62151 100644 --- a/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/unit_tests/chat_models.py @@ -2,7 +2,7 @@ import os from abc import abstractmethod -from typing import Any, List, Literal, Optional, Tuple, Type +from typing import Any, Dict, List, Literal, Optional, Tuple, Type from unittest import mock import pytest @@ -141,16 +141,19 @@ class ChatModelTests(BaseStandardTests): @property def supported_usage_metadata_details( self, - ) -> List[ - Literal[ - "audio_input", - "audio_output", - "reasoning_output", - "cache_read_input", - "cache_creation_input", - ] + ) -> Dict[ + Literal["invoke", "stream"], + List[ + Literal[ + "audio_input", + "audio_output", + "reasoning_output", + "cache_read_input", + "cache_creation_input", + ] + ], ]: - return [] + return {"invoke": [], "stream": []} class ChatModelUnitTests(ChatModelTests): From 64a16f2cf0f7e303b7e544e7a3eb1d519aeda473 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Fri, 4 Oct 2024 14:41:41 -0700 Subject: [PATCH 32/62] infra: add nvidia and astradb back to api build (#27115) test build https://github.com/langchain-ai/langchain/actions/runs/11185115845 --- .github/workflows/api_doc_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/api_doc_build.yml b/.github/workflows/api_doc_build.yml index 5cb09453a37..9faaaa1c20a 100644 --- a/.github/workflows/api_doc_build.yml +++ b/.github/workflows/api_doc_build.yml @@ -101,8 +101,8 @@ jobs: mv langchain-google/libs/genai langchain/libs/partners/google-genai mv langchain-google/libs/vertexai langchain/libs/partners/google-vertexai mv langchain-google/libs/community langchain/libs/partners/google-community - # mv langchain-datastax/libs/astradb langchain/libs/partners/astradb - # mv langchain-nvidia/libs/ai-endpoints langchain/libs/partners/nvidia-ai-endpoints + mv langchain-datastax/libs/astradb langchain/libs/partners/astradb + mv langchain-nvidia/libs/ai-endpoints langchain/libs/partners/nvidia-ai-endpoints mv langchain-cohere/libs/cohere langchain/libs/partners/cohere mv langchain-elastic/libs/elasticsearch langchain/libs/partners/elasticsearch mv langchain-postgres langchain/libs/partners/postgres From 0b8416bd2ea33f1f7a881e03b3061f330443a042 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:35:51 -0700 Subject: [PATCH 33/62] anthropic[patch]: fix input_tokens when cached (#27125) --- .../langchain_anthropic/chat_models.py | 7 +++- .../tests/unit_tests/test_chat_models.py | 4 +- .../integration_tests/chat_models.py | 40 ++++++++++++++++--- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index dd55d4062c6..7b7e48462c0 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -1253,7 +1253,12 @@ def _create_usage_metadata(anthropic_usage: BaseModel) -> UsageMetadata: "cache_creation": getattr(anthropic_usage, "cache_creation_input_tokens", None), } - input_tokens = getattr(anthropic_usage, "input_tokens", 0) + # Anthropic input_tokens exclude cached token counts. + input_tokens = ( + getattr(anthropic_usage, "input_tokens", 0) + + (input_token_details["cache_read"] or 0) + + (input_token_details["cache_creation"] or 0) + ) output_tokens = getattr(anthropic_usage, "output_tokens", 0) return UsageMetadata( input_tokens=input_tokens, diff --git a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py index fd84fd338b1..859a2fa5acf 100644 --- a/libs/partners/anthropic/tests/unit_tests/test_chat_models.py +++ b/libs/partners/anthropic/tests/unit_tests/test_chat_models.py @@ -128,9 +128,9 @@ def test__format_output_cached() -> None: expected = AIMessage( # type: ignore[misc] "bar", usage_metadata={ - "input_tokens": 2, + "input_tokens": 9, "output_tokens": 1, - "total_tokens": 3, + "total_tokens": 10, "input_token_details": {"cache_creation": 3, "cache_read": 4}, }, ) diff --git a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py index fc5814cba7e..b5e0a9a0bd4 100644 --- a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py @@ -153,28 +153,58 @@ class ChatModelIntegrationTests(ChatModelTests): if "audio_input" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_audio_input() - assert isinstance(msg.usage_metadata["input_token_details"]["audio"], int) # type: ignore[index] + assert msg.usage_metadata is not None + assert msg.usage_metadata["input_token_details"] is not None + assert isinstance(msg.usage_metadata["input_token_details"]["audio"], int) + assert msg.usage_metadata["input_tokens"] >= sum( + (v or 0) # type: ignore[misc] + for v in msg.usage_metadata["input_token_details"].values() + ) if "audio_output" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_audio_output() - assert isinstance(msg.usage_metadata["output_token_details"]["audio"], int) # type: ignore[index] + assert msg.usage_metadata is not None + assert msg.usage_metadata["output_token_details"] is not None + assert isinstance(msg.usage_metadata["output_token_details"]["audio"], int) + assert int(msg.usage_metadata["output_tokens"]) >= sum( + (v or 0) # type: ignore[misc] + for v in msg.usage_metadata["output_token_details"].values() + ) if "reasoning_output" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_reasoning_output() + assert msg.usage_metadata is not None + assert msg.usage_metadata["output_token_details"] is not None assert isinstance( - msg.usage_metadata["output_token_details"]["reasoning"], # type: ignore[index] + msg.usage_metadata["output_token_details"]["reasoning"], int, ) + assert msg.usage_metadata["output_tokens"] >= sum( + (v or 0) # type: ignore[misc] + for v in msg.usage_metadata["output_token_details"].values() + ) if "cache_read_input" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_cache_read_input() + assert msg.usage_metadata is not None + assert msg.usage_metadata["input_token_details"] is not None assert isinstance( - msg.usage_metadata["input_token_details"]["cache_read"], # type: ignore[index] + msg.usage_metadata["input_token_details"]["cache_read"], int, ) + assert msg.usage_metadata["input_tokens"] >= sum( + (v or 0) # type: ignore[misc] + for v in msg.usage_metadata["input_token_details"].values() + ) if "cache_creation_input" in self.supported_usage_metadata_details["invoke"]: msg = self.invoke_with_cache_creation_input() + assert msg.usage_metadata is not None + assert msg.usage_metadata["input_token_details"] is not None assert isinstance( - msg.usage_metadata["input_token_details"]["cache_creation"], # type: ignore[index] + msg.usage_metadata["input_token_details"]["cache_creation"], int, ) + assert msg.usage_metadata["input_tokens"] >= sum( + (v or 0) # type: ignore[misc] + for v in msg.usage_metadata["input_token_details"].values() + ) def test_usage_metadata_streaming(self, model: BaseChatModel) -> None: if not self.returns_usage_metadata: From 06ce5d1d5c202e8c03ee26349d7dcc873ae2726a Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:38:03 -0700 Subject: [PATCH 34/62] anthropic[patch]: Release 0.2.3 (#27126) --- libs/partners/anthropic/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/partners/anthropic/pyproject.toml b/libs/partners/anthropic/pyproject.toml index 834474d5afc..12bec1e3ae2 100644 --- a/libs/partners/anthropic/pyproject.toml +++ b/libs/partners/anthropic/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-anthropic" -version = "0.2.2" +version = "0.2.3" description = "An integration package connecting AnthropicMessages and LangChain" authors = [] readme = "README.md" From 7a07196df683582c783edf164bfb6fe813135169 Mon Sep 17 00:00:00 2001 From: Averi Kitsch Date: Fri, 4 Oct 2024 16:59:10 -0700 Subject: [PATCH 35/62] docs: update Google Spanner Vector Store documentation (#27124) Thank you for contributing to LangChain! - [X] **PR title**: "package: description" - Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "templates: ..." for template changes, "infra: ..." for CI changes. - Example: "community: add foobar LLM" - [x] **PR message**: ***Delete this entire checklist*** and replace with - **Description:** Update Spanner VS integration doc - **Issue:** None - **Dependencies:** None - **Twitter handle:** NA - [x] **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. - [x] **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, ccurme, vbarda, hwchase17. Co-authored-by: Erick Friis --- .../vectorstores/google_spanner.ipynb | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/docs/docs/integrations/vectorstores/google_spanner.ipynb b/docs/docs/integrations/vectorstores/google_spanner.ipynb index c7c0d90299c..fb06a692964 100644 --- a/docs/docs/integrations/vectorstores/google_spanner.ipynb +++ b/docs/docs/integrations/vectorstores/google_spanner.ipynb @@ -52,7 +52,7 @@ } ], "source": [ - "%pip install --upgrade --quiet langchain-google-spanner" + "%pip install --upgrade --quiet langchain-google-spanner langchain-google-vertexai" ] }, { @@ -124,7 +124,8 @@ "PROJECT_ID = \"my-project-id\" # @param {type:\"string\"}\n", "\n", "# Set the project id\n", - "!gcloud config set project {PROJECT_ID}" + "!gcloud config set project {PROJECT_ID}\n", + "%env GOOGLE_CLOUD_PROJECT={PROJECT_ID}" ] }, { @@ -194,14 +195,16 @@ " instance_id=INSTANCE,\n", " database_id=DATABASE,\n", " table_name=TABLE_NAME,\n", - " id_column=\"row_id\",\n", - " metadata_columns=[\n", - " TableColumn(name=\"metadata\", type=\"JSON\", is_null=True),\n", - " TableColumn(name=\"title\", type=\"STRING(MAX)\", is_null=False),\n", - " ],\n", - " secondary_indexes=[\n", - " SecondaryIndex(index_name=\"row_id_and_title\", columns=[\"row_id\", \"title\"])\n", - " ],\n", + " # Customize the table creation\n", + " # id_column=\"row_id\",\n", + " # content_column=\"content_column\",\n", + " # metadata_columns=[\n", + " # TableColumn(name=\"metadata\", type=\"JSON\", is_null=True),\n", + " # TableColumn(name=\"title\", type=\"STRING(MAX)\", is_null=False),\n", + " # ],\n", + " # secondary_indexes=[\n", + " # SecondaryIndex(index_name=\"row_id_and_title\", columns=[\"row_id\", \"title\"])\n", + " # ],\n", ")" ] }, @@ -262,9 +265,11 @@ " instance_id=INSTANCE,\n", " database_id=DATABASE,\n", " table_name=TABLE_NAME,\n", - " ignore_metadata_columns=[],\n", " embedding_service=embeddings,\n", - " metadata_json_column=\"metadata\",\n", + " # Connect to a custom vector store table\n", + " # id_column=\"row_id\",\n", + " # content_column=\"content\",\n", + " # metadata_columns=[\"metadata\", \"title\"],\n", ")" ] }, @@ -272,7 +277,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 🔐 Add Documents\n", + "#### Add Documents\n", "To add documents in the vector store." ] }, @@ -289,14 +294,15 @@ "loader = HNLoader(\"https://news.ycombinator.com/item?id=34817881\")\n", "\n", "documents = loader.load()\n", - "ids = [str(uuid.uuid4()) for _ in range(len(documents))]" + "ids = [str(uuid.uuid4()) for _ in range(len(documents))]\n", + "db.add_documents(documents, ids)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 🔐 Search Documents\n", + "#### Search Documents\n", "To search documents in the vector store with similarity search." ] }, @@ -313,7 +319,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 🔐 Search Documents\n", + "#### Search Documents\n", "To search documents in the vector store with max marginal relevance search." ] }, @@ -330,7 +336,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 🔐 Delete Documents\n", + "#### Delete Documents\n", "To remove documents from the vector store, use the IDs that correspond to the values in the `row_id`` column when initializing the VectorStore." ] }, @@ -347,7 +353,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 🔐 Delete Documents\n", + "#### Delete Documents\n", "To remove documents from the vector store, you can utilize the documents themselves. The content column and metadata columns provided during VectorStore initialization will be used to find out the rows corresponding to the documents. Any matching rows will then be deleted." ] }, @@ -377,7 +383,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.11.8" } }, "nbformat": 4, From 07dd8dd3d7044c3b677343848aa3a37721c92d2e Mon Sep 17 00:00:00 2001 From: ogawa <63557554+ogawa65a@users.noreply.github.com> Date: Mon, 7 Oct 2024 22:06:30 +0900 Subject: [PATCH 36/62] community[patch]: update gpt-4o cost (#27038) updated OpenAI cost definition according to the following: https://openai.com/api/pricing/ --- libs/community/langchain_community/callbacks/openai_info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/community/langchain_community/callbacks/openai_info.py b/libs/community/langchain_community/callbacks/openai_info.py index 7fbb0d097e1..9e2c070ccd2 100644 --- a/libs/community/langchain_community/callbacks/openai_info.py +++ b/libs/community/langchain_community/callbacks/openai_info.py @@ -27,11 +27,11 @@ MODEL_COST_PER_1K_TOKENS = { "gpt-4o-mini-completion": 0.0006, "gpt-4o-mini-2024-07-18-completion": 0.0006, # GPT-4o input - "gpt-4o": 0.005, + "gpt-4o": 0.0025, "gpt-4o-2024-05-13": 0.005, "gpt-4o-2024-08-06": 0.0025, # GPT-4o output - "gpt-4o-completion": 0.015, + "gpt-4o-completion": 0.01, "gpt-4o-2024-05-13-completion": 0.015, "gpt-4o-2024-08-06-completion": 0.01, # GPT-4 input From 38099800cc0adc0e8f07bc1fc44d0a10fc4009a4 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Mon, 7 Oct 2024 09:51:42 -0700 Subject: [PATCH 37/62] docs: fix anthropic max_tokens docstring (#27166) --- libs/partners/anthropic/langchain_anthropic/chat_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/partners/anthropic/langchain_anthropic/chat_models.py b/libs/partners/anthropic/langchain_anthropic/chat_models.py index 7b7e48462c0..d7f2643f0f7 100644 --- a/libs/partners/anthropic/langchain_anthropic/chat_models.py +++ b/libs/partners/anthropic/langchain_anthropic/chat_models.py @@ -295,7 +295,7 @@ class ChatAnthropic(BaseChatModel): Name of Anthropic model to use. E.g. "claude-3-sonnet-20240229". temperature: float Sampling temperature. Ranges from 0.0 to 1.0. - max_tokens: Optional[int] + max_tokens: int Max number of tokens to generate. Key init args — client params: From f70650f67d5c7036117710bddd412858c67205b3 Mon Sep 17 00:00:00 2001 From: Aditya Anand Date: Mon, 7 Oct 2024 23:42:42 +0530 Subject: [PATCH 38/62] core[patch]: correct typo doc-string for astream_events method (#27108) This commit addresses a typographical error in the documentation for the async astream_events method. The word 'evens' was incorrectly used in the introductory sentence for the reference table, which could lead to confusion for users.\n\n### Changes Made:\n- Corrected 'Below is a table that illustrates some evens that might be emitted by various chains.' to 'Below is a table that illustrates some events that might be emitted by various chains.'\n\nThis enhancement improves the clarity of the documentation and ensures accurate terminology is used throughout the reference material.\n\nIssue Reference: #27107 --- libs/core/langchain_core/runnables/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/core/langchain_core/runnables/base.py b/libs/core/langchain_core/runnables/base.py index 730cd38931d..5dd5d35d1d0 100644 --- a/libs/core/langchain_core/runnables/base.py +++ b/libs/core/langchain_core/runnables/base.py @@ -1161,7 +1161,7 @@ class Runnable(Generic[Input, Output], ABC): - ``data``: **Dict[str, Any]** - Below is a table that illustrates some evens that might be emitted by various + Below is a table that illustrates some events that might be emitted by various chains. Metadata fields have been omitted from the table for brevity. Chain definitions have been included after the table. From 14de81b14068afcc72da40ef764e8973c9dbb8a4 Mon Sep 17 00:00:00 2001 From: Jorge Piedrahita Ortiz Date: Mon, 7 Oct 2024 13:31:39 -0500 Subject: [PATCH 39/62] community: sambastudio chat model (#27056) **Description:**: sambastudio chat model integration added, previously only LLM integration included docs and tests --------- Co-authored-by: luisfucros Co-authored-by: Chester Curme --- docs/docs/integrations/chat/sambastudio.ipynb | 383 ++++++++ .../chat_models/__init__.py | 3 + .../chat_models/sambanova.py | 903 ++++++++++++++++-- .../chat_models/test_sambanova.py | 13 +- .../unit_tests/chat_models/test_imports.py | 1 + 5 files changed, 1224 insertions(+), 79 deletions(-) create mode 100644 docs/docs/integrations/chat/sambastudio.ipynb diff --git a/docs/docs/integrations/chat/sambastudio.ipynb b/docs/docs/integrations/chat/sambastudio.ipynb new file mode 100644 index 00000000000..9301d68fe33 --- /dev/null +++ b/docs/docs/integrations/chat/sambastudio.ipynb @@ -0,0 +1,383 @@ +{ + "cells": [ + { + "cell_type": "raw", + "metadata": { + "vscode": { + "languageId": "raw" + } + }, + "source": [ + "---\n", + "sidebar_label: SambaStudio\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ChatSambaStudio\n", + "\n", + "This will help you getting started with SambaNovaCloud [chat models](/docs/concepts/#chat-models). For detailed documentation of all ChatStudio features and configurations head to the [API reference](https://api.python.langchain.com/en/latest/chat_models/langchain_community.chat_models.sambanova.ChatSambaStudio.html).\n", + "\n", + "**[SambaNova](https://sambanova.ai/)'s** [SambaStudio](https://docs.sambanova.ai/sambastudio/latest/sambastudio-intro.html) SambaStudio is a rich, GUI-based platform that provides the functionality to train, deploy, and manage models in SambaNova [DataScale](https://sambanova.ai/products/datascale) systems.\n", + "\n", + "## Overview\n", + "### Integration details\n", + "\n", + "| Class | Package | Local | Serializable | JS support | Package downloads | Package latest |\n", + "| :--- | :--- | :---: | :---: | :---: | :---: | :---: |\n", + "| [ChatSambaStudio](https://api.python.langchain.com/en/latest/chat_models/langchain_community.chat_models.sambanova.ChatSambaStudio.html) | [langchain-community](https://python.langchain.com/api_reference/community/index.html) | ❌ | ❌ | ❌ | ![PyPI - Downloads](https://img.shields.io/pypi/dm/langchain_community?style=flat-square&label=%20) | ![PyPI - Version](https://img.shields.io/pypi/v/langchain_community?style=flat-square&label=%20) |\n", + "\n", + "### Model features\n", + "\n", + "| [Tool calling](/docs/how_to/tool_calling) | [Structured output](/docs/how_to/structured_output/) | JSON mode | [Image input](/docs/how_to/multimodal_inputs/) | Audio input | Video input | [Token-level streaming](/docs/how_to/chat_streaming/) | Native async | [Token usage](/docs/how_to/chat_token_usage_tracking/) | [Logprobs](/docs/how_to/logprobs/) |\n", + "| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |\n", + "| ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | \n", + "\n", + "## Setup\n", + "\n", + "To access ChatSambaStudio models you will need to [deploy an endpoint](https://docs.sambanova.ai/sambastudio/latest/language-models.html) in your SambaStudio platform, install the `langchain_community` integration package, and install the `SSEClient` Package.\n", + "\n", + "```bash\n", + "pip install langchain-community\n", + "pip install sseclient-py\n", + "```\n", + "\n", + "### Credentials\n", + "\n", + "Get the URL and API Key from your SambaStudio deployed endpoint and add them to your environment variables:\n", + "\n", + "``` bash\n", + "export SAMBASTUDIO_URL=\"your-api-key-here\"\n", + "export SAMBASTUDIO_API_KEY=\"your-api-key-here\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "if not os.getenv(\"SAMBASTUDIO_URL\"):\n", + " os.environ[\"SAMBASTUDIO_URL\"] = getpass.getpass(\"Enter your SambaStudio URL: \")\n", + "if not os.getenv(\"SAMBASTUDIO_API_KEY\"):\n", + " os.environ[\"SAMBASTUDIO_API_KEY\"] = getpass.getpass(\n", + " \"Enter your SambaStudio API key: \"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you want to get automated tracing of your model calls you can also set your [LangSmith](https://docs.smith.langchain.com/) API key by uncommenting below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n", + "# os.environ[\"LANGCHAIN_API_KEY\"] = getpass.getpass(\"Enter your LangSmith API key: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Installation\n", + "\n", + "The LangChain __SambaStudio__ integration lives in the `langchain_community` package:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -qU langchain-community\n", + "%pip install -qu sseclient-py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Instantiation\n", + "\n", + "Now we can instantiate our model object and generate chat completions:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_community.chat_models.sambanova import ChatSambaStudio\n", + "\n", + "llm = ChatSambaStudio(\n", + " model=\"Meta-Llama-3-70B-Instruct-4096\", # set if using a CoE endpoint\n", + " max_tokens=1024,\n", + " temperature=0.7,\n", + " top_k=1,\n", + " top_p=0.01,\n", + " do_sample=True,\n", + " process_prompt=\"True\", # set if using a CoE endpoint\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Invocation" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage(content=\"J'adore la programmation.\", response_metadata={'id': 'item0', 'partial': False, 'value': {'completion': \"J'adore la programmation.\", 'logprobs': {'text_offset': [], 'top_logprobs': []}, 'prompt': '<|start_header_id|>system<|end_header_id|>\\n\\nYou are a helpful assistant that translates English to French. Translate the user sentence.<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nI love programming.<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n', 'stop_reason': 'end_of_text', 'tokens': ['J', \"'\", 'ad', 'ore', ' la', ' programm', 'ation', '.'], 'total_tokens_count': 43}, 'params': {}, 'status': None}, id='item0')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "messages = [\n", + " (\n", + " \"system\",\n", + " \"You are a helpful assistant that translates English to French. Translate the user sentence.\",\n", + " ),\n", + " (\"human\", \"I love programming.\"),\n", + "]\n", + "ai_msg = llm.invoke(messages)\n", + "ai_msg" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J'adore la programmation.\n" + ] + } + ], + "source": [ + "print(ai_msg.content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chaining\n", + "\n", + "We can [chain](/docs/how_to/sequence/) our model with a prompt template like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage(content='Ich liebe das Programmieren.', response_metadata={'id': 'item0', 'partial': False, 'value': {'completion': 'Ich liebe das Programmieren.', 'logprobs': {'text_offset': [], 'top_logprobs': []}, 'prompt': '<|start_header_id|>system<|end_header_id|>\\n\\nYou are a helpful assistant that translates English to German.<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nI love programming.<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n', 'stop_reason': 'end_of_text', 'tokens': ['Ich', ' liebe', ' das', ' Programm', 'ieren', '.'], 'total_tokens_count': 36}, 'params': {}, 'status': None}, id='item0')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from langchain_core.prompts import ChatPromptTemplate\n", + "\n", + "prompt = ChatPromptTemplate(\n", + " [\n", + " (\n", + " \"system\",\n", + " \"You are a helpful assistant that translates {input_language} to {output_language}.\",\n", + " ),\n", + " (\"human\", \"{input}\"),\n", + " ]\n", + ")\n", + "\n", + "chain = prompt | llm\n", + "chain.invoke(\n", + " {\n", + " \"input_language\": \"English\",\n", + " \"output_language\": \"German\",\n", + " \"input\": \"I love programming.\",\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Streaming" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Arrr, ye landlubber! Ye be wantin' to learn about owls, eh? Well, matey, settle yerself down with a pint o' grog and listen close, for I be tellin' ye about these fascinatin' creatures o' the night!\n", + "\n", + "Owls be birds, but not just any birds, me hearty! They be nocturnal, meanin' they do their huntin' at night, when the rest o' the world be sleepin'. And they be experts at it, too! Their big, round eyes be designed for seein' in the dark, with a special reflective layer called the tapetum lucidum that helps 'em spot prey in the shadows. It's like havin' a built-in lantern, savvy?\n", + "\n", + "But that be not all, me matey! Owls also have acute hearin', which helps 'em pinpoint the slightest sounds in the dark. And their ears be asymmetrical, meanin' one ear be higher than the other, which gives 'em better depth perception. It's like havin' a built-in sonar system, arrr!\n", + "\n", + "Now, ye might be wonderin' how owls fly so silently, like ghosts in the night. Well, it be because o' their special feathers, me hearty! They have soft, fringed feathers on their wings that help reduce noise and turbulence, makin' 'em the sneakiest flyers on the seven seas... er, skies!\n", + "\n", + "Owls come in all shapes and sizes, from the tiny elf owl to the great grey owl, which be one o' the largest owl species in the world. And they be found on every continent, except Antarctica, o' course. They be solitary creatures, but some species be known to form long-term monogamous relationships, like the barn owl and its mate.\n", + "\n", + "So, there ye have it, me hearty! Owls be amazin' creatures, with their clever adaptations and stealthy ways. Now, go forth and spread the word about these magnificent birds o' the night! And remember, if ye ever encounter an owl in the wild, be sure to show respect and keep a weather eye open, or ye might just find yerself on the receivin' end o' a silent, flyin' tackle! Arrr!" + ] + } + ], + "source": [ + "system = \"You are a helpful assistant with pirate accent.\"\n", + "human = \"I want to learn more about this animal: {animal}\"\n", + "prompt = ChatPromptTemplate.from_messages([(\"system\", system), (\"human\", human)])\n", + "\n", + "chain = prompt | llm\n", + "\n", + "for chunk in chain.stream({\"animal\": \"owl\"}):\n", + " print(chunk.content, end=\"\", flush=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Async" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "AIMessage(content='The capital of France is Paris.', response_metadata={'id': 'item0', 'partial': False, 'value': {'completion': 'The capital of France is Paris.', 'logprobs': {'text_offset': [], 'top_logprobs': []}, 'prompt': '<|start_header_id|>user<|end_header_id|>\\n\\nwhat is the capital of France?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\n', 'stop_reason': 'end_of_text', 'tokens': ['The', ' capital', ' of', ' France', ' is', ' Paris', '.'], 'total_tokens_count': 24}, 'params': {}, 'status': None}, id='item0')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"human\",\n", + " \"what is the capital of {country}?\",\n", + " )\n", + " ]\n", + ")\n", + "\n", + "chain = prompt | llm\n", + "await chain.ainvoke({\"country\": \"France\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Async Streaming" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum computers use quantum bits (qubits) to process multiple possibilities simultaneously, exponentially faster than classical computers, enabling breakthroughs in fields like cryptography, optimization, and simulation." + ] + } + ], + "source": [ + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"human\",\n", + " \"in less than {num_words} words explain me {topic} \",\n", + " )\n", + " ]\n", + ")\n", + "chain = prompt | llm\n", + "\n", + "async for chunk in chain.astream({\"num_words\": 30, \"topic\": \"quantum computers\"}):\n", + " print(chunk.content, end=\"\", flush=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## API reference\n", + "\n", + "For detailed documentation of all ChatSambaStudio features and configurations head to the API reference: https://api.python.langchain.com/en/latest/chat_models/langchain_community.chat_models.sambanova.ChatSambaStudio.html" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "langchain", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/libs/community/langchain_community/chat_models/__init__.py b/libs/community/langchain_community/chat_models/__init__.py index 021f6f5c9d1..db507637528 100644 --- a/libs/community/langchain_community/chat_models/__init__.py +++ b/libs/community/langchain_community/chat_models/__init__.py @@ -149,6 +149,7 @@ if TYPE_CHECKING: ) from langchain_community.chat_models.sambanova import ( ChatSambaNovaCloud, + ChatSambaStudio, ) from langchain_community.chat_models.snowflake import ( ChatSnowflakeCortex, @@ -215,6 +216,7 @@ __all__ = [ "ChatPerplexity", "ChatPremAI", "ChatSambaNovaCloud", + "ChatSambaStudio", "ChatSparkLLM", "ChatSnowflakeCortex", "ChatTongyi", @@ -274,6 +276,7 @@ _module_lookup = { "ChatOpenAI": "langchain_community.chat_models.openai", "ChatPerplexity": "langchain_community.chat_models.perplexity", "ChatSambaNovaCloud": "langchain_community.chat_models.sambanova", + "ChatSambaStudio": "langchain_community.chat_models.sambanova", "ChatSnowflakeCortex": "langchain_community.chat_models.snowflake", "ChatSparkLLM": "langchain_community.chat_models.sparkllm", "ChatTongyi": "langchain_community.chat_models.tongyi", diff --git a/libs/community/langchain_community/chat_models/sambanova.py b/libs/community/langchain_community/chat_models/sambanova.py index deaee597879..cd95f4beefa 100644 --- a/libs/community/langchain_community/chat_models/sambanova.py +++ b/libs/community/langchain_community/chat_models/sambanova.py @@ -1,5 +1,5 @@ import json -from typing import Any, Dict, Iterator, List, Optional +from typing import Any, Dict, Iterator, List, Optional, Tuple import requests from langchain_core.callbacks import ( @@ -13,6 +13,7 @@ from langchain_core.messages import ( AIMessage, AIMessageChunk, BaseMessage, + BaseMessageChunk, ChatMessage, HumanMessage, SystemMessage, @@ -21,6 +22,46 @@ from langchain_core.messages import ( from langchain_core.outputs import ChatGeneration, ChatGenerationChunk, ChatResult from langchain_core.utils import convert_to_secret_str, get_from_dict_or_env from pydantic import Field, SecretStr +from requests import Response + + +def _convert_message_to_dict(message: BaseMessage) -> Dict[str, Any]: + """ + convert a BaseMessage to a dictionary with Role / content + + Args: + message: BaseMessage + + Returns: + messages_dict: role / content dict + """ + if isinstance(message, ChatMessage): + message_dict = {"role": message.role, "content": message.content} + elif isinstance(message, SystemMessage): + message_dict = {"role": "system", "content": message.content} + elif isinstance(message, HumanMessage): + message_dict = {"role": "user", "content": message.content} + elif isinstance(message, AIMessage): + message_dict = {"role": "assistant", "content": message.content} + elif isinstance(message, ToolMessage): + message_dict = {"role": "tool", "content": message.content} + else: + raise TypeError(f"Got unknown type {message}") + return message_dict + + +def _create_message_dicts(messages: List[BaseMessage]) -> List[Dict[str, Any]]: + """ + Convert a list of BaseMessages to a list of dictionaries with Role / content + + Args: + messages: list of BaseMessages + + Returns: + messages_dicts: list of role / content dicts + """ + message_dicts = [_convert_message_to_dict(m) for m in messages] + return message_dicts class ChatSambaNovaCloud(BaseChatModel): @@ -28,7 +69,7 @@ class ChatSambaNovaCloud(BaseChatModel): SambaNova Cloud chat model. Setup: - To use, you should have the environment variables + To use, you should have the environment variables: ``SAMBANOVA_URL`` set with your SambaNova Cloud URL. ``SAMBANOVA_API_KEY`` set with your SambaNova Cloud API Key. http://cloud.sambanova.ai/ @@ -38,7 +79,6 @@ class ChatSambaNovaCloud(BaseChatModel): sambanova_url = SambaNova cloud endpoint URL, sambanova_api_key = set with your SambaNova cloud API key, model = model name, - streaming = set True for use streaming API max_tokens = max number of tokens to generate, temperature = model temperature, top_p = model top p, @@ -48,9 +88,9 @@ class ChatSambaNovaCloud(BaseChatModel): Key init args — completion params: model: str - The name of the model to use, e.g., llama3-8b. + The name of the model to use, e.g., Meta-Llama-3-70B-Instruct. streaming: bool - Whether to use streaming or not + Whether to use streaming handler when using non streaming methods max_tokens: int max tokens to generate temperature: float @@ -77,7 +117,6 @@ class ChatSambaNovaCloud(BaseChatModel): sambanova_url = SambaNova cloud endpoint URL, sambanova_api_key = set with your SambaNova cloud API key, model = model name, - streaming = set True for streaming max_tokens = max number of tokens to generate, temperature = model temperature, top_p = model top p, @@ -123,11 +162,11 @@ class ChatSambaNovaCloud(BaseChatModel): sambanova_api_key: SecretStr = Field(default="") """SambaNova Cloud api key""" - model: str = Field(default="llama3-8b") + model: str = Field(default="Meta-Llama-3.1-8B-Instruct") """The name of the model""" streaming: bool = Field(default=False) - """Whether to use streaming or not""" + """Whether to use streaming handler when using non streaming methods""" max_tokens: int = Field(default=1024) """max tokens to generate""" @@ -135,10 +174,10 @@ class ChatSambaNovaCloud(BaseChatModel): temperature: float = Field(default=0.7) """model temperature""" - top_p: float = Field(default=0.0) + top_p: Optional[float] = Field() """model top p""" - top_k: int = Field(default=1) + top_k: Optional[int] = Field() """model top k""" stream_options: dict = Field(default={"include_usage": True}) @@ -225,15 +264,15 @@ class ChatSambaNovaCloud(BaseChatModel): if response.status_code != 200: raise RuntimeError( f"Sambanova /complete call failed with status code " - f"{response.status_code}." - f"{response.text}." + f"{response.status_code}.", + f"{response.text}.", ) response_dict = response.json() if response_dict.get("error"): raise RuntimeError( f"Sambanova /complete call failed with status code " - f"{response.status_code}." - f"{response_dict}." + f"{response.status_code}.", + f"{response_dict}.", ) return response_dict @@ -247,7 +286,7 @@ class ChatSambaNovaCloud(BaseChatModel): messages_dicts: List of role / content dicts to use as input. stop: list of stop tokens - Returns: + Yields: An iterator of response dicts. """ try: @@ -289,82 +328,38 @@ class ChatSambaNovaCloud(BaseChatModel): ) for event in client.events(): - chunk = { - "event": event.event, - "data": event.data, - "status_code": response.status_code, - } - - if chunk["event"] == "error_event" or chunk["status_code"] != 200: + if event.event == "error_event": raise RuntimeError( f"Sambanova /complete call failed with status code " - f"{chunk['status_code']}." - f"{chunk}." + f"{response.status_code}." + f"{event.data}." ) try: # check if the response is a final event # in that case event data response is '[DONE]' - if chunk["data"] != "[DONE]": - if isinstance(chunk["data"], str): - data = json.loads(chunk["data"]) + if event.data != "[DONE]": + if isinstance(event.data, str): + data = json.loads(event.data) else: raise RuntimeError( f"Sambanova /complete call failed with status code " - f"{chunk['status_code']}." - f"{chunk}." + f"{response.status_code}." + f"{event.data}." ) if data.get("error"): raise RuntimeError( f"Sambanova /complete call failed with status code " - f"{chunk['status_code']}." - f"{chunk}." + f"{response.status_code}." + f"{event.data}." ) yield data - except Exception: - raise Exception( - f"Error getting content chunk raw streamed response: {chunk}" + except Exception as e: + raise RuntimeError( + f"Error getting content chunk raw streamed response: {e}" + f"data: {event.data}" ) - def _convert_message_to_dict(self, message: BaseMessage) -> Dict[str, Any]: - """ - convert a BaseMessage to a dictionary with Role / content - - Args: - message: BaseMessage - - Returns: - messages_dict: role / content dict - """ - if isinstance(message, ChatMessage): - message_dict = {"role": message.role, "content": message.content} - elif isinstance(message, SystemMessage): - message_dict = {"role": "system", "content": message.content} - elif isinstance(message, HumanMessage): - message_dict = {"role": "user", "content": message.content} - elif isinstance(message, AIMessage): - message_dict = {"role": "assistant", "content": message.content} - elif isinstance(message, ToolMessage): - message_dict = {"role": "tool", "content": message.content} - else: - raise TypeError(f"Got unknown type {message}") - return message_dict - - def _create_message_dicts( - self, messages: List[BaseMessage] - ) -> List[Dict[str, Any]]: - """ - convert a lit of BaseMessages to a list of dictionaries with Role / content - - Args: - messages: list of BaseMessages - - Returns: - messages_dicts: list of role / content dicts - """ - message_dicts = [self._convert_message_to_dict(m) for m in messages] - return message_dicts - def _generate( self, messages: List[BaseMessage], @@ -373,9 +368,7 @@ class ChatSambaNovaCloud(BaseChatModel): **kwargs: Any, ) -> ChatResult: """ - SambaNovaCloud chat model logic. - - Call SambaNovaCloud API. + Call SambaNovaCloud models. Args: messages: the prompt composed of a list of messages. @@ -386,6 +379,9 @@ class ChatSambaNovaCloud(BaseChatModel): it makes it much easier to parse the output of the model downstream and understand why generation stopped. run_manager: A run manager with callbacks for the LLM. + + Returns: + result: ChatResult with model generation """ if self.streaming: stream_iter = self._stream( @@ -393,7 +389,7 @@ class ChatSambaNovaCloud(BaseChatModel): ) if stream_iter: return generate_from_stream(stream_iter) - messages_dicts = self._create_message_dicts(messages) + messages_dicts = _create_message_dicts(messages) response = self._handle_request(messages_dicts, stop) message = AIMessage( content=response["choices"][0]["message"]["content"], @@ -430,8 +426,11 @@ class ChatSambaNovaCloud(BaseChatModel): it makes it much easier to parse the output of the model downstream and understand why generation stopped. run_manager: A run manager with callbacks for the LLM. + + Yields: + chunk: ChatGenerationChunk with model partial generation """ - messages_dicts = self._create_message_dicts(messages) + messages_dicts = _create_message_dicts(messages) finish_reason = None for partial_response in self._handle_streaming_request(messages_dicts, stop): if len(partial_response["choices"]) > 0: @@ -463,3 +462,751 @@ class ChatSambaNovaCloud(BaseChatModel): if run_manager: run_manager.on_llm_new_token(chunk.text, chunk=chunk) yield chunk + + +class ChatSambaStudio(BaseChatModel): + """ + SambaStudio chat model. + + Setup: + To use, you should have the environment variables: + ``SAMBASTUDIO_URL`` set with your SambaStudio deployed endpoint URL. + ``SAMBASTUDIO_API_KEY`` set with your SambaStudio deployed endpoint Key. + https://docs.sambanova.ai/sambastudio/latest/index.html + Example: + .. code-block:: python + ChatSambaStudio( + sambastudio_url = set with your SambaStudio deployed endpoint URL, + sambastudio_api_key = set with your SambaStudio deployed endpoint Key. + model = model or expert name (set for CoE endpoints), + max_tokens = max number of tokens to generate, + temperature = model temperature, + top_p = model top p, + top_k = model top k, + do_sample = wether to do sample + process_prompt = wether to process prompt + (set for CoE generic v1 and v2 endpoints) + stream_options = include usage to get generation metrics + special_tokens = start, start_role, end_role, end special tokens + (set for CoE generic v1 and v2 endpoints when process prompt + set to false or for StandAlone v1 and v2 endpoints) + model_kwargs: Optional = Extra Key word arguments to pass to the model. + ) + + Key init args — completion params: + model: str + The name of the model to use, e.g., Meta-Llama-3-70B-Instruct-4096 + (set for CoE endpoints). + streaming: bool + Whether to use streaming + max_tokens: inthandler when using non streaming methods + max tokens to generate + temperature: float + model temperature + top_p: float + model top p + top_k: int + model top k + do_sample: bool + wether to do sample + process_prompt: + wether to process prompt (set for CoE generic v1 and v2 endpoints) + stream_options: dict + stream options, include usage to get generation metrics + special_tokens: dict + start, start_role, end_role and end special tokens + (set for CoE generic v1 and v2 endpoints when process prompt set to false + or for StandAlone v1 and v2 endpoints) default to llama3 special tokens + model_kwargs: dict + Extra Key word arguments to pass to the model. + + Key init args — client params: + sambastudio_url: str + SambaStudio endpoint Url + sambastudio_api_key: str + SambaStudio endpoint api key + + Instantiate: + .. code-block:: python + + from langchain_community.chat_models import ChatSambaStudio + + chat = ChatSambaStudio=( + sambastudio_url = set with your SambaStudio deployed endpoint URL, + sambastudio_api_key = set with your SambaStudio deployed endpoint Key. + model = model or expert name (set for CoE endpoints), + max_tokens = max number of tokens to generate, + temperature = model temperature, + top_p = model top p, + top_k = model top k, + do_sample = wether to do sample + process_prompt = wether to process prompt + (set for CoE generic v1 and v2 endpoints) + stream_options = include usage to get generation metrics + special_tokens = start, start_role, end_role, and special tokens + (set for CoE generic v1 and v2 endpoints when process prompt + set to false or for StandAlone v1 and v2 endpoints) + model_kwargs: Optional = Extra Key word arguments to pass to the model. + ) + Invoke: + .. code-block:: python + messages = [ + SystemMessage(content="your are an AI assistant."), + HumanMessage(content="tell me a joke."), + ] + response = chat.invoke(messages) + + Stream: + .. code-block:: python + + for chunk in chat.stream(messages): + print(chunk.content, end="", flush=True) + + Async: + .. code-block:: python + + response = chat.ainvoke(messages) + await response + + Token usage: + .. code-block:: python + response = chat.invoke(messages) + print(response.response_metadata["usage"]["prompt_tokens"] + print(response.response_metadata["usage"]["total_tokens"] + + Response metadata + .. code-block:: python + + response = chat.invoke(messages) + print(response.response_metadata) + """ + + sambastudio_url: str = Field(default="") + """SambaStudio Url""" + + sambastudio_api_key: SecretStr = Field(default="") + """SambaStudio api key""" + + base_url: str = Field(default="", exclude=True) + """SambaStudio non streaming Url""" + + streaming_url: str = Field(default="", exclude=True) + """SambaStudio streaming Url""" + + model: Optional[str] = Field() + """The name of the model or expert to use (for CoE endpoints)""" + + streaming: bool = Field(default=False) + """Whether to use streaming handler when using non streaming methods""" + + max_tokens: int = Field(default=1024) + """max tokens to generate""" + + temperature: Optional[float] = Field(default=0.7) + """model temperature""" + + top_p: Optional[float] = Field() + """model top p""" + + top_k: Optional[int] = Field() + """model top k""" + + do_sample: Optional[bool] = Field() + """whether to do sampling""" + + process_prompt: Optional[bool] = Field() + """whether process prompt (for CoE generic v1 and v2 endpoints)""" + + stream_options: dict = Field(default={"include_usage": True}) + """stream options, include usage to get generation metrics""" + + special_tokens: dict = Field( + default={ + "start": "<|begin_of_text|>", + "start_role": "<|begin_of_text|><|start_header_id|>{role}<|end_header_id|>", + "end_role": "<|eot_id|>", + "end": "<|start_header_id|>assistant<|end_header_id|>\n", + } + ) + """start, start_role, end_role and end special tokens + (set for CoE generic v1 and v2 endpoints when process prompt set to false + or for StandAlone v1 and v2 endpoints) + default to llama3 special tokens""" + + model_kwargs: Optional[Dict[str, Any]] = None + """Key word arguments to pass to the model.""" + + class Config: + populate_by_name = True + + @classmethod + def is_lc_serializable(cls) -> bool: + """Return whether this model can be serialized by Langchain.""" + return False + + @property + def lc_secrets(self) -> Dict[str, str]: + return { + "sambastudio_url": "sambastudio_url", + "sambastudio_api_key": "sambastudio_api_key", + } + + @property + def _identifying_params(self) -> Dict[str, Any]: + """Return a dictionary of identifying parameters. + + This information is used by the LangChain callback system, which + is used for tracing purposes make it possible to monitor LLMs. + """ + return { + "model": self.model, + "streaming": self.streaming, + "max_tokens": self.max_tokens, + "temperature": self.temperature, + "top_p": self.top_p, + "top_k": self.top_k, + "do_sample": self.do_sample, + "process_prompt": self.process_prompt, + "stream_options": self.stream_options, + "special_tokens": self.special_tokens, + "model_kwargs": self.model_kwargs, + } + + @property + def _llm_type(self) -> str: + """Get the type of language model used by this chat model.""" + return "sambastudio-chatmodel" + + def __init__(self, **kwargs: Any) -> None: + """init and validate environment variables""" + kwargs["sambastudio_url"] = get_from_dict_or_env( + kwargs, "sambastudio_url", "SAMBASTUDIO_URL" + ) + + kwargs["sambastudio_api_key"] = convert_to_secret_str( + get_from_dict_or_env(kwargs, "sambastudio_api_key", "SAMBASTUDIO_API_KEY") + ) + kwargs["base_url"], kwargs["streaming_url"] = self._get_sambastudio_urls( + kwargs["sambastudio_url"] + ) + super().__init__(**kwargs) + + def _get_role(self, message: BaseMessage) -> str: + """ + Get the role of LangChain BaseMessage + + Args: + message: LangChain BaseMessage + + Returns: + str: Role of the LangChain BaseMessage + """ + if isinstance(message, ChatMessage): + role = message.role + elif isinstance(message, SystemMessage): + role = "system" + elif isinstance(message, HumanMessage): + role = "user" + elif isinstance(message, AIMessage): + role = "assistant" + elif isinstance(message, ToolMessage): + role = "tool" + else: + raise TypeError(f"Got unknown type {message}") + return role + + def _messages_to_string(self, messages: List[BaseMessage]) -> str: + """ + Convert a list of BaseMessages to a: + - dumped json string with Role / content dict structure + when process_prompt is true, + - string with special tokens if process_prompt is false + for generic V1 and V2 endpoints + + Args: + messages: list of BaseMessages + + Returns: + str: string to send as model input depending on process_prompt param + """ + if self.process_prompt: + messages_dict: Dict[str, Any] = { + "conversation_id": "sambaverse-conversation-id", + "messages": [], + } + for message in messages: + messages_dict["messages"].append( + { + "message_id": message.id, + "role": self._get_role(message), + "content": message.content, + } + ) + messages_string = json.dumps(messages_dict) + else: + messages_string = self.special_tokens["start"] + for message in messages: + messages_string += self.special_tokens["start_role"].format( + role=self._get_role(message) + ) + messages_string += f" {message.content} " + messages_string += self.special_tokens["end_role"] + messages_string += self.special_tokens["end"] + + return messages_string + + def _get_sambastudio_urls(self, url: str) -> Tuple[str, str]: + """ + Get streaming and non streaming URLs from the given URL + + Args: + url: string with sambastudio base or streaming endpoint url + + Returns: + base_url: string with url to do non streaming calls + streaming_url: string with url to do streaming calls + """ + if "openai" in url: + base_url = url + stream_url = url + else: + if "stream" in url: + base_url = url.replace("stream/", "") + stream_url = url + else: + base_url = url + if "generic" in url: + stream_url = "generic/stream".join(url.split("generic")) + else: + raise ValueError("Unsupported URL") + return base_url, stream_url + + def _handle_request( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + streaming: Optional[bool] = False, + ) -> Response: + """ + Performs a post request to the LLM API. + + Args: + messages_dicts: List of role / content dicts to use as input. + stop: list of stop tokens + streaming: wether to do a streaming call + + Returns: + A request Response object + """ + + # create request payload for openai compatible API + if "openai" in self.sambastudio_url: + messages_dicts = _create_message_dicts(messages) + data = { + "messages": messages_dicts, + "max_tokens": self.max_tokens, + "stop": stop, + "model": self.model, + "temperature": self.temperature, + "top_p": self.top_p, + "top_k": self.top_k, + "stream": streaming, + "stream_options": self.stream_options, + } + data = {key: value for key, value in data.items() if value is not None} + headers = { + "Authorization": f"Bearer " + f"{self.sambastudio_api_key.get_secret_value()}", + "Content-Type": "application/json", + } + + # create request payload for generic v1 API + elif "api/v2/predict/generic" in self.sambastudio_url: + items = [{"id": "item0", "value": self._messages_to_string(messages)}] + params: Dict[str, Any] = { + "select_expert": self.model, + "process_prompt": self.process_prompt, + "max_tokens_to_generate": self.max_tokens, + "temperature": self.temperature, + "top_p": self.top_p, + "top_k": self.top_k, + "do_sample": self.do_sample, + } + if self.model_kwargs is not None: + params = {**params, **self.model_kwargs} + params = {key: value for key, value in params.items() if value is not None} + data = {"items": items, "params": params} + headers = {"key": self.sambastudio_api_key.get_secret_value()} + + # create request payload for generic v1 API + elif "api/predict/generic" in self.sambastudio_url: + params = { + "select_expert": self.model, + "process_prompt": self.process_prompt, + "max_tokens_to_generate": self.max_tokens, + "temperature": self.temperature, + "top_p": self.top_p, + "top_k": self.top_k, + "do_sample": self.do_sample, + } + if self.model_kwargs is not None: + params = {**params, **self.model_kwargs} + params = { + key: {"type": type(value).__name__, "value": str(value)} + for key, value in params.items() + if value is not None + } + if streaming: + data = { + "instance": self._messages_to_string(messages), + "params": params, + } + else: + data = { + "instances": [self._messages_to_string(messages)], + "params": params, + } + headers = {"key": self.sambastudio_api_key.get_secret_value()} + + else: + raise ValueError( + f"Unsupported URL{self.sambastudio_url}" + "only openai, generic v1 and generic v2 APIs are supported" + ) + + http_session = requests.Session() + if streaming: + response = http_session.post( + self.streaming_url, headers=headers, json=data, stream=True + ) + else: + response = http_session.post( + self.base_url, headers=headers, json=data, stream=False + ) + if response.status_code != 200: + raise RuntimeError( + f"Sambanova /complete call failed with status code " + f"{response.status_code}." + f"{response.text}." + ) + return response + + def _process_response(self, response: Response) -> AIMessage: + """ + Process a non streaming response from the api + + Args: + response: A request Response object + + Returns + generation: an AIMessage with model generation + """ + + # Extract json payload form response + try: + response_dict = response.json() + except Exception as e: + raise RuntimeError( + f"Sambanova /complete call failed couldn't get JSON response {e}" + f"response: {response.text}" + ) + + # process response payload for openai compatible API + if "openai" in self.sambastudio_url: + content = response_dict["choices"][0]["message"]["content"] + id = response_dict["id"] + response_metadata = { + "finish_reason": response_dict["choices"][0]["finish_reason"], + "usage": response_dict.get("usage"), + "model_name": response_dict["model"], + "system_fingerprint": response_dict["system_fingerprint"], + "created": response_dict["created"], + } + + # process response payload for generic v2 API + elif "api/v2/predict/generic" in self.sambastudio_url: + content = response_dict["items"][0]["value"]["completion"] + id = response_dict["items"][0]["id"] + response_metadata = response_dict["items"][0] + + # process response payload for generic v1 API + elif "api/predict/generic" in self.sambastudio_url: + content = response_dict["predictions"][0]["completion"] + id = None + response_metadata = response_dict + + else: + raise ValueError( + f"Unsupported URL{self.sambastudio_url}" + "only openai, generic v1 and generic v2 APIs are supported" + ) + + return AIMessage( + content=content, + additional_kwargs={}, + response_metadata=response_metadata, + id=id, + ) + + def _process_stream_response( + self, response: Response + ) -> Iterator[BaseMessageChunk]: + """ + Process a streaming response from the api + + Args: + response: An iterable request Response object + + Yields: + generation: an AIMessageChunk with model partial generation + """ + + try: + import sseclient + except ImportError: + raise ImportError( + "could not import sseclient library" + "Please install it with `pip install sseclient-py`." + ) + + # process response payload for openai compatible API + if "openai" in self.sambastudio_url: + finish_reason = "" + client = sseclient.SSEClient(response) + for event in client.events(): + if event.event == "error_event": + raise RuntimeError( + f"Sambanova /complete call failed with status code " + f"{response.status_code}." + f"{event.data}." + ) + try: + # check if the response is not a final event ("[DONE]") + if event.data != "[DONE]": + if isinstance(event.data, str): + data = json.loads(event.data) + else: + raise RuntimeError( + f"Sambanova /complete call failed with status code " + f"{response.status_code}." + f"{event.data}." + ) + if data.get("error"): + raise RuntimeError( + f"Sambanova /complete call failed with status code " + f"{response.status_code}." + f"{event.data}." + ) + if len(data["choices"]) > 0: + finish_reason = data["choices"][0].get("finish_reason") + content = data["choices"][0]["delta"]["content"] + id = data["id"] + metadata = {} + else: + content = "" + id = data["id"] + metadata = { + "finish_reason": finish_reason, + "usage": data.get("usage"), + "model_name": data["model"], + "system_fingerprint": data["system_fingerprint"], + "created": data["created"], + } + yield AIMessageChunk( + content=content, + id=id, + response_metadata=metadata, + additional_kwargs={}, + ) + + except Exception as e: + raise RuntimeError( + f"Error getting content chunk raw streamed response: {e}" + f"data: {event.data}" + ) + + # process response payload for generic v2 API + elif "api/v2/predict/generic" in self.sambastudio_url: + for line in response.iter_lines(): + try: + data = json.loads(line) + content = data["result"]["items"][0]["value"]["stream_token"] + id = data["result"]["items"][0]["id"] + if data["result"]["items"][0]["value"]["is_last_response"]: + metadata = { + "finish_reason": data["result"]["items"][0]["value"].get( + "stop_reason" + ), + "prompt": data["result"]["items"][0]["value"].get("prompt"), + "usage": { + "prompt_tokens_count": data["result"]["items"][0][ + "value" + ].get("prompt_tokens_count"), + "completion_tokens_count": data["result"]["items"][0][ + "value" + ].get("completion_tokens_count"), + "total_tokens_count": data["result"]["items"][0][ + "value" + ].get("total_tokens_count"), + "start_time": data["result"]["items"][0]["value"].get( + "start_time" + ), + "end_time": data["result"]["items"][0]["value"].get( + "end_time" + ), + "model_execution_time": data["result"]["items"][0][ + "value" + ].get("model_execution_time"), + "time_to_first_token": data["result"]["items"][0][ + "value" + ].get("time_to_first_token"), + "throughput_after_first_token": data["result"]["items"][ + 0 + ]["value"].get("throughput_after_first_token"), + "batch_size_used": data["result"]["items"][0][ + "value" + ].get("batch_size_used"), + }, + } + else: + metadata = {} + yield AIMessageChunk( + content=content, + id=id, + response_metadata=metadata, + additional_kwargs={}, + ) + + except Exception as e: + raise RuntimeError( + f"Error getting content chunk raw streamed response: {e}" + f"line: {line}" + ) + + # process response payload for generic v1 API + elif "api/predict/generic" in self.sambastudio_url: + for line in response.iter_lines(): + try: + data = json.loads(line) + content = data["result"]["responses"][0]["stream_token"] + id = None + if data["result"]["responses"][0]["is_last_response"]: + metadata = { + "finish_reason": data["result"]["responses"][0].get( + "stop_reason" + ), + "prompt": data["result"]["responses"][0].get("prompt"), + "usage": { + "prompt_tokens_count": data["result"]["responses"][ + 0 + ].get("prompt_tokens_count"), + "completion_tokens_count": data["result"]["responses"][ + 0 + ].get("completion_tokens_count"), + "total_tokens_count": data["result"]["responses"][ + 0 + ].get("total_tokens_count"), + "start_time": data["result"]["responses"][0].get( + "start_time" + ), + "end_time": data["result"]["responses"][0].get( + "end_time" + ), + "model_execution_time": data["result"]["responses"][ + 0 + ].get("model_execution_time"), + "time_to_first_token": data["result"]["responses"][ + 0 + ].get("time_to_first_token"), + "throughput_after_first_token": data["result"][ + "responses" + ][0].get("throughput_after_first_token"), + "batch_size_used": data["result"]["responses"][0].get( + "batch_size_used" + ), + }, + } + else: + metadata = {} + yield AIMessageChunk( + content=content, + id=id, + response_metadata=metadata, + additional_kwargs={}, + ) + + except Exception as e: + raise RuntimeError( + f"Error getting content chunk raw streamed response: {e}" + f"line: {line}" + ) + + else: + raise ValueError( + f"Unsupported URL{self.sambastudio_url}" + "only openai, generic v1 and generic v2 APIs are supported" + ) + + def _generate( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + **kwargs: Any, + ) -> ChatResult: + """ + Call SambaStudio models. + + Args: + messages: the prompt composed of a list of messages. + stop: a list of strings on which the model should stop generating. + If generation stops due to a stop token, the stop token itself + SHOULD BE INCLUDED as part of the output. This is not enforced + across models right now, but it's a good practice to follow since + it makes it much easier to parse the output of the model + downstream and understand why generation stopped. + run_manager: A run manager with callbacks for the LLM. + + Returns: + result: ChatResult with model generation + """ + if self.streaming: + stream_iter = self._stream( + messages, stop=stop, run_manager=run_manager, **kwargs + ) + if stream_iter: + return generate_from_stream(stream_iter) + response = self._handle_request(messages, stop, streaming=False) + message = self._process_response(response) + generation = ChatGeneration(message=message) + return ChatResult(generations=[generation]) + + def _stream( + self, + messages: List[BaseMessage], + stop: Optional[List[str]] = None, + run_manager: Optional[CallbackManagerForLLMRun] = None, + **kwargs: Any, + ) -> Iterator[ChatGenerationChunk]: + """ + Stream the output of the SambaStudio model. + + Args: + messages: the prompt composed of a list of messages. + stop: a list of strings on which the model should stop generating. + If generation stops due to a stop token, the stop token itself + SHOULD BE INCLUDED as part of the output. This is not enforced + across models right now, but it's a good practice to follow since + it makes it much easier to parse the output of the model + downstream and understand why generation stopped. + run_manager: A run manager with callbacks for the LLM. + + Yields: + chunk: ChatGenerationChunk with model partial generation + """ + response = self._handle_request(messages, stop, streaming=True) + for ai_message_chunk in self._process_stream_response(response): + chunk = ChatGenerationChunk(message=ai_message_chunk) + if run_manager: + run_manager.on_llm_new_token(chunk.text, chunk=chunk) + yield chunk diff --git a/libs/community/tests/integration_tests/chat_models/test_sambanova.py b/libs/community/tests/integration_tests/chat_models/test_sambanova.py index 965a8156f2f..2683b5dc399 100644 --- a/libs/community/tests/integration_tests/chat_models/test_sambanova.py +++ b/libs/community/tests/integration_tests/chat_models/test_sambanova.py @@ -1,6 +1,9 @@ from langchain_core.messages import AIMessage, HumanMessage -from langchain_community.chat_models.sambanova import ChatSambaNovaCloud +from langchain_community.chat_models.sambanova import ( + ChatSambaNovaCloud, + ChatSambaStudio, +) def test_chat_sambanova_cloud() -> None: @@ -9,3 +12,11 @@ def test_chat_sambanova_cloud() -> None: response = chat.invoke([message]) assert isinstance(response, AIMessage) assert isinstance(response.content, str) + + +def test_chat_sambastudio() -> None: + chat = ChatSambaStudio() + message = HumanMessage(content="Hello") + response = chat.invoke([message]) + assert isinstance(response, AIMessage) + assert isinstance(response.content, str) diff --git a/libs/community/tests/unit_tests/chat_models/test_imports.py b/libs/community/tests/unit_tests/chat_models/test_imports.py index d8399ed8315..6be5a41d9ec 100644 --- a/libs/community/tests/unit_tests/chat_models/test_imports.py +++ b/libs/community/tests/unit_tests/chat_models/test_imports.py @@ -35,6 +35,7 @@ EXPECTED_ALL = [ "ChatPerplexity", "ChatPremAI", "ChatSambaNovaCloud", + "ChatSambaStudio", "ChatSparkLLM", "ChatTongyi", "ChatVertexAI", From 780ce00deac87340673f338b51c80e5c1558e97a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Carlos=20Ferra=20de=20Almeida?= Date: Mon, 7 Oct 2024 19:52:50 +0100 Subject: [PATCH 40/62] core[minor]: add **kwargs to index and aindex functions for custom vector_field support (#26998) Added `**kwargs` parameters to the `index` and `aindex` functions in `libs/core/langchain_core/indexing/api.py`. This allows users to pass additional arguments to the `add_documents` and `aadd_documents` methods, enabling the specification of a custom `vector_field`. For example, users can now use `vector_field="embedding"` when indexing documents in `OpenSearchVectorStore` --------- Co-authored-by: Eugene Yurtsev --- libs/core/langchain_core/indexing/api.py | 34 +++- .../unit_tests/indexing/test_indexing.py | 178 ++++++++++++++++++ 2 files changed, 208 insertions(+), 4 deletions(-) diff --git a/libs/core/langchain_core/indexing/api.py b/libs/core/langchain_core/indexing/api.py index 814356b17c3..26566b1be80 100644 --- a/libs/core/langchain_core/indexing/api.py +++ b/libs/core/langchain_core/indexing/api.py @@ -198,6 +198,7 @@ def index( source_id_key: Union[str, Callable[[Document], str], None] = None, cleanup_batch_size: int = 1_000, force_update: bool = False, + upsert_kwargs: Optional[dict[str, Any]] = None, ) -> IndexingResult: """Index data from the loader into the vector store. @@ -249,6 +250,12 @@ def index( force_update: Force update documents even if they are present in the record manager. Useful if you are re-indexing with updated embeddings. Default is False. + upsert_kwargs: Additional keyword arguments to pass to the add_documents + method of the VectorStore or the upsert method of the + DocumentIndex. For example, you can use this to + specify a custom vector_field: + upsert_kwargs={"vector_field": "embedding"} + .. versionadded:: 0.3.10 Returns: Indexing result which contains information about how many documents @@ -363,10 +370,16 @@ def index( if docs_to_index: if isinstance(destination, VectorStore): destination.add_documents( - docs_to_index, ids=uids, batch_size=batch_size + docs_to_index, + ids=uids, + batch_size=batch_size, + **(upsert_kwargs or {}), ) elif isinstance(destination, DocumentIndex): - destination.upsert(docs_to_index) + destination.upsert( + docs_to_index, + **(upsert_kwargs or {}), + ) num_added += len(docs_to_index) - len(seen_docs) num_updated += len(seen_docs) @@ -438,6 +451,7 @@ async def aindex( source_id_key: Union[str, Callable[[Document], str], None] = None, cleanup_batch_size: int = 1_000, force_update: bool = False, + upsert_kwargs: Optional[dict[str, Any]] = None, ) -> IndexingResult: """Async index data from the loader into the vector store. @@ -480,6 +494,12 @@ async def aindex( force_update: Force update documents even if they are present in the record manager. Useful if you are re-indexing with updated embeddings. Default is False. + upsert_kwargs: Additional keyword arguments to pass to the aadd_documents + method of the VectorStore or the aupsert method of the + DocumentIndex. For example, you can use this to + specify a custom vector_field: + upsert_kwargs={"vector_field": "embedding"} + .. versionadded:: 0.3.10 Returns: Indexing result which contains information about how many documents @@ -604,10 +624,16 @@ async def aindex( if docs_to_index: if isinstance(destination, VectorStore): await destination.aadd_documents( - docs_to_index, ids=uids, batch_size=batch_size + docs_to_index, + ids=uids, + batch_size=batch_size, + **(upsert_kwargs or {}), ) elif isinstance(destination, DocumentIndex): - await destination.aupsert(docs_to_index) + await destination.aupsert( + docs_to_index, + **(upsert_kwargs or {}), + ) num_added += len(docs_to_index) - len(seen_docs) num_updated += len(seen_docs) diff --git a/libs/core/tests/unit_tests/indexing/test_indexing.py b/libs/core/tests/unit_tests/indexing/test_indexing.py index 96d3584dad8..287b6b49f66 100644 --- a/libs/core/tests/unit_tests/indexing/test_indexing.py +++ b/libs/core/tests/unit_tests/indexing/test_indexing.py @@ -7,6 +7,7 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest import pytest_asyncio +from pytest_mock import MockerFixture from langchain_core.document_loaders.base import BaseLoader from langchain_core.documents import Document @@ -1728,3 +1729,180 @@ async def test_incremental_aindexing_with_batch_size_with_optimization( for uid in vector_store.store } assert doc_texts == {"updated 1", "2", "3", "updated 4"} + + +def test_index_with_upsert_kwargs( + record_manager: InMemoryRecordManager, upserting_vector_store: InMemoryVectorStore +) -> None: + """Test indexing with upsert_kwargs parameter.""" + mock_add_documents = MagicMock() + + with patch.object(upserting_vector_store, "add_documents", mock_add_documents): + docs = [ + Document( + page_content="Test document 1", + metadata={"source": "1"}, + ), + Document( + page_content="Test document 2", + metadata={"source": "2"}, + ), + ] + + upsert_kwargs = {"vector_field": "embedding"} + + index(docs, record_manager, upserting_vector_store, upsert_kwargs=upsert_kwargs) + + # Assert that add_documents was called with the correct arguments + mock_add_documents.assert_called_once() + call_args = mock_add_documents.call_args + assert call_args is not None + args, kwargs = call_args + + # Check that the documents are correct (ignoring ids) + assert len(args[0]) == 2 + assert all(isinstance(doc, Document) for doc in args[0]) + assert [doc.page_content for doc in args[0]] == [ + "Test document 1", + "Test document 2", + ] + assert [doc.metadata for doc in args[0]] == [{"source": "1"}, {"source": "2"}] + + # Check that ids are present + assert "ids" in kwargs + assert isinstance(kwargs["ids"], list) + assert len(kwargs["ids"]) == 2 + + # Check other arguments + assert kwargs["batch_size"] == 100 + assert kwargs["vector_field"] == "embedding" + + +def test_index_with_upsert_kwargs_for_document_indexer( + record_manager: InMemoryRecordManager, + mocker: MockerFixture, +) -> None: + """Test that kwargs are passed to the upsert method of the document indexer.""" + + document_index = InMemoryDocumentIndex() + upsert_spy = mocker.spy(document_index.__class__, "upsert") + docs = [ + Document( + page_content="This is a test document.", + metadata={"source": "1"}, + ), + Document( + page_content="This is another document.", + metadata={"source": "2"}, + ), + ] + + upsert_kwargs = {"vector_field": "embedding"} + + assert index( + docs, + record_manager, + document_index, + cleanup="full", + upsert_kwargs=upsert_kwargs, + ) == { + "num_added": 2, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } + + assert upsert_spy.call_count == 1 + # assert call kwargs were passed as kwargs + assert upsert_spy.call_args.kwargs == upsert_kwargs + + +async def test_aindex_with_upsert_kwargs_for_document_indexer( + arecord_manager: InMemoryRecordManager, + mocker: MockerFixture, +) -> None: + """Test that kwargs are passed to the upsert method of the document indexer.""" + + document_index = InMemoryDocumentIndex() + upsert_spy = mocker.spy(document_index.__class__, "aupsert") + docs = [ + Document( + page_content="This is a test document.", + metadata={"source": "1"}, + ), + Document( + page_content="This is another document.", + metadata={"source": "2"}, + ), + ] + + upsert_kwargs = {"vector_field": "embedding"} + + assert await aindex( + docs, + arecord_manager, + document_index, + cleanup="full", + upsert_kwargs=upsert_kwargs, + ) == { + "num_added": 2, + "num_deleted": 0, + "num_skipped": 0, + "num_updated": 0, + } + + assert upsert_spy.call_count == 1 + # assert call kwargs were passed as kwargs + assert upsert_spy.call_args.kwargs == upsert_kwargs + + +async def test_aindex_with_upsert_kwargs( + arecord_manager: InMemoryRecordManager, upserting_vector_store: InMemoryVectorStore +) -> None: + """Test async indexing with upsert_kwargs parameter.""" + mock_aadd_documents = AsyncMock() + + with patch.object(upserting_vector_store, "aadd_documents", mock_aadd_documents): + docs = [ + Document( + page_content="Async test document 1", + metadata={"source": "1"}, + ), + Document( + page_content="Async test document 2", + metadata={"source": "2"}, + ), + ] + + upsert_kwargs = {"vector_field": "embedding"} + + await aindex( + docs, + arecord_manager, + upserting_vector_store, + upsert_kwargs=upsert_kwargs, + ) + + # Assert that aadd_documents was called with the correct arguments + mock_aadd_documents.assert_called_once() + call_args = mock_aadd_documents.call_args + assert call_args is not None + args, kwargs = call_args + + # Check that the documents are correct (ignoring ids) + assert len(args[0]) == 2 + assert all(isinstance(doc, Document) for doc in args[0]) + assert [doc.page_content for doc in args[0]] == [ + "Async test document 1", + "Async test document 2", + ] + assert [doc.metadata for doc in args[0]] == [{"source": "1"}, {"source": "2"}] + + # Check that ids are present + assert "ids" in kwargs + assert isinstance(kwargs["ids"], list) + assert len(kwargs["ids"]) == 2 + + # Check other arguments + assert kwargs["batch_size"] == 100 + assert kwargs["vector_field"] == "embedding" From 8f8392137a8a36e83b1b3ad7db25e88134f6acfc Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Mon, 7 Oct 2024 14:53:40 -0400 Subject: [PATCH 41/62] Update MIGRATE.md (#27169) Upgrade the content of MIGRATE.md so it's in sync --- MIGRATE.md | 73 ++++++------------------------------------------------ 1 file changed, 7 insertions(+), 66 deletions(-) diff --git a/MIGRATE.md b/MIGRATE.md index 7254e9b7e3e..65008650764 100644 --- a/MIGRATE.md +++ b/MIGRATE.md @@ -1,70 +1,11 @@ # Migrating -## 🚨Breaking Changes for select chains (SQLDatabase) on 7/28/23 +Please see the following guides for migratin LangChain code: -In an effort to make `langchain` leaner and safer, we are moving select chains to `langchain_experimental`. -This migration has already started, but we are remaining backwards compatible until 7/28. -On that date, we will remove functionality from `langchain`. -Read more about the motivation and the progress [here](https://github.com/langchain-ai/langchain/discussions/8043). +* Migrate to [LangChain v0.3](https://python.langchain.com/docs/versions/v0_3/) +* Migrate to [LangChain v0.2](https://python.langchain.com/docs/versions/v0_2/) +* Migrating from [LangChain 0.0.x Chains](https://python.langchain.com/docs/versions/migrating_chains/) +* Upgrate to [LangGraph Memory](https://python.langchain.com/docs/versions/migrating_memory/) -### Migrating to `langchain_experimental` - -We are moving any experimental components of LangChain, or components with vulnerability issues, into `langchain_experimental`. -This guide covers how to migrate. - -### Installation - -Previously: - -`pip install -U langchain` - -Now (only if you want to access things in experimental): - -`pip install -U langchain langchain_experimental` - -### Things in `langchain.experimental` - -Previously: - -`from langchain.experimental import ...` - -Now: - -`from langchain_experimental import ...` - -### PALChain - -Previously: - -`from langchain.chains import PALChain` - -Now: - -`from langchain_experimental.pal_chain import PALChain` - -### SQLDatabaseChain - -Previously: - -`from langchain.chains import SQLDatabaseChain` - -Now: - -`from langchain_experimental.sql import SQLDatabaseChain` - -Alternatively, if you are just interested in using the query generation part of the SQL chain, you can check out this [`SQL question-answering tutorial`](https://python.langchain.com/v0.2/docs/tutorials/sql_qa/#convert-question-to-sql-query) - -`from langchain.chains import create_sql_query_chain` - -### `load_prompt` for Python files - -Note: this only applies if you want to load Python files as prompts. -If you want to load json/yaml files, no change is needed. - -Previously: - -`from langchain.prompts import load_prompt` - -Now: - -`from langchain_experimental.prompts import load_prompt` +The [LangChain CLI](https://python.langchain.com/docs/versions/v0_3/#migrate-using-langchain-cli) can help automatically upgrade your code to use non deprecated imports. +This will be especially helpful if you're still on either version 0.0.x or 0.1.x of LangChain. From c61b9daef57d125c66b3cd9391c44420fa5c951f Mon Sep 17 00:00:00 2001 From: Aleksandar Petrov <7101799+AleksandarPetrov@users.noreply.github.com> Date: Mon, 7 Oct 2024 21:55:25 +0300 Subject: [PATCH 42/62] docs: Grammar fix in concepts.mdx (#27149) Missing "is" in a sentence about the Tool usage. --- docs/docs/concepts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/concepts.mdx b/docs/docs/concepts.mdx index 1efb3e25da7..2f48f142976 100644 --- a/docs/docs/concepts.mdx +++ b/docs/docs/concepts.mdx @@ -611,7 +611,7 @@ Read more about [defining tools that return artifacts here](/docs/how_to/tool_ar When designing tools to be used by a model, it is important to keep in mind that: - Chat models that have explicit [tool-calling APIs](/docs/concepts/#functiontool-calling) will be better at tool calling than non-fine-tuned models. -- Models will perform better if the tools have well-chosen names, descriptions, and JSON schemas. This another form of prompt engineering. +- Models will perform better if the tools have well-chosen names, descriptions, and JSON schemas. This is another form of prompt engineering. - Simple, narrowly scoped tools are easier for models to use than complex tools. #### Related From 931ce8d026c760fcc008dfecc5e233b7a873f743 Mon Sep 17 00:00:00 2001 From: Bharat Ramanathan Date: Tue, 8 Oct 2024 00:29:29 +0530 Subject: [PATCH 43/62] core[patch]: Update `AsyncCallbackManager` to honor `run_inline` attribute and prevent context loss (#26885) ## Description This PR fixes the context loss issue in `AsyncCallbackManager`, specifically in `on_llm_start` and `on_chat_model_start` methods. It properly honors the `run_inline` attribute of callback handlers, preventing race conditions and ordering issues. Key changes: 1. Separate handlers into inline and non-inline groups. 2. Execute inline handlers sequentially for each prompt. 3. Execute non-inline handlers concurrently across all prompts. 4. Preserve context for stateful handlers. 5. Maintain performance benefits for non-inline handlers. **These changes are implemented in `AsyncCallbackManager` rather than `ahandle_event` because the issue occurs at the prompt and message_list levels, not within individual events.** ## Testing - Test case implemented in #26857 now passes, verifying execution order for inline handlers. ## Related Issues - Fixes issue discussed in #23909 ## Dependencies No new dependencies are required. --- @eyurtsev: This PR implements the discussed changes to respect `run_inline` in `AsyncCallbackManager`. Please review and advise on any needed changes. Twitter handle: @parambharat --------- Co-authored-by: Eugene Yurtsev --- libs/core/langchain_core/callbacks/manager.py | 80 +++++++--- .../callbacks/test_async_callback_manager.py | 148 ++++++++++++++++++ 2 files changed, 207 insertions(+), 21 deletions(-) create mode 100644 libs/core/tests/unit_tests/callbacks/test_async_callback_manager.py diff --git a/libs/core/langchain_core/callbacks/manager.py b/libs/core/langchain_core/callbacks/manager.py index 05dd786591d..604e17c10af 100644 --- a/libs/core/langchain_core/callbacks/manager.py +++ b/libs/core/langchain_core/callbacks/manager.py @@ -1729,7 +1729,12 @@ class AsyncCallbackManager(BaseCallbackManager): to each prompt. """ - tasks = [] + inline_tasks = [] + non_inline_tasks = [] + inline_handlers = [handler for handler in self.handlers if handler.run_inline] + non_inline_handlers = [ + handler for handler in self.handlers if not handler.run_inline + ] managers = [] for prompt in prompts: @@ -1739,20 +1744,36 @@ class AsyncCallbackManager(BaseCallbackManager): else: run_id_ = uuid.uuid4() - tasks.append( - ahandle_event( - self.handlers, - "on_llm_start", - "ignore_llm", - serialized, - [prompt], - run_id=run_id_, - parent_run_id=self.parent_run_id, - tags=self.tags, - metadata=self.metadata, - **kwargs, + if inline_handlers: + inline_tasks.append( + ahandle_event( + inline_handlers, + "on_llm_start", + "ignore_llm", + serialized, + [prompt], + run_id=run_id_, + parent_run_id=self.parent_run_id, + tags=self.tags, + metadata=self.metadata, + **kwargs, + ) + ) + else: + non_inline_tasks.append( + ahandle_event( + non_inline_handlers, + "on_llm_start", + "ignore_llm", + serialized, + [prompt], + run_id=run_id_, + parent_run_id=self.parent_run_id, + tags=self.tags, + metadata=self.metadata, + **kwargs, + ) ) - ) managers.append( AsyncCallbackManagerForLLMRun( @@ -1767,7 +1788,13 @@ class AsyncCallbackManager(BaseCallbackManager): ) ) - await asyncio.gather(*tasks) + # Run inline tasks sequentially + for inline_task in inline_tasks: + await inline_task + + # Run non-inline tasks concurrently + if non_inline_tasks: + await asyncio.gather(*non_inline_tasks) return managers @@ -1791,7 +1818,8 @@ class AsyncCallbackManager(BaseCallbackManager): async callback managers, one for each LLM Run corresponding to each inner message list. """ - tasks = [] + inline_tasks = [] + non_inline_tasks = [] managers = [] for message_list in messages: @@ -1801,9 +1829,9 @@ class AsyncCallbackManager(BaseCallbackManager): else: run_id_ = uuid.uuid4() - tasks.append( - ahandle_event( - self.handlers, + for handler in self.handlers: + task = ahandle_event( + [handler], "on_chat_model_start", "ignore_chat_model", serialized, @@ -1814,7 +1842,10 @@ class AsyncCallbackManager(BaseCallbackManager): metadata=self.metadata, **kwargs, ) - ) + if handler.run_inline: + inline_tasks.append(task) + else: + non_inline_tasks.append(task) managers.append( AsyncCallbackManagerForLLMRun( @@ -1829,7 +1860,14 @@ class AsyncCallbackManager(BaseCallbackManager): ) ) - await asyncio.gather(*tasks) + # Run inline tasks sequentially + for task in inline_tasks: + await task + + # Run non-inline tasks concurrently + if non_inline_tasks: + await asyncio.gather(*non_inline_tasks) + return managers async def on_chain_start( diff --git a/libs/core/tests/unit_tests/callbacks/test_async_callback_manager.py b/libs/core/tests/unit_tests/callbacks/test_async_callback_manager.py new file mode 100644 index 00000000000..38350f9d82f --- /dev/null +++ b/libs/core/tests/unit_tests/callbacks/test_async_callback_manager.py @@ -0,0 +1,148 @@ +"""Unit tests for verifying event dispatching. + +Much of this code is indirectly tested already through many end-to-end tests +that generate traces based on the callbacks. The traces are all verified +via snapshot testing (e.g., see unit tests for runnables). +""" + +import contextvars +from contextlib import asynccontextmanager +from typing import Any, Optional +from uuid import UUID + +from langchain_core.callbacks import ( + AsyncCallbackHandler, + AsyncCallbackManager, + BaseCallbackHandler, +) + + +async def test_inline_handlers_share_parent_context() -> None: + """Verify that handlers that are configured to run_inline can update parent context. + + This test was created because some of the inline handlers were getting + their own context as the handling logic was kicked off using asyncio.gather + which does not automatically propagate the parent context (by design). + + This issue was affecting only a few specific handlers: + + * on_llm_start + * on_chat_model_start + + which in some cases were triggered with multiple prompts and as a result + triggering multiple tasks that were launched in parallel. + """ + some_var: contextvars.ContextVar[str] = contextvars.ContextVar("some_var") + + class CustomHandler(AsyncCallbackHandler): + """A handler that sets the context variable. + + The handler sets the context variable to the name of the callback that was + called. + """ + + def __init__(self, run_inline: bool) -> None: + """Initialize the handler.""" + self.run_inline = run_inline + + async def on_llm_start(self, *args: Any, **kwargs: Any) -> None: + """Update the callstack with the name of the callback.""" + some_var.set("on_llm_start") + + # The manager serves as a callback dispatcher. + # It's responsible for dispatching callbacks to all registered handlers. + manager = AsyncCallbackManager(handlers=[CustomHandler(run_inline=True)]) + + # Check on_llm_start + some_var.set("unset") + await manager.on_llm_start({}, ["prompt 1"]) + assert some_var.get() == "on_llm_start" + + # Check what happens when run_inline is False + # We don't expect the context to be updated + manager2 = AsyncCallbackManager( + handlers=[ + CustomHandler(run_inline=False), + ] + ) + + some_var.set("unset") + await manager2.on_llm_start({}, ["prompt 1"]) + # Will not be updated because the handler is not inline + assert some_var.get() == "unset" + + +async def test_inline_handlers_share_parent_context_multiple() -> None: + """A slightly more complex variation of the test unit test above. + + This unit test verifies that things work correctly when there are multiple prompts, + and multiple handlers that are configured to run inline. + """ + counter_var = contextvars.ContextVar("counter", default=0) + + shared_stack = [] + + @asynccontextmanager + async def set_counter_var() -> Any: + token = counter_var.set(0) + try: + yield + finally: + counter_var.reset(token) + + class StatefulAsyncCallbackHandler(AsyncCallbackHandler): + def __init__(self, name: str, run_inline: bool = True): + self.name = name + self.run_inline = run_inline + + async def on_llm_start( + self, + serialized: dict[str, Any], + prompts: list[str], + *, + run_id: UUID, + parent_run_id: Optional[UUID] = None, + **kwargs: Any, + ) -> None: + if self.name == "StateModifier": + current_counter = counter_var.get() + counter_var.set(current_counter + 1) + state = counter_var.get() + elif self.name == "StateReader": + state = counter_var.get() + else: + state = None + + shared_stack.append(state) + + await super().on_llm_start( + serialized, + prompts, + run_id=run_id, + parent_run_id=parent_run_id, + **kwargs, + ) + + handlers: list[BaseCallbackHandler] = [ + StatefulAsyncCallbackHandler("StateModifier", run_inline=True), + StatefulAsyncCallbackHandler("StateReader", run_inline=True), + StatefulAsyncCallbackHandler("NonInlineHandler", run_inline=False), + ] + + prompts = ["Prompt1", "Prompt2", "Prompt3"] + + async with set_counter_var(): + shared_stack.clear() + manager = AsyncCallbackManager(handlers=handlers) + await manager.on_llm_start({}, prompts) + + # Assert the order of states + states = [entry for entry in shared_stack if entry is not None] + assert states == [ + 1, + 1, + 2, + 2, + 3, + 3, + ], f"Expected order of states was broken due to context loss. Got {states}" From c4ebccfec2e1a5643eb1ae0f35cd5d7471d3404d Mon Sep 17 00:00:00 2001 From: Christophe Bornet Date: Mon, 7 Oct 2024 21:01:08 +0200 Subject: [PATCH 44/62] core[minor]: Improve support for id in VectorStore (#26660) Co-authored-by: Eugene Yurtsev --- .../vectorstores/usearch.py | 10 +- libs/core/langchain_core/vectorstores/base.py | 55 +++++-- .../vectorstores/test_vectorstore.py | 140 ++++++++++++++++-- 3 files changed, 178 insertions(+), 27 deletions(-) diff --git a/libs/community/langchain_community/vectorstores/usearch.py b/libs/community/langchain_community/vectorstores/usearch.py index fa94d19de00..c59446de54d 100644 --- a/libs/community/langchain_community/vectorstores/usearch.py +++ b/libs/community/langchain_community/vectorstores/usearch.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Dict, Iterable, List, Optional, Tuple +from typing import Any, Dict, Iterable, List, Optional, Tuple, Union import numpy as np from langchain_core.documents import Document @@ -42,7 +42,7 @@ class USearch(VectorStore): self, texts: Iterable[str], metadatas: Optional[List[Dict]] = None, - ids: Optional[np.ndarray] = None, + ids: Optional[Union[np.ndarray, list[str]]] = None, **kwargs: Any, ) -> List[str]: """Run more texts through the embeddings and add to the vectorstore. @@ -69,6 +69,8 @@ class USearch(VectorStore): last_id = int(self.ids[-1]) + 1 if ids is None: ids = np.array([str(last_id + id) for id, _ in enumerate(texts)]) + elif isinstance(ids, list): + ids = np.array(ids) self.index.add(np.array(ids), np.array(embeddings)) self.docstore.add(dict(zip(ids, documents))) @@ -134,7 +136,7 @@ class USearch(VectorStore): texts: List[str], embedding: Embeddings, metadatas: Optional[List[Dict]] = None, - ids: Optional[np.ndarray] = None, + ids: Optional[Union[np.ndarray, list[str]]] = None, metric: str = "cos", **kwargs: Any, ) -> USearch: @@ -159,6 +161,8 @@ class USearch(VectorStore): documents: List[Document] = [] if ids is None: ids = np.array([str(id) for id, _ in enumerate(texts)]) + elif isinstance(ids, list): + ids = np.array(ids) for i, text in enumerate(texts): metadata = metadatas[i] if metadatas else {} documents.append(Document(page_content=text, metadata=metadata)) diff --git a/libs/core/langchain_core/vectorstores/base.py b/libs/core/langchain_core/vectorstores/base.py index aacf897ffb9..ccc966d9f2a 100644 --- a/libs/core/langchain_core/vectorstores/base.py +++ b/libs/core/langchain_core/vectorstores/base.py @@ -25,7 +25,7 @@ import logging import math import warnings from abc import ABC, abstractmethod -from collections.abc import Collection, Iterable, Sequence +from collections.abc import Collection, Iterable, Iterator, Sequence from itertools import cycle from typing import ( TYPE_CHECKING, @@ -61,10 +61,8 @@ class VectorStore(ABC): self, texts: Iterable[str], metadatas: Optional[list[dict]] = None, - # One of the kwargs should be `ids` which is a list of ids - # associated with the texts. - # This is not yet enforced in the type signature for backwards compatibility - # with existing implementations. + *, + ids: Optional[list[str]] = None, **kwargs: Any, ) -> list[str]: """Run more texts through the embeddings and add to the vectorstore. @@ -72,6 +70,7 @@ class VectorStore(ABC): Args: texts: Iterable of strings to add to the vectorstore. metadatas: Optional list of metadatas associated with the texts. + ids: Optional list of IDs associated with the texts. **kwargs: vectorstore specific parameters. One of the kwargs should be `ids` which is a list of ids associated with the texts. @@ -99,10 +98,14 @@ class VectorStore(ABC): f"Got {len(metadatas)} metadatas and {len(texts_)} texts." ) metadatas_ = iter(metadatas) if metadatas else cycle([{}]) + ids_: Iterator[Optional[str]] = iter(ids) if ids else cycle([None]) docs = [ - Document(page_content=text, metadata=metadata_) - for text, metadata_ in zip(texts, metadatas_) + Document(id=id_, page_content=text, metadata=metadata_) + for text, metadata_, id_ in zip(texts, metadatas_, ids_) ] + if ids is not None: + # For backward compatibility + kwargs["ids"] = ids return self.add_documents(docs, **kwargs) raise NotImplementedError( @@ -206,6 +209,8 @@ class VectorStore(ABC): self, texts: Iterable[str], metadatas: Optional[list[dict]] = None, + *, + ids: Optional[list[str]] = None, **kwargs: Any, ) -> list[str]: """Async run more texts through the embeddings and add to the vectorstore. @@ -214,6 +219,7 @@ class VectorStore(ABC): texts: Iterable of strings to add to the vectorstore. metadatas: Optional list of metadatas associated with the texts. Default is None. + ids: Optional list **kwargs: vectorstore specific parameters. Returns: @@ -223,6 +229,9 @@ class VectorStore(ABC): ValueError: If the number of metadatas does not match the number of texts. ValueError: If the number of ids does not match the number of texts. """ + if ids is not None: + # For backward compatibility + kwargs["ids"] = ids if type(self).aadd_documents != VectorStore.aadd_documents: # Import document in local scope to avoid circular imports from langchain_core.documents import Document @@ -239,12 +248,12 @@ class VectorStore(ABC): f"Got {len(metadatas)} metadatas and {len(texts_)} texts." ) metadatas_ = iter(metadatas) if metadatas else cycle([{}]) + ids_: Iterator[Optional[str]] = iter(ids) if ids else cycle([None]) docs = [ - Document(page_content=text, metadata=metadata_) - for text, metadata_ in zip(texts, metadatas_) + Document(id=id_, page_content=text, metadata=metadata_) + for text, metadata_, id_ in zip(texts, metadatas_, ids_) ] - return await self.aadd_documents(docs, **kwargs) return await run_in_executor(None, self.add_texts, texts, metadatas, **kwargs) @@ -827,6 +836,15 @@ class VectorStore(ABC): """ texts = [d.page_content for d in documents] metadatas = [d.metadata for d in documents] + + if "ids" not in kwargs: + ids = [doc.id for doc in documents] + + # If there's at least one valid ID, we'll assume that IDs + # should be used. + if any(ids): + kwargs["ids"] = ids + return cls.from_texts(texts, embedding, metadatas=metadatas, **kwargs) @classmethod @@ -848,6 +866,15 @@ class VectorStore(ABC): """ texts = [d.page_content for d in documents] metadatas = [d.metadata for d in documents] + + if "ids" not in kwargs: + ids = [doc.id for doc in documents] + + # If there's at least one valid ID, we'll assume that IDs + # should be used. + if any(ids): + kwargs["ids"] = ids + return await cls.afrom_texts(texts, embedding, metadatas=metadatas, **kwargs) @classmethod @@ -857,6 +884,8 @@ class VectorStore(ABC): texts: list[str], embedding: Embeddings, metadatas: Optional[list[dict]] = None, + *, + ids: Optional[list[str]] = None, **kwargs: Any, ) -> VST: """Return VectorStore initialized from texts and embeddings. @@ -866,6 +895,7 @@ class VectorStore(ABC): embedding: Embedding function to use. metadatas: Optional list of metadatas associated with the texts. Default is None. + ids: Optional list of IDs associated with the texts. kwargs: Additional keyword arguments. Returns: @@ -878,6 +908,8 @@ class VectorStore(ABC): texts: list[str], embedding: Embeddings, metadatas: Optional[list[dict]] = None, + *, + ids: Optional[list[str]] = None, **kwargs: Any, ) -> VST: """Async return VectorStore initialized from texts and embeddings. @@ -887,11 +919,14 @@ class VectorStore(ABC): embedding: Embedding function to use. metadatas: Optional list of metadatas associated with the texts. Default is None. + ids: Optional list of IDs associated with the texts. kwargs: Additional keyword arguments. Returns: VectorStore: VectorStore initialized from texts and embeddings. """ + if ids is not None: + kwargs["ids"] = ids return await run_in_executor( None, cls.from_texts, texts, embedding, metadatas, **kwargs ) diff --git a/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py b/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py index 29746bbe67d..aba1481c623 100644 --- a/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py +++ b/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py @@ -10,8 +10,10 @@ import uuid from collections.abc import Iterable, Sequence from typing import Any, Optional +import pytest + from langchain_core.documents import Document -from langchain_core.embeddings import Embeddings +from langchain_core.embeddings import Embeddings, FakeEmbeddings from langchain_core.vectorstores import VectorStore @@ -25,10 +27,6 @@ class CustomAddTextsVectorstore(VectorStore): self, texts: Iterable[str], metadatas: Optional[list[dict]] = None, - # One of the kwargs should be `ids` which is a list of ids - # associated with the texts. - # This is not yet enforced in the type signature for backwards compatibility - # with existing implementations. ids: Optional[list[str]] = None, **kwargs: Any, ) -> list[str]: @@ -68,12 +66,59 @@ class CustomAddTextsVectorstore(VectorStore): raise NotImplementedError() -def test_default_add_documents() -> None: +class CustomAddDocumentsVectorstore(VectorStore): + """A vectorstore that only implements add documents.""" + + def __init__(self) -> None: + self.store: dict[str, Document] = {} + + def add_documents( + self, + documents: list[Document], + *, + ids: Optional[list[str]] = None, + **kwargs: Any, + ) -> list[str]: + ids_ = [] + ids_iter = iter(ids or []) + for document in documents: + id_ = next(ids_iter) if ids else document.id or str(uuid.uuid4()) + self.store[id_] = Document( + id=id_, page_content=document.page_content, metadata=document.metadata + ) + ids_.append(id_) + return ids_ + + def get_by_ids(self, ids: Sequence[str], /) -> list[Document]: + return [self.store[id] for id in ids if id in self.store] + + @classmethod + def from_texts( # type: ignore + cls, + texts: list[str], + embedding: Embeddings, + metadatas: Optional[list[dict]] = None, + **kwargs: Any, + ) -> CustomAddDocumentsVectorstore: + vectorstore = CustomAddDocumentsVectorstore() + vectorstore.add_texts(texts, metadatas=metadatas, **kwargs) + return vectorstore + + def similarity_search( + self, query: str, k: int = 4, **kwargs: Any + ) -> list[Document]: + raise NotImplementedError() + + +@pytest.mark.parametrize( + "vs_class", [CustomAddTextsVectorstore, CustomAddDocumentsVectorstore] +) +def test_default_add_documents(vs_class: type[VectorStore]) -> None: """Test that we can implement the upsert method of the CustomVectorStore class without violating the Liskov Substitution Principle. """ - store = CustomAddTextsVectorstore() + store = vs_class() # Check upsert with id assert store.add_documents([Document(id="1", page_content="hello")]) == ["1"] @@ -95,8 +140,11 @@ def test_default_add_documents() -> None: assert store.get_by_ids(["6"]) == [Document(id="6", page_content="baz")] -def test_default_add_texts() -> None: - store = CustomAddTextsVectorstore() +@pytest.mark.parametrize( + "vs_class", [CustomAddTextsVectorstore, CustomAddDocumentsVectorstore] +) +def test_default_add_texts(vs_class: type[VectorStore]) -> None: + store = vs_class() # Check that default implementation of add_texts works assert store.add_texts(["hello", "world"], ids=["3", "4"]) == ["3", "4"] @@ -122,9 +170,12 @@ def test_default_add_texts() -> None: ] -async def test_default_aadd_documents() -> None: +@pytest.mark.parametrize( + "vs_class", [CustomAddTextsVectorstore, CustomAddDocumentsVectorstore] +) +async def test_default_aadd_documents(vs_class: type[VectorStore]) -> None: """Test delegation to the synchronous method.""" - store = CustomAddTextsVectorstore() + store = vs_class() # Check upsert with id assert await store.aadd_documents([Document(id="1", page_content="hello")]) == ["1"] @@ -146,10 +197,13 @@ async def test_default_aadd_documents() -> None: assert await store.aget_by_ids(["6"]) == [Document(id="6", page_content="baz")] -async def test_default_aadd_texts() -> None: +@pytest.mark.parametrize( + "vs_class", [CustomAddTextsVectorstore, CustomAddDocumentsVectorstore] +) +async def test_default_aadd_texts(vs_class: type[VectorStore]) -> None: """Test delegation to the synchronous method.""" - store = CustomAddTextsVectorstore() - # Check that default implementation of add_texts works + store = vs_class() + # Check that default implementation of aadd_texts works assert await store.aadd_texts(["hello", "world"], ids=["3", "4"]) == ["3", "4"] assert await store.aget_by_ids(["3", "4"]) == [ @@ -172,3 +226,61 @@ async def test_default_aadd_texts() -> None: Document(id=ids_2[0], page_content="foo", metadata={"foo": "bar"}), Document(id=ids_2[1], page_content="bar", metadata={"foo": "bar"}), ] + + +@pytest.mark.parametrize( + "vs_class", [CustomAddTextsVectorstore, CustomAddDocumentsVectorstore] +) +def test_default_from_documents(vs_class: type[VectorStore]) -> None: + embeddings = FakeEmbeddings(size=1) + store = vs_class.from_documents( + [Document(id="1", page_content="hello", metadata={"foo": "bar"})], embeddings + ) + + assert store.get_by_ids(["1"]) == [ + Document(id="1", page_content="hello", metadata={"foo": "bar"}) + ] + + # from_documents with ids in args + store = vs_class.from_documents( + [Document(page_content="hello", metadata={"foo": "bar"})], embeddings, ids=["1"] + ) + + assert store.get_by_ids(["1"]) == [ + Document(id="1", page_content="hello", metadata={"foo": "bar"}) + ] + + # Test from_documents with id specified in both document and ids + original_document = Document(id="7", page_content="baz") + store = vs_class.from_documents([original_document], embeddings, ids=["6"]) + assert original_document.id == "7" # original document should not be modified + assert store.get_by_ids(["6"]) == [Document(id="6", page_content="baz")] + + +@pytest.mark.parametrize( + "vs_class", [CustomAddTextsVectorstore, CustomAddDocumentsVectorstore] +) +async def test_default_afrom_documents(vs_class: type[VectorStore]) -> None: + embeddings = FakeEmbeddings(size=1) + store = await vs_class.afrom_documents( + [Document(id="1", page_content="hello", metadata={"foo": "bar"})], embeddings + ) + + assert await store.aget_by_ids(["1"]) == [ + Document(id="1", page_content="hello", metadata={"foo": "bar"}) + ] + + # from_documents with ids in args + store = await vs_class.afrom_documents( + [Document(page_content="hello", metadata={"foo": "bar"})], embeddings, ids=["1"] + ) + + assert await store.aget_by_ids(["1"]) == [ + Document(id="1", page_content="hello", metadata={"foo": "bar"}) + ] + + # Test afrom_documents with id specified in both document and ids + original_document = Document(id="7", page_content="baz") + store = await vs_class.afrom_documents([original_document], embeddings, ids=["6"]) + assert original_document.id == "7" # original document should not be modified + assert await store.aget_by_ids(["6"]) == [Document(id="6", page_content="baz")] From 8454a742d7918e4ddbdbb50da26461d2c0c53c25 Mon Sep 17 00:00:00 2001 From: Bhadresh Savani Date: Tue, 8 Oct 2024 00:54:33 +0530 Subject: [PATCH 45/62] Update README.md for Tutorial to Usecase url (#27099) Fixed tutorial URL since earlier Tutorial URL was pointing to usecase age which does not have any detail it should redirect to correct URL page --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b175d4151fb..4b724e9b5ec 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Agents allow an LLM autonomy over how a task is accomplished. Agents make decisi Please see [here](https://python.langchain.com) for full documentation, which includes: - [Introduction](https://python.langchain.com/docs/introduction/): Overview of the framework and the structure of the docs. -- [Tutorials](https://python.langchain.com/docs/use_cases/): If you're looking to build something specific or are more of a hands-on learner, check out our tutorials. This is the best place to get started. +- [Tutorials](https://python.langchain.com/docs/tutorials/): If you're looking to build something specific or are more of a hands-on learner, check out our tutorials. This is the best place to get started. - [How-to guides](https://python.langchain.com/docs/how_to/): Answers to “How do I….?” type questions. These guides are goal-oriented and concrete; they're meant to help you complete a specific task. - [Conceptual guide](https://python.langchain.com/docs/concepts/): Conceptual explanations of the key parts of the framework. - [API Reference](https://api.python.langchain.com): Thorough documentation of every class and method. From 37ca468d033ace0b766c018e71bdd07be2a53a8e Mon Sep 17 00:00:00 2001 From: Oleksii Pokotylo Date: Mon, 7 Oct 2024 21:27:09 +0200 Subject: [PATCH 46/62] community: AzureSearch: fix reranking for empty lists (#27104) **Description:** Fix reranking for empty lists **Issue:** ``` ValueError: not enough values to unpack (expected 3, got 0) documents, scores, vectors = map(list, zip(*docs)) File langchain_community/vectorstores/azuresearch.py", line 1680, in _reorder_results_with_maximal_marginal_relevance ``` Co-authored-by: Oleksii Pokotylo --- libs/community/langchain_community/vectorstores/azuresearch.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/community/langchain_community/vectorstores/azuresearch.py b/libs/community/langchain_community/vectorstores/azuresearch.py index 3e022d31654..193f6fc680e 100644 --- a/libs/community/langchain_community/vectorstores/azuresearch.py +++ b/libs/community/langchain_community/vectorstores/azuresearch.py @@ -1769,6 +1769,8 @@ def _reorder_results_with_maximal_marginal_relevance( ) for result in results ] + if not docs: + return [] documents, scores, vectors = map(list, zip(*docs)) # Get the new order of results. From d31ec8810af8d8e5dea848dfd0f721e8e6045763 Mon Sep 17 00:00:00 2001 From: Christophe Bornet Date: Tue, 8 Oct 2024 00:12:28 +0200 Subject: [PATCH 47/62] core: Add ruff rules for error messages (EM) (#26965) All auto-fixes Co-authored-by: Erick Friis --- libs/core/langchain_core/_api/deprecation.py | 23 +++--- .../langchain_core/beta/runnables/context.py | 21 +++-- libs/core/langchain_core/caches.py | 3 +- libs/core/langchain_core/callbacks/base.py | 10 +-- libs/core/langchain_core/callbacks/manager.py | 15 ++-- libs/core/langchain_core/chat_history.py | 3 +- .../langchain_core/document_loaders/base.py | 10 +-- libs/core/langchain_core/documents/base.py | 12 ++- libs/core/langchain_core/exceptions.py | 3 +- libs/core/langchain_core/indexing/api.py | 53 ++++++++----- libs/core/langchain_core/indexing/base.py | 6 +- .../core/langchain_core/indexing/in_memory.py | 3 +- .../langchain_core/language_models/base.py | 5 +- .../language_models/chat_models.py | 36 +++++---- .../language_models/fake_chat_models.py | 6 +- .../langchain_core/language_models/llms.py | 21 +++-- libs/core/langchain_core/load/dump.py | 3 +- libs/core/langchain_core/load/load.py | 15 ++-- libs/core/langchain_core/load/serializable.py | 3 +- libs/core/langchain_core/messages/ai.py | 8 +- libs/core/langchain_core/messages/base.py | 3 +- libs/core/langchain_core/messages/chat.py | 5 +- libs/core/langchain_core/messages/function.py | 5 +- libs/core/langchain_core/messages/modifier.py | 3 +- libs/core/langchain_core/messages/tool.py | 15 ++-- libs/core/langchain_core/messages/utils.py | 34 ++++---- .../langchain_core/output_parsers/base.py | 6 +- .../output_parsers/openai_functions.py | 38 ++++----- .../output_parsers/openai_tools.py | 13 ++-- .../langchain_core/output_parsers/pydantic.py | 5 +- .../core/langchain_core/output_parsers/xml.py | 10 ++- .../langchain_core/outputs/chat_generation.py | 6 +- .../core/langchain_core/outputs/generation.py | 3 +- libs/core/langchain_core/prompts/base.py | 26 ++++--- libs/core/langchain_core/prompts/chat.py | 53 ++++++++----- libs/core/langchain_core/prompts/few_shot.py | 23 +++--- .../prompts/few_shot_with_templates.py | 16 ++-- libs/core/langchain_core/prompts/image.py | 12 ++- libs/core/langchain_core/prompts/loading.py | 34 ++++---- libs/core/langchain_core/prompts/prompt.py | 24 +++--- libs/core/langchain_core/prompts/string.py | 23 +++--- .../core/langchain_core/prompts/structured.py | 5 +- libs/core/langchain_core/runnables/base.py | 78 ++++++++++++------- libs/core/langchain_core/runnables/branch.py | 19 +++-- libs/core/langchain_core/runnables/config.py | 6 +- .../langchain_core/runnables/configurable.py | 3 +- .../langchain_core/runnables/fallbacks.py | 24 ++++-- libs/core/langchain_core/runnables/graph.py | 9 ++- .../langchain_core/runnables/graph_ascii.py | 5 +- .../langchain_core/runnables/graph_mermaid.py | 19 +++-- .../langchain_core/runnables/graph_png.py | 5 +- libs/core/langchain_core/runnables/history.py | 17 ++-- libs/core/langchain_core/runnables/router.py | 18 +++-- libs/core/langchain_core/runnables/utils.py | 3 +- libs/core/langchain_core/structured_query.py | 6 +- libs/core/langchain_core/tools/base.py | 29 ++++--- libs/core/langchain_core/tools/convert.py | 14 ++-- libs/core/langchain_core/tools/simple.py | 9 ++- libs/core/langchain_core/tools/structured.py | 11 +-- libs/core/langchain_core/tracers/context.py | 8 +- libs/core/langchain_core/tracers/core.py | 18 +++-- .../core/langchain_core/tracers/evaluation.py | 3 +- .../langchain_core/tracers/event_stream.py | 24 ++++-- libs/core/langchain_core/tracers/langchain.py | 6 +- .../langchain_core/tracers/langchain_v1.py | 6 +- .../core/langchain_core/tracers/log_stream.py | 19 ++--- libs/core/langchain_core/utils/_merge.py | 12 ++- libs/core/langchain_core/utils/aiter.py | 3 +- libs/core/langchain_core/utils/env.py | 3 +- libs/core/langchain_core/utils/formatting.py | 3 +- .../langchain_core/utils/function_calling.py | 15 ++-- libs/core/langchain_core/utils/json.py | 6 +- libs/core/langchain_core/utils/json_schema.py | 6 +- libs/core/langchain_core/utils/mustache.py | 19 +++-- libs/core/langchain_core/utils/pydantic.py | 31 ++++---- libs/core/langchain_core/utils/utils.py | 35 ++++++--- libs/core/langchain_core/vectorstores/base.py | 40 ++++++---- .../langchain_core/vectorstores/in_memory.py | 11 ++- .../core/langchain_core/vectorstores/utils.py | 13 ++-- libs/core/pyproject.toml | 2 +- libs/core/tests/unit_tests/conftest.py | 3 +- .../language_models/llms/test_cache.py | 6 +- .../unit_tests/load/test_serializable.py | 9 ++- .../output_parsers/test_base_parsers.py | 20 ++--- .../tests/unit_tests/prompts/test_prompt.py | 3 +- libs/core/tests/unit_tests/pydantic_utils.py | 5 +- .../unit_tests/runnables/test_configurable.py | 3 +- .../unit_tests/runnables/test_runnable.py | 42 ++++++---- .../runnables/test_runnable_events_v1.py | 3 +- .../runnables/test_runnable_events_v2.py | 6 +- .../runnables/test_tracing_interops.py | 6 +- libs/core/tests/unit_tests/test_imports.py | 3 +- .../tests/unit_tests/utils/test_pydantic.py | 6 +- .../core/tests/unit_tests/utils/test_utils.py | 6 +- 94 files changed, 777 insertions(+), 523 deletions(-) diff --git a/libs/core/langchain_core/_api/deprecation.py b/libs/core/langchain_core/_api/deprecation.py index 58a97a416af..ab6e47d3159 100644 --- a/libs/core/langchain_core/_api/deprecation.py +++ b/libs/core/langchain_core/_api/deprecation.py @@ -51,15 +51,18 @@ def _validate_deprecation_params( ) -> None: """Validate the deprecation parameters.""" if pending and removal: - raise ValueError("A pending deprecation cannot have a scheduled removal") + msg = "A pending deprecation cannot have a scheduled removal" + raise ValueError(msg) if alternative and alternative_import: - raise ValueError("Cannot specify both alternative and alternative_import") + msg = "Cannot specify both alternative and alternative_import" + raise ValueError(msg) if alternative_import and "." not in alternative_import: - raise ValueError( + msg = ( "alternative_import must be a fully qualified module path. Got " f" {alternative_import}" ) + raise ValueError(msg) def deprecated( @@ -222,7 +225,8 @@ def deprecated( if not _obj_type: _obj_type = "attribute" if not _name: - raise ValueError(f"Field {obj} must have a name to be deprecated.") + msg = f"Field {obj} must have a name to be deprecated." + raise ValueError(msg) old_doc = obj.description def finalize(wrapper: Callable[..., Any], new_doc: str) -> T: @@ -241,7 +245,8 @@ def deprecated( if not _obj_type: _obj_type = "attribute" if not _name: - raise ValueError(f"Field {obj} must have a name to be deprecated.") + msg = f"Field {obj} must have a name to be deprecated." + raise ValueError(msg) old_doc = obj.description def finalize(wrapper: Callable[..., Any], new_doc: str) -> T: @@ -428,10 +433,11 @@ def warn_deprecated( if not pending: if not removal: removal = f"in {removal}" if removal else "within ?? minor releases" - raise NotImplementedError( + msg = ( f"Need to determine which default deprecation schedule to use. " f"{removal}" ) + raise NotImplementedError(msg) else: removal = f"in {removal}" @@ -523,9 +529,8 @@ def rename_parameter( @functools.wraps(f) def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R: if new in kwargs and old in kwargs: - raise TypeError( - f"{f.__name__}() got multiple values for argument {new!r}" - ) + msg = f"{f.__name__}() got multiple values for argument {new!r}" + raise TypeError(msg) if old in kwargs: warn_deprecated( since, diff --git a/libs/core/langchain_core/beta/runnables/context.py b/libs/core/langchain_core/beta/runnables/context.py index 739798eb172..a53e8fdf579 100644 --- a/libs/core/langchain_core/beta/runnables/context.py +++ b/libs/core/langchain_core/beta/runnables/context.py @@ -59,7 +59,8 @@ def _key_from_id(id_: str) -> str: elif wout_prefix.endswith(CONTEXT_CONFIG_SUFFIX_SET): return wout_prefix[: -len(CONTEXT_CONFIG_SUFFIX_SET)] else: - raise ValueError(f"Invalid context config id {id_}") + msg = f"Invalid context config id {id_}" + raise ValueError(msg) def _config_with_context( @@ -103,16 +104,15 @@ def _config_with_context( for dep in deps_by_key[key]: if key in deps_by_key[dep]: - raise ValueError( - f"Deadlock detected between context keys {key} and {dep}" - ) + msg = f"Deadlock detected between context keys {key} and {dep}" + raise ValueError(msg) if len(setters) != 1: - raise ValueError(f"Expected exactly one setter for context key {key}") + msg = f"Expected exactly one setter for context key {key}" + raise ValueError(msg) setter_idx = setters[0][1] if any(getter_idx < setter_idx for _, getter_idx in getters): - raise ValueError( - f"Context setter for key {key} must be defined after all getters." - ) + msg = f"Context setter for key {key} must be defined after all getters." + raise ValueError(msg) if getters: context_funcs[getters[0][0].id] = partial(getter, events[key], values) @@ -271,9 +271,8 @@ class ContextSet(RunnableSerializable): if spec.id.endswith(CONTEXT_CONFIG_SUFFIX_GET): getter_key = spec.id.split("/")[1] if getter_key in self.keys: - raise ValueError( - f"Circular reference in context setter for key {getter_key}" - ) + msg = f"Circular reference in context setter for key {getter_key}" + raise ValueError(msg) return super().config_specs + [ ConfigurableFieldSpec( id=id_, diff --git a/libs/core/langchain_core/caches.py b/libs/core/langchain_core/caches.py index e93ce796940..d534d70d25f 100644 --- a/libs/core/langchain_core/caches.py +++ b/libs/core/langchain_core/caches.py @@ -160,7 +160,8 @@ class InMemoryCache(BaseCache): """ self._cache: dict[tuple[str, str], RETURN_VAL_TYPE] = {} if maxsize is not None and maxsize <= 0: - raise ValueError("maxsize must be greater than 0") + msg = "maxsize must be greater than 0" + raise ValueError(msg) self._maxsize = maxsize def lookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: diff --git a/libs/core/langchain_core/callbacks/base.py b/libs/core/langchain_core/callbacks/base.py index c6e9090f789..b3a61aa9a2a 100644 --- a/libs/core/langchain_core/callbacks/base.py +++ b/libs/core/langchain_core/callbacks/base.py @@ -275,9 +275,8 @@ class CallbackManagerMixin: """ # NotImplementedError is thrown intentionally # Callback handler will fall back to on_llm_start if this is exception is thrown - raise NotImplementedError( - f"{self.__class__.__name__} does not implement `on_chat_model_start`" - ) + msg = f"{self.__class__.__name__} does not implement `on_chat_model_start`" + raise NotImplementedError(msg) def on_retriever_start( self, @@ -523,9 +522,8 @@ class AsyncCallbackHandler(BaseCallbackHandler): """ # NotImplementedError is thrown intentionally # Callback handler will fall back to on_llm_start if this is exception is thrown - raise NotImplementedError( - f"{self.__class__.__name__} does not implement `on_chat_model_start`" - ) + msg = f"{self.__class__.__name__} does not implement `on_chat_model_start`" + raise NotImplementedError(msg) async def on_llm_new_token( self, diff --git a/libs/core/langchain_core/callbacks/manager.py b/libs/core/langchain_core/callbacks/manager.py index 604e17c10af..58340be1ed9 100644 --- a/libs/core/langchain_core/callbacks/manager.py +++ b/libs/core/langchain_core/callbacks/manager.py @@ -1510,11 +1510,12 @@ class CallbackManager(BaseCallbackManager): .. versionadded:: 0.2.14 """ if kwargs: - raise ValueError( + msg = ( "The dispatcher API does not accept additional keyword arguments." "Please do not pass any additional keyword arguments, instead " "include them in the data field." ) + raise ValueError(msg) if run_id is None: run_id = uuid.uuid4() @@ -1989,11 +1990,12 @@ class AsyncCallbackManager(BaseCallbackManager): run_id = uuid.uuid4() if kwargs: - raise ValueError( + msg = ( "The dispatcher API does not accept additional keyword arguments." "Please do not pass any additional keyword arguments, instead " "include them in the data field." ) + raise ValueError(msg) await ahandle_event( self.handlers, "on_custom_event", @@ -2336,11 +2338,12 @@ def _configure( if v1_tracing_enabled_ and not tracing_v2_enabled_: # if both are enabled, can silently ignore the v1 tracer - raise RuntimeError( + msg = ( "Tracing using LangChainTracerV1 is no longer supported. " "Please set the LANGCHAIN_TRACING_V2 environment variable to enable " "tracing instead." ) + raise RuntimeError(msg) tracer_project = _get_tracer_project() debug = _get_debug() @@ -2519,13 +2522,14 @@ async def adispatch_custom_event( # within a tool or a lambda and have the metadata events associated # with the parent run rather than have a new run id generated for each. if callback_manager.parent_run_id is None: - raise RuntimeError( + msg = ( "Unable to dispatch an adhoc event without a parent run id." "This function can only be called from within an existing run (e.g.," "inside a tool or a RunnableLambda or a RunnableGenerator.)" "If you are doing that and still seeing this error, try explicitly" "passing the config parameter to this function." ) + raise RuntimeError(msg) await callback_manager.on_custom_event( name, @@ -2588,13 +2592,14 @@ def dispatch_custom_event( # within a tool or a lambda and have the metadata events associated # with the parent run rather than have a new run id generated for each. if callback_manager.parent_run_id is None: - raise RuntimeError( + msg = ( "Unable to dispatch an adhoc event without a parent run id." "This function can only be called from within an existing run (e.g.," "inside a tool or a RunnableLambda or a RunnableGenerator.)" "If you are doing that and still seeing this error, try explicitly" "passing the config parameter to this function." ) + raise RuntimeError(msg) callback_manager.on_custom_event( name, data, diff --git a/libs/core/langchain_core/chat_history.py b/libs/core/langchain_core/chat_history.py index 9b3eb09b03a..4a579b4a985 100644 --- a/libs/core/langchain_core/chat_history.py +++ b/libs/core/langchain_core/chat_history.py @@ -157,10 +157,11 @@ class BaseChatMessageHistory(ABC): # method, so we should use it. self.add_messages([message]) else: - raise NotImplementedError( + msg = ( "add_message is not implemented for this class. " "Please implement add_message or add_messages." ) + raise NotImplementedError(msg) def add_messages(self, messages: Sequence[BaseMessage]) -> None: """Add a list of messages. diff --git a/libs/core/langchain_core/document_loaders/base.py b/libs/core/langchain_core/document_loaders/base.py index 540ef888c3a..2f458731916 100644 --- a/libs/core/langchain_core/document_loaders/base.py +++ b/libs/core/langchain_core/document_loaders/base.py @@ -53,11 +53,12 @@ class BaseLoader(ABC): # noqa: B024 try: from langchain_text_splitters import RecursiveCharacterTextSplitter except ImportError as e: - raise ImportError( + msg = ( "Unable to import from langchain_text_splitters. Please specify " "text_splitter or install langchain_text_splitters with " "`pip install -U langchain-text-splitters`." - ) from e + ) + raise ImportError(msg) from e _text_splitter: TextSplitter = RecursiveCharacterTextSplitter() else: @@ -71,9 +72,8 @@ class BaseLoader(ABC): # noqa: B024 """A lazy loader for Documents.""" if type(self).load != BaseLoader.load: return iter(self.load()) - raise NotImplementedError( - f"{self.__class__.__name__} does not implement lazy_load()" - ) + msg = f"{self.__class__.__name__} does not implement lazy_load()" + raise NotImplementedError(msg) async def alazy_load(self) -> AsyncIterator[Document]: """A lazy loader for Documents.""" diff --git a/libs/core/langchain_core/documents/base.py b/libs/core/langchain_core/documents/base.py index e83e012a545..2adfe1a7183 100644 --- a/libs/core/langchain_core/documents/base.py +++ b/libs/core/langchain_core/documents/base.py @@ -142,7 +142,8 @@ class Blob(BaseMedia): def check_blob_is_valid(cls, values: dict[str, Any]) -> Any: """Verify that either data or path is provided.""" if "data" not in values and "path" not in values: - raise ValueError("Either data or path must be provided") + msg = "Either data or path must be provided" + raise ValueError(msg) return values def as_string(self) -> str: @@ -155,7 +156,8 @@ class Blob(BaseMedia): elif isinstance(self.data, str): return self.data else: - raise ValueError(f"Unable to get string for blob {self}") + msg = f"Unable to get string for blob {self}" + raise ValueError(msg) def as_bytes(self) -> bytes: """Read data as bytes.""" @@ -167,7 +169,8 @@ class Blob(BaseMedia): with open(str(self.path), "rb") as f: return f.read() else: - raise ValueError(f"Unable to get bytes for blob {self}") + msg = f"Unable to get bytes for blob {self}" + raise ValueError(msg) @contextlib.contextmanager def as_bytes_io(self) -> Generator[Union[BytesIO, BufferedReader], None, None]: @@ -178,7 +181,8 @@ class Blob(BaseMedia): with open(str(self.path), "rb") as f: yield f else: - raise NotImplementedError(f"Unable to convert blob {self}") + msg = f"Unable to convert blob {self}" + raise NotImplementedError(msg) @classmethod def from_path( diff --git a/libs/core/langchain_core/exceptions.py b/libs/core/langchain_core/exceptions.py index c7ab7419f2a..f10197b0466 100644 --- a/libs/core/langchain_core/exceptions.py +++ b/libs/core/langchain_core/exceptions.py @@ -41,10 +41,11 @@ class OutputParserException(ValueError, LangChainException): # noqa: N818 ): super().__init__(error) if send_to_llm and (observation is None or llm_output is None): - raise ValueError( + msg = ( "Arguments 'observation' & 'llm_output'" " are required if 'send_to_llm' is True" ) + raise ValueError(msg) self.observation = observation self.llm_output = llm_output self.send_to_llm = send_to_llm diff --git a/libs/core/langchain_core/indexing/api.py b/libs/core/langchain_core/indexing/api.py index 26566b1be80..63226ba366a 100644 --- a/libs/core/langchain_core/indexing/api.py +++ b/libs/core/langchain_core/indexing/api.py @@ -73,20 +73,22 @@ class _HashedDocument(Document): for key in forbidden_keys: if key in metadata: - raise ValueError( + msg = ( f"Metadata cannot contain key {key} as it " f"is reserved for internal use." ) + raise ValueError(msg) content_hash = str(_hash_string_to_uuid(content)) try: metadata_hash = str(_hash_nested_dict_to_uuid(metadata)) except Exception as e: - raise ValueError( + msg = ( f"Failed to hash metadata: {e}. " f"Please use a dict that can be serialized using json." - ) from e + ) + raise ValueError(msg) from e values["content_hash"] = content_hash values["metadata_hash"] = metadata_hash @@ -154,10 +156,11 @@ def _get_source_id_assigner( elif callable(source_id_key): return source_id_key else: - raise ValueError( + msg = ( f"source_id_key should be either None, a string or a callable. " f"Got {source_id_key} of type {type(source_id_key)}." ) + raise ValueError(msg) def _deduplicate_in_order( @@ -269,13 +272,15 @@ def index( ValueError: If source_id_key is not None, but is not a string or callable. """ if cleanup not in {"incremental", "full", None}: - raise ValueError( + msg = ( f"cleanup should be one of 'incremental', 'full' or None. " f"Got {cleanup}." ) + raise ValueError(msg) if cleanup == "incremental" and source_id_key is None: - raise ValueError("Source id key is required when cleanup mode is incremental.") + msg = "Source id key is required when cleanup mode is incremental." + raise ValueError(msg) destination = vector_store # Renaming internally for clarity @@ -286,21 +291,24 @@ def index( for method in methods: if not hasattr(destination, method): - raise ValueError( + msg = ( f"Vectorstore {destination} does not have required method {method}" ) + raise ValueError(msg) if type(destination).delete == VectorStore.delete: # Checking if the vectorstore has overridden the default delete method # implementation which just raises a NotImplementedError - raise ValueError("Vectorstore has not implemented the delete method") + msg = "Vectorstore has not implemented the delete method" + raise ValueError(msg) elif isinstance(destination, DocumentIndex): pass else: - raise TypeError( + msg = ( f"Vectorstore should be either a VectorStore or a DocumentIndex. " f"Got {type(destination)}." ) + raise TypeError(msg) if isinstance(docs_source, BaseLoader): try: @@ -334,12 +342,13 @@ def index( # If the cleanup mode is incremental, source ids are required. for source_id, hashed_doc in zip(source_ids, hashed_docs): if source_id is None: - raise ValueError( + msg = ( "Source ids are required when cleanup mode is incremental. " f"Document that starts with " f"content: {hashed_doc.page_content[:100]} was not assigned " f"as source id." ) + raise ValueError(msg) # source ids cannot be None after for loop above. source_ids = cast(Sequence[str], source_ids) # type: ignore[assignment] @@ -400,7 +409,8 @@ def index( # mypy isn't good enough to determine that source ids cannot be None # here due to a check that's happening above, so we check again. if any(source_id is None for source_id in source_ids): - raise AssertionError("Source ids cannot be if cleanup=='incremental'.") + msg = "Source ids cannot be if cleanup=='incremental'." + raise AssertionError(msg) indexed_source_ids = cast( Sequence[str], [source_id_assigner(doc) for doc in docs_to_index] @@ -514,13 +524,15 @@ async def aindex( """ if cleanup not in {"incremental", "full", None}: - raise ValueError( + msg = ( f"cleanup should be one of 'incremental', 'full' or None. " f"Got {cleanup}." ) + raise ValueError(msg) if cleanup == "incremental" and source_id_key is None: - raise ValueError("Source id key is required when cleanup mode is incremental.") + msg = "Source id key is required when cleanup mode is incremental." + raise ValueError(msg) destination = vector_store # Renaming internally for clarity @@ -532,21 +544,24 @@ async def aindex( for method in methods: if not hasattr(destination, method): - raise ValueError( + msg = ( f"Vectorstore {destination} does not have required method {method}" ) + raise ValueError(msg) if type(destination).adelete == VectorStore.adelete: # Checking if the vectorstore has overridden the default delete method # implementation which just raises a NotImplementedError - raise ValueError("Vectorstore has not implemented the delete method") + msg = "Vectorstore has not implemented the delete method" + raise ValueError(msg) elif isinstance(destination, DocumentIndex): pass else: - raise TypeError( + msg = ( f"Vectorstore should be either a VectorStore or a DocumentIndex. " f"Got {type(destination)}." ) + raise TypeError(msg) async_doc_iterator: AsyncIterator[Document] if isinstance(docs_source, BaseLoader): try: @@ -588,12 +603,13 @@ async def aindex( # If the cleanup mode is incremental, source ids are required. for source_id, hashed_doc in zip(source_ids, hashed_docs): if source_id is None: - raise ValueError( + msg = ( "Source ids are required when cleanup mode is incremental. " f"Document that starts with " f"content: {hashed_doc.page_content[:100]} was not assigned " f"as source id." ) + raise ValueError(msg) # source ids cannot be None after for loop above. source_ids = cast(Sequence[str], source_ids) @@ -654,7 +670,8 @@ async def aindex( # mypy isn't good enough to determine that source ids cannot be None # here due to a check that's happening above, so we check again. if any(source_id is None for source_id in source_ids): - raise AssertionError("Source ids cannot be if cleanup=='incremental'.") + msg = "Source ids cannot be if cleanup=='incremental'." + raise AssertionError(msg) indexed_source_ids = cast( Sequence[str], [source_id_assigner(doc) for doc in docs_to_index] diff --git a/libs/core/langchain_core/indexing/base.py b/libs/core/langchain_core/indexing/base.py index 824263415bd..d9418de7408 100644 --- a/libs/core/langchain_core/indexing/base.py +++ b/libs/core/langchain_core/indexing/base.py @@ -290,11 +290,13 @@ class InMemoryRecordManager(RecordManager): """ if group_ids and len(keys) != len(group_ids): - raise ValueError("Length of keys must match length of group_ids") + msg = "Length of keys must match length of group_ids" + raise ValueError(msg) for index, key in enumerate(keys): group_id = group_ids[index] if group_ids else None if time_at_least and time_at_least > self.get_time(): - raise ValueError("time_at_least must be in the past") + msg = "time_at_least must be in the past" + raise ValueError(msg) self.records[key] = {"group_id": group_id, "updated_at": self.get_time()} async def aupdate( diff --git a/libs/core/langchain_core/indexing/in_memory.py b/libs/core/langchain_core/indexing/in_memory.py index 4983ecfe1bf..7fd7adec664 100644 --- a/libs/core/langchain_core/indexing/in_memory.py +++ b/libs/core/langchain_core/indexing/in_memory.py @@ -47,7 +47,8 @@ class InMemoryDocumentIndex(DocumentIndex): def delete(self, ids: Optional[list[str]] = None, **kwargs: Any) -> DeleteResponse: """Delete by ID.""" if ids is None: - raise ValueError("IDs must be provided for deletion") + msg = "IDs must be provided for deletion" + raise ValueError(msg) ok_ids = [] diff --git a/libs/core/langchain_core/language_models/base.py b/libs/core/langchain_core/language_models/base.py index 93ebe523d89..d1ac7891d85 100644 --- a/libs/core/langchain_core/language_models/base.py +++ b/libs/core/langchain_core/language_models/base.py @@ -60,11 +60,12 @@ def get_tokenizer() -> Any: try: from transformers import GPT2TokenizerFast # type: ignore[import] except ImportError as e: - raise ImportError( + msg = ( "Could not import transformers python package. " "This is needed in order to calculate get_token_ids. " "Please install it with `pip install transformers`." - ) from e + ) + raise ImportError(msg) from e # create a GPT-2 tokenizer instance return GPT2TokenizerFast.from_pretrained("gpt2") diff --git a/libs/core/langchain_core/language_models/chat_models.py b/libs/core/langchain_core/language_models/chat_models.py index 05af1f9ac60..ad238eda459 100644 --- a/libs/core/langchain_core/language_models/chat_models.py +++ b/libs/core/langchain_core/language_models/chat_models.py @@ -89,7 +89,8 @@ def generate_from_stream(stream: Iterator[ChatGenerationChunk]) -> ChatResult: if generation: generation += list(stream) if generation is None: - raise ValueError("No generations found in stream.") + msg = "No generations found in stream." + raise ValueError(msg) return ChatResult( generations=[ ChatGeneration( @@ -265,10 +266,11 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): elif isinstance(input, Sequence): return ChatPromptValue(messages=convert_to_messages(input)) else: - raise ValueError( + msg = ( f"Invalid input type {type(input)}. " "Must be a PromptValue, str, or list of BaseMessages." ) + raise ValueError(msg) def invoke( self, @@ -817,9 +819,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): elif self.cache is None: pass else: - raise ValueError( - "Asked to cache, but no cache found at `langchain.cache`." - ) + msg = "Asked to cache, but no cache found at `langchain.cache`." + raise ValueError(msg) # Apply the rate limiter after checking the cache, since # we usually don't want to rate limit cache lookups, but @@ -891,9 +892,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): elif self.cache is None: pass else: - raise ValueError( - "Asked to cache, but no cache found at `langchain.cache`." - ) + msg = "Asked to cache, but no cache found at `langchain.cache`." + raise ValueError(msg) # Apply the rate limiter after checking the cache, since # we usually don't want to rate limit cache lookups, but @@ -1020,7 +1020,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): if isinstance(generation, ChatGeneration): return generation.message else: - raise ValueError("Unexpected generation type") + msg = "Unexpected generation type" + raise ValueError(msg) async def _call_async( self, @@ -1036,7 +1037,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): if isinstance(generation, ChatGeneration): return generation.message else: - raise ValueError("Unexpected generation type") + msg = "Unexpected generation type" + raise ValueError(msg) @deprecated("0.1.7", alternative="invoke", removal="1.0") def call_as_llm( @@ -1053,7 +1055,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): if isinstance(result.content, str): return result.content else: - raise ValueError("Cannot use predict when output is not a string.") + msg = "Cannot use predict when output is not a string." + raise ValueError(msg) @deprecated("0.1.7", alternative="invoke", removal="1.0") def predict_messages( @@ -1077,7 +1080,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): if isinstance(result.content, str): return result.content else: - raise ValueError("Cannot use predict when output is not a string.") + msg = "Cannot use predict when output is not a string." + raise ValueError(msg) @deprecated("0.1.7", alternative="ainvoke", removal="1.0") async def apredict_messages( @@ -1220,7 +1224,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): # } """ # noqa: E501 if kwargs: - raise ValueError(f"Received unsupported arguments {kwargs}") + msg = f"Received unsupported arguments {kwargs}" + raise ValueError(msg) from langchain_core.output_parsers.openai_tools import ( JsonOutputKeyToolsParser, @@ -1228,9 +1233,8 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): ) if self.bind_tools is BaseChatModel.bind_tools: - raise NotImplementedError( - "with_structured_output is not implemented for this model." - ) + msg = "with_structured_output is not implemented for this model." + raise NotImplementedError(msg) llm = self.bind_tools([schema], tool_choice="any") if isinstance(schema, type) and is_basemodel_subclass(schema): output_parser: OutputParserLike = PydanticToolsParser( diff --git a/libs/core/langchain_core/language_models/fake_chat_models.py b/libs/core/langchain_core/language_models/fake_chat_models.py index 8dc4e55695c..95d605b7cb4 100644 --- a/libs/core/langchain_core/language_models/fake_chat_models.py +++ b/libs/core/langchain_core/language_models/fake_chat_models.py @@ -238,18 +238,20 @@ class GenericFakeChatModel(BaseChatModel): messages, stop=stop, run_manager=run_manager, **kwargs ) if not isinstance(chat_result, ChatResult): - raise ValueError( + msg = ( f"Expected generate to return a ChatResult, " f"but got {type(chat_result)} instead." ) + raise ValueError(msg) message = chat_result.generations[0].message if not isinstance(message, AIMessage): - raise ValueError( + msg = ( f"Expected invoke to return an AIMessage, " f"but got {type(message)} instead." ) + raise ValueError(msg) content = message.content diff --git a/libs/core/langchain_core/language_models/llms.py b/libs/core/langchain_core/language_models/llms.py index 44f7afd60ff..c247078a3a8 100644 --- a/libs/core/langchain_core/language_models/llms.py +++ b/libs/core/langchain_core/language_models/llms.py @@ -135,15 +135,17 @@ def _resolve_cache(cache: Union[BaseCache, bool, None]) -> Optional[BaseCache]: elif cache is True: llm_cache = get_llm_cache() if llm_cache is None: - raise ValueError( + msg = ( "No global cache was configured. Use `set_llm_cache`." "to set a global cache if you want to use a global cache." "Otherwise either pass a cache object or set cache to False/None" ) + raise ValueError(msg) elif cache is False: llm_cache = None else: - raise ValueError(f"Unsupported cache value {cache}") + msg = f"Unsupported cache value {cache}" + raise ValueError(msg) return llm_cache @@ -332,10 +334,11 @@ class BaseLLM(BaseLanguageModel[str], ABC): elif isinstance(input, Sequence): return ChatPromptValue(messages=convert_to_messages(input)) else: - raise ValueError( + msg = ( f"Invalid input type {type(input)}. " "Must be a PromptValue, str, or list of BaseMessages." ) + raise ValueError(msg) def _get_ls_params( self, @@ -842,10 +845,11 @@ class BaseLLM(BaseLanguageModel[str], ABC): prompt and additional model provider-specific output. """ if not isinstance(prompts, list): - raise ValueError( + msg = ( "Argument 'prompts' is expected to be of type List[str], received" f" argument of type {type(prompts)}." ) + raise ValueError(msg) # Create callback managers if isinstance(metadata, list): metadata = [ @@ -989,10 +993,11 @@ class BaseLLM(BaseLanguageModel[str], ABC): return [None] * len(prompts) if isinstance(run_id, list): if len(run_id) != len(prompts): - raise ValueError( + msg = ( "Number of manually provided run_id's does not match batch length." f" {len(run_id)} != {len(prompts)}" ) + raise ValueError(msg) return run_id return [run_id] + [None] * (len(prompts) - 1) @@ -1262,11 +1267,12 @@ class BaseLLM(BaseLanguageModel[str], ABC): ValueError: If the prompt is not a string. """ if not isinstance(prompt, str): - raise ValueError( + msg = ( "Argument `prompt` is expected to be a string. Instead found " f"{type(prompt)}. If you want to run the LLM on multiple prompts, use " "`generate` instead." ) + raise ValueError(msg) return ( self.generate( [prompt], @@ -1387,7 +1393,8 @@ class BaseLLM(BaseLanguageModel[str], ABC): with open(file_path, "w") as f: yaml.dump(prompt_dict, f, default_flow_style=False) else: - raise ValueError(f"{save_path} must be json or yaml") + msg = f"{save_path} must be json or yaml" + raise ValueError(msg) class LLM(BaseLLM): diff --git a/libs/core/langchain_core/load/dump.py b/libs/core/langchain_core/load/dump.py index dbc723d41e0..00fae99d528 100644 --- a/libs/core/langchain_core/load/dump.py +++ b/libs/core/langchain_core/load/dump.py @@ -37,7 +37,8 @@ def dumps(obj: Any, *, pretty: bool = False, **kwargs: Any) -> str: ValueError: If `default` is passed as a kwarg. """ if "default" in kwargs: - raise ValueError("`default` should not be passed to dumps") + msg = "`default` should not be passed to dumps" + raise ValueError(msg) try: if pretty: indent = kwargs.pop("indent", 2) diff --git a/libs/core/langchain_core/load/load.py b/libs/core/langchain_core/load/load.py index 875ddf92f90..80f13f25394 100644 --- a/libs/core/langchain_core/load/load.py +++ b/libs/core/langchain_core/load/load.py @@ -96,17 +96,19 @@ class Reviver: else: if self.secrets_from_env and key in os.environ and os.environ[key]: return os.environ[key] - raise KeyError(f'Missing key "{key}" in load(secrets_map)') + msg = f'Missing key "{key}" in load(secrets_map)' + raise KeyError(msg) if ( value.get("lc") == 1 and value.get("type") == "not_implemented" and value.get("id") is not None ): - raise NotImplementedError( + msg = ( "Trying to load an object that doesn't implement " f"serialization: {value}" ) + raise NotImplementedError(msg) if ( value.get("lc") == 1 @@ -121,7 +123,8 @@ class Reviver: # The root namespace ["langchain"] is not a valid identifier. or namespace == ["langchain"] ): - raise ValueError(f"Invalid namespace: {value}") + msg = f"Invalid namespace: {value}" + raise ValueError(msg) # Has explicit import path. elif mapping_key in self.import_mappings: import_path = self.import_mappings[mapping_key] @@ -130,11 +133,12 @@ class Reviver: # Import module mod = importlib.import_module(".".join(import_dir)) elif namespace[0] in DISALLOW_LOAD_FROM_PATH: - raise ValueError( + msg = ( "Trying to deserialize something that cannot " "be deserialized in current version of langchain-core: " f"{mapping_key}." ) + raise ValueError(msg) # Otherwise, treat namespace as path. else: mod = importlib.import_module(".".join(namespace)) @@ -143,7 +147,8 @@ class Reviver: # The class must be a subclass of Serializable. if not issubclass(cls, Serializable): - raise ValueError(f"Invalid namespace: {value}") + msg = f"Invalid namespace: {value}" + raise ValueError(msg) # We don't need to recurse on kwargs # as json.loads will do that for us. diff --git a/libs/core/langchain_core/load/serializable.py b/libs/core/langchain_core/load/serializable.py index 02d410adb85..b5e7d8b9150 100644 --- a/libs/core/langchain_core/load/serializable.py +++ b/libs/core/langchain_core/load/serializable.py @@ -215,11 +215,12 @@ class Serializable(BaseModel, ABC): for attr in deprecated_attributes: if hasattr(cls, attr): - raise ValueError( + msg = ( f"Class {self.__class__} has a deprecated " f"attribute {attr}. Please use the corresponding " f"classmethod instead." ) + raise ValueError(msg) # Get a reference to self bound to each class in the MRO this = cast(Serializable, self if cls is None else super(cls, self)) diff --git a/libs/core/langchain_core/messages/ai.py b/libs/core/langchain_core/messages/ai.py index dece1e575ee..63036baf048 100644 --- a/libs/core/langchain_core/messages/ai.py +++ b/libs/core/langchain_core/messages/ai.py @@ -373,7 +373,8 @@ class AIMessageChunk(AIMessage, BaseMessageChunk): ) ) else: - raise ValueError("Malformed args.") + msg = "Malformed args." + raise ValueError(msg) except Exception: invalid_tool_calls.append( create_invalid_tool_call( @@ -402,9 +403,8 @@ def add_ai_message_chunks( ) -> AIMessageChunk: """Add multiple AIMessageChunks together.""" if any(left.example != o.example for o in others): - raise ValueError( - "Cannot concatenate AIMessageChunks with different example values." - ) + msg = "Cannot concatenate AIMessageChunks with different example values." + raise ValueError(msg) content = merge_content(left.content, *(o.content for o in others)) additional_kwargs = merge_dicts( diff --git a/libs/core/langchain_core/messages/base.py b/libs/core/langchain_core/messages/base.py index bf020f3fbff..9eab1ed431a 100644 --- a/libs/core/langchain_core/messages/base.py +++ b/libs/core/langchain_core/messages/base.py @@ -223,11 +223,12 @@ class BaseMessageChunk(BaseMessage): response_metadata=response_metadata, ) else: - raise TypeError( + msg = ( 'unsupported operand type(s) for +: "' f"{self.__class__.__name__}" f'" and "{other.__class__.__name__}"' ) + raise TypeError(msg) def message_to_dict(message: BaseMessage) -> dict: diff --git a/libs/core/langchain_core/messages/chat.py b/libs/core/langchain_core/messages/chat.py index 8bfbcc51536..73aafd8834e 100644 --- a/libs/core/langchain_core/messages/chat.py +++ b/libs/core/langchain_core/messages/chat.py @@ -48,9 +48,8 @@ class ChatMessageChunk(ChatMessage, BaseMessageChunk): def __add__(self, other: Any) -> BaseMessageChunk: # type: ignore if isinstance(other, ChatMessageChunk): if self.role != other.role: - raise ValueError( - "Cannot concatenate ChatMessageChunks with different roles." - ) + msg = "Cannot concatenate ChatMessageChunks with different roles." + raise ValueError(msg) return self.__class__( role=self.role, diff --git a/libs/core/langchain_core/messages/function.py b/libs/core/langchain_core/messages/function.py index f06fd4f3b65..080f5807788 100644 --- a/libs/core/langchain_core/messages/function.py +++ b/libs/core/langchain_core/messages/function.py @@ -54,9 +54,8 @@ class FunctionMessageChunk(FunctionMessage, BaseMessageChunk): def __add__(self, other: Any) -> BaseMessageChunk: # type: ignore if isinstance(other, FunctionMessageChunk): if self.name != other.name: - raise ValueError( - "Cannot concatenate FunctionMessageChunks with different names." - ) + msg = "Cannot concatenate FunctionMessageChunks with different names." + raise ValueError(msg) return self.__class__( name=self.name, diff --git a/libs/core/langchain_core/messages/modifier.py b/libs/core/langchain_core/messages/modifier.py index 8a5fb6860d8..a7face34fe9 100644 --- a/libs/core/langchain_core/messages/modifier.py +++ b/libs/core/langchain_core/messages/modifier.py @@ -20,7 +20,8 @@ class RemoveMessage(BaseMessage): ValueError: If the 'content' field is passed in kwargs. """ if kwargs.pop("content", None): - raise ValueError("RemoveMessage does not support 'content' field.") + msg = "RemoveMessage does not support 'content' field." + raise ValueError(msg) return super().__init__("", id=id, **kwargs) diff --git a/libs/core/langchain_core/messages/tool.py b/libs/core/langchain_core/messages/tool.py index 31d3f8b7056..653dd838f86 100644 --- a/libs/core/langchain_core/messages/tool.py +++ b/libs/core/langchain_core/messages/tool.py @@ -94,11 +94,12 @@ class ToolMessage(BaseMessage): try: values["content"] = str(content) except ValueError as e: - raise ValueError( + msg = ( "ToolMessage content should be a string or a list of string/dicts. " f"Received:\n\n{content=}\n\n which could not be coerced into a " "string." - ) from e + ) + raise ValueError(msg) from e elif isinstance(content, list): values["content"] = [] for i, x in enumerate(content): @@ -106,12 +107,13 @@ class ToolMessage(BaseMessage): try: values["content"].append(str(x)) except ValueError as e: - raise ValueError( + msg = ( "ToolMessage content should be a string or a list of " "string/dicts. Received a list but " f"element ToolMessage.content[{i}] is not a dict and could " f"not be coerced to a string.:\n\n{x}" - ) from e + ) + raise ValueError(msg) from e else: values["content"].append(x) else: @@ -147,9 +149,8 @@ class ToolMessageChunk(ToolMessage, BaseMessageChunk): def __add__(self, other: Any) -> BaseMessageChunk: # type: ignore if isinstance(other, ToolMessageChunk): if self.tool_call_id != other.tool_call_id: - raise ValueError( - "Cannot concatenate ToolMessageChunks with different names." - ) + msg = "Cannot concatenate ToolMessageChunks with different names." + raise ValueError(msg) return self.__class__( tool_call_id=self.tool_call_id, diff --git a/libs/core/langchain_core/messages/utils.py b/libs/core/langchain_core/messages/utils.py index d6092530831..8f88502c1df 100644 --- a/libs/core/langchain_core/messages/utils.py +++ b/libs/core/langchain_core/messages/utils.py @@ -51,10 +51,11 @@ def _get_type(v: Any) -> str: elif hasattr(v, "type"): return v.type else: - raise TypeError( + msg = ( f"Expected either a dictionary with a 'type' key or an object " f"with a 'type' attribute. Instead got type {type(v)}." ) + raise TypeError(msg) AnyMessage = Annotated[ @@ -120,7 +121,8 @@ def get_buffer_string( elif isinstance(m, ChatMessage): role = m.role else: - raise ValueError(f"Got unsupported message type: {m}") + msg = f"Got unsupported message type: {m}" + raise ValueError(msg) message = f"{role}: {m.content}" if isinstance(m, AIMessage) and "function_call" in m.additional_kwargs: message += f"{m.additional_kwargs['function_call']}" @@ -158,7 +160,8 @@ def _message_from_dict(message: dict) -> BaseMessage: elif _type == "ChatMessageChunk": return ChatMessageChunk(**message["data"]) else: - raise ValueError(f"Got unexpected message type: {_type}") + msg = f"Got unexpected message type: {_type}" + raise ValueError(msg) def messages_from_dict(messages: Sequence[dict]) -> list[BaseMessage]: @@ -266,10 +269,11 @@ def _create_message_from_message_type( elif message_type == "remove": message = RemoveMessage(**kwargs) else: - raise ValueError( + msg = ( f"Unexpected message type: '{message_type}'. Use one of 'human'," f" 'user', 'ai', 'assistant', 'function', 'tool', or 'system'." ) + raise ValueError(msg) return message @@ -312,14 +316,14 @@ def _convert_to_message(message: MessageLikeRepresentation) -> BaseMessage: # None msg content is not allowed msg_content = msg_kwargs.pop("content") or "" except KeyError as e: - raise ValueError( - f"Message dict must contain 'role' and 'content' keys, got {message}" - ) from e + msg = f"Message dict must contain 'role' and 'content' keys, got {message}" + raise ValueError(msg) from e _message = _create_message_from_message_type( msg_type, msg_content, **msg_kwargs ) else: - raise NotImplementedError(f"Unsupported message type: {type(message)}") + msg = f"Unsupported message type: {type(message)}" + raise NotImplementedError(msg) return _message @@ -820,11 +824,12 @@ def trim_messages( else: list_token_counter = token_counter # type: ignore[assignment] else: - raise ValueError( + msg = ( f"'token_counter' expected to be a model that implements " f"'get_num_tokens_from_messages()' or a function. Received object of type " f"{type(token_counter)}." ) + raise ValueError(msg) try: from langchain_text_splitters import TextSplitter @@ -859,9 +864,8 @@ def trim_messages( text_splitter=text_splitter_fn, ) else: - raise ValueError( - f"Unrecognized {strategy=}. Supported strategies are 'last' and 'first'." - ) + msg = f"Unrecognized {strategy=}. Supported strategies are 'last' and 'first'." + raise ValueError(msg) def _first_max_tokens( @@ -995,10 +999,11 @@ def _msg_to_chunk(message: BaseMessage) -> BaseMessageChunk: if isinstance(message, msg_cls): return chunk_cls(**message.model_dump(exclude={"type"})) - raise ValueError( + msg = ( f"Unrecognized message class {message.__class__}. Supported classes are " f"{list(_MSG_CHUNK_MAP.keys())}" ) + raise ValueError(msg) def _chunk_to_msg(chunk: BaseMessageChunk) -> BaseMessage: @@ -1010,10 +1015,11 @@ def _chunk_to_msg(chunk: BaseMessageChunk) -> BaseMessage: if isinstance(chunk, chunk_cls): return msg_cls(**chunk.model_dump(exclude={"type", "tool_call_chunks"})) - raise ValueError( + msg = ( f"Unrecognized message chunk class {chunk.__class__}. Supported classes are " f"{list(_CHUNK_MSG_MAP.keys())}" ) + raise ValueError(msg) def _default_text_splitter(text: str) -> list[str]: diff --git a/libs/core/langchain_core/output_parsers/base.py b/libs/core/langchain_core/output_parsers/base.py index 9c132b4a0bf..9d080cef300 100644 --- a/libs/core/langchain_core/output_parsers/base.py +++ b/libs/core/langchain_core/output_parsers/base.py @@ -177,10 +177,11 @@ class BaseOutputParser( if "args" in metadata and len(metadata["args"]) > 0: return metadata["args"][0] - raise TypeError( + msg = ( f"Runnable {self.__class__.__name__} doesn't have an inferable OutputType. " "Override the OutputType property to specify the output type." ) + raise TypeError(msg) def invoke( self, @@ -310,10 +311,11 @@ class BaseOutputParser( @property def _type(self) -> str: """Return the output parser type for serialization.""" - raise NotImplementedError( + msg = ( f"_type property is not implemented in class {self.__class__.__name__}." " This is required for serialization." ) + raise NotImplementedError(msg) def dict(self, **kwargs: Any) -> dict: """Return dictionary representation of output parser.""" diff --git a/libs/core/langchain_core/output_parsers/openai_functions.py b/libs/core/langchain_core/output_parsers/openai_functions.py index 460333953ae..d61533855fd 100644 --- a/libs/core/langchain_core/output_parsers/openai_functions.py +++ b/libs/core/langchain_core/output_parsers/openai_functions.py @@ -36,16 +36,14 @@ class OutputFunctionsParser(BaseGenerationOutputParser[Any]): """ generation = result[0] if not isinstance(generation, ChatGeneration): - raise OutputParserException( - "This output parser can only be used with a chat generation." - ) + msg = "This output parser can only be used with a chat generation." + raise OutputParserException(msg) message = generation.message try: func_call = copy.deepcopy(message.additional_kwargs["function_call"]) except KeyError as exc: - raise OutputParserException( - f"Could not parse function call: {exc}" - ) from exc + msg = f"Could not parse function call: {exc}" + raise OutputParserException(msg) from exc if self.args_only: return func_call["arguments"] @@ -88,14 +86,12 @@ class JsonOutputFunctionsParser(BaseCumulativeTransformOutputParser[Any]): """ if len(result) != 1: - raise OutputParserException( - f"Expected exactly one result, but got {len(result)}" - ) + msg = f"Expected exactly one result, but got {len(result)}" + raise OutputParserException(msg) generation = result[0] if not isinstance(generation, ChatGeneration): - raise OutputParserException( - "This output parser can only be used with a chat generation." - ) + msg = "This output parser can only be used with a chat generation." + raise OutputParserException(msg) message = generation.message try: function_call = message.additional_kwargs["function_call"] @@ -103,9 +99,8 @@ class JsonOutputFunctionsParser(BaseCumulativeTransformOutputParser[Any]): if partial: return None else: - raise OutputParserException( - f"Could not parse function call: {exc}" - ) from exc + msg = f"Could not parse function call: {exc}" + raise OutputParserException(msg) from exc try: if partial: try: @@ -129,9 +124,8 @@ class JsonOutputFunctionsParser(BaseCumulativeTransformOutputParser[Any]): function_call["arguments"], strict=self.strict ) except (json.JSONDecodeError, TypeError) as exc: - raise OutputParserException( - f"Could not parse function call data: {exc}" - ) from exc + msg = f"Could not parse function call data: {exc}" + raise OutputParserException(msg) from exc else: try: return { @@ -141,9 +135,8 @@ class JsonOutputFunctionsParser(BaseCumulativeTransformOutputParser[Any]): ), } except (json.JSONDecodeError, TypeError) as exc: - raise OutputParserException( - f"Could not parse function call data: {exc}" - ) from exc + msg = f"Could not parse function call data: {exc}" + raise OutputParserException(msg) from exc except KeyError: return None @@ -253,10 +246,11 @@ class PydanticOutputFunctionsParser(OutputFunctionsParser): and issubclass(schema, BaseModel) ) elif values["args_only"] and isinstance(schema, dict): - raise ValueError( + msg = ( "If multiple pydantic schemas are provided then args_only should be" " False." ) + raise ValueError(msg) return values def parse_result(self, result: list[Generation], *, partial: bool = False) -> Any: diff --git a/libs/core/langchain_core/output_parsers/openai_tools.py b/libs/core/langchain_core/output_parsers/openai_tools.py index a51f0d77657..9e768e5da44 100644 --- a/libs/core/langchain_core/output_parsers/openai_tools.py +++ b/libs/core/langchain_core/output_parsers/openai_tools.py @@ -52,11 +52,12 @@ def parse_tool_call( raw_tool_call["function"]["arguments"], strict=strict ) except JSONDecodeError as e: - raise OutputParserException( + msg = ( f"Function {raw_tool_call['function']['name']} arguments:\n\n" f"{raw_tool_call['function']['arguments']}\n\nare not valid JSON. " f"Received JSONDecodeError {e}" - ) from e + ) + raise OutputParserException(msg) from e parsed = { "name": raw_tool_call["function"]["name"] or "", "args": function_args or {}, @@ -170,9 +171,8 @@ class JsonOutputToolsParser(BaseCumulativeTransformOutputParser[Any]): generation = result[0] if not isinstance(generation, ChatGeneration): - raise OutputParserException( - "This output parser can only be used with a chat generation." - ) + msg = "This output parser can only be used with a chat generation." + raise OutputParserException(msg) message = generation.message if isinstance(message, AIMessage) and message.tool_calls: tool_calls = [dict(tc) for tc in message.tool_calls] @@ -285,10 +285,11 @@ class PydanticToolsParser(JsonOutputToolsParser): for res in json_results: try: if not isinstance(res["args"], dict): - raise ValueError( + msg = ( f"Tool arguments must be specified as a dict, received: " f"{res['args']}" ) + raise ValueError(msg) pydantic_objects.append(name_dict[res["type"]](**res["args"])) except (ValidationError, ValueError) as e: if partial: diff --git a/libs/core/langchain_core/output_parsers/pydantic.py b/libs/core/langchain_core/output_parsers/pydantic.py index fb6e3dcd717..844fc9a7038 100644 --- a/libs/core/langchain_core/output_parsers/pydantic.py +++ b/libs/core/langchain_core/output_parsers/pydantic.py @@ -29,10 +29,9 @@ class PydanticOutputParser(JsonOutputParser, Generic[TBaseModel]): elif issubclass(self.pydantic_object, pydantic.v1.BaseModel): return self.pydantic_object.parse_obj(obj) else: - raise OutputParserException( - f"Unsupported model version for PydanticOutputParser: \ + msg = f"Unsupported model version for PydanticOutputParser: \ {self.pydantic_object.__class__}" - ) + raise OutputParserException(msg) except (pydantic.ValidationError, pydantic.v1.ValidationError) as e: raise self._parser_exception(e, obj) from e else: # pydantic v1 diff --git a/libs/core/langchain_core/output_parsers/xml.py b/libs/core/langchain_core/output_parsers/xml.py index f476faf3137..3df9750f8e0 100644 --- a/libs/core/langchain_core/output_parsers/xml.py +++ b/libs/core/langchain_core/output_parsers/xml.py @@ -49,11 +49,12 @@ class _StreamingParser: try: import defusedxml # type: ignore except ImportError as e: - raise ImportError( + msg = ( "defusedxml is not installed. " "Please install it to use the defusedxml parser." "You can install it with `pip install defusedxml` " - ) from e + ) + raise ImportError(msg) from e _parser = defusedxml.ElementTree.DefusedXMLParser(target=TreeBuilder()) else: _parser = None @@ -190,12 +191,13 @@ class XMLOutputParser(BaseTransformOutputParser): try: from defusedxml import ElementTree # type: ignore except ImportError as e: - raise ImportError( + msg = ( "defusedxml is not installed. " "Please install it to use the defusedxml parser." "You can install it with `pip install defusedxml`" "See https://github.com/tiran/defusedxml for more details" - ) from e + ) + raise ImportError(msg) from e _et = ElementTree # Use the defusedxml parser else: _et = ET # Use the standard library parser diff --git a/libs/core/langchain_core/outputs/chat_generation.py b/libs/core/langchain_core/outputs/chat_generation.py index 599283e60e5..d40e1fd5362 100644 --- a/libs/core/langchain_core/outputs/chat_generation.py +++ b/libs/core/langchain_core/outputs/chat_generation.py @@ -65,7 +65,8 @@ class ChatGeneration(Generation): pass self.text = text except (KeyError, AttributeError) as e: - raise ValueError("Error while initializing ChatGeneration") from e + msg = "Error while initializing ChatGeneration" + raise ValueError(msg) from e return self @classmethod @@ -114,6 +115,7 @@ class ChatGenerationChunk(ChatGeneration): generation_info=generation_info or None, ) else: - raise TypeError( + msg = ( f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" ) + raise TypeError(msg) diff --git a/libs/core/langchain_core/outputs/generation.py b/libs/core/langchain_core/outputs/generation.py index bfd0cd70d75..ce2dd363902 100644 --- a/libs/core/langchain_core/outputs/generation.py +++ b/libs/core/langchain_core/outputs/generation.py @@ -64,6 +64,7 @@ class GenerationChunk(Generation): generation_info=generation_info or None, ) else: - raise TypeError( + msg = ( f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" ) + raise TypeError(msg) diff --git a/libs/core/langchain_core/prompts/base.py b/libs/core/langchain_core/prompts/base.py index f6932d6060a..e399974a5b0 100644 --- a/libs/core/langchain_core/prompts/base.py +++ b/libs/core/langchain_core/prompts/base.py @@ -70,21 +70,22 @@ class BasePromptTemplate( def validate_variable_names(self) -> Self: """Validate variable names do not include restricted names.""" if "stop" in self.input_variables: - raise ValueError( + msg = ( "Cannot have an input variable named 'stop', as it is used internally," " please rename." ) + raise ValueError(msg) if "stop" in self.partial_variables: - raise ValueError( + msg = ( "Cannot have an partial variable named 'stop', as it is used " "internally, please rename." ) + raise ValueError(msg) overall = set(self.input_variables).intersection(self.partial_variables) if overall: - raise ValueError( - f"Found overlapping input and partial variables: {overall}" - ) + msg = f"Found overlapping input and partial variables: {overall}" + raise ValueError(msg) return self @classmethod @@ -143,10 +144,11 @@ class BasePromptTemplate( inner_input = {var_name: inner_input} else: - raise TypeError( + msg = ( f"Expected mapping type as input to {self.__class__.__name__}. " f"Received {type(inner_input)}." ) + raise TypeError(msg) missing = set(self.input_variables).difference(inner_input) if missing: msg = ( @@ -341,12 +343,14 @@ class BasePromptTemplate( prompt.save(file_path="path/prompt.yaml") """ if self.partial_variables: - raise ValueError("Cannot save prompt with partial variables.") + msg = "Cannot save prompt with partial variables." + raise ValueError(msg) # Fetch dictionary to save prompt_dict = self.dict() if "_type" not in prompt_dict: - raise NotImplementedError(f"Prompt {self} does not support saving.") + msg = f"Prompt {self} does not support saving." + raise NotImplementedError(msg) # Convert file to Path object. save_path = Path(file_path) if isinstance(file_path, str) else file_path @@ -361,7 +365,8 @@ class BasePromptTemplate( with open(file_path, "w") as f: yaml.dump(prompt_dict, f, default_flow_style=False) else: - raise ValueError(f"{save_path} must be json or yaml") + msg = f"{save_path} must be json or yaml" + raise ValueError(msg) def _get_document_info(doc: Document, prompt: BasePromptTemplate[str]) -> dict: @@ -371,11 +376,12 @@ def _get_document_info(doc: Document, prompt: BasePromptTemplate[str]) -> dict: required_metadata = [ iv for iv in prompt.input_variables if iv != "page_content" ] - raise ValueError( + msg = ( f"Document prompt requires documents to have metadata variables: " f"{required_metadata}. Received document with missing metadata: " f"{list(missing_metadata)}." ) + raise ValueError(msg) return {k: base_info[k] for k in prompt.input_variables} diff --git a/libs/core/langchain_core/prompts/chat.py b/libs/core/langchain_core/prompts/chat.py index 201f916ff07..e3771ab40a6 100644 --- a/libs/core/langchain_core/prompts/chat.py +++ b/libs/core/langchain_core/prompts/chat.py @@ -236,10 +236,11 @@ class MessagesPlaceholder(BaseMessagePromptTemplate): else kwargs[self.variable_name] ) if not isinstance(value, list): - raise ValueError( + msg = ( f"variable {self.variable_name} should be a list of base messages, " f"got {value} of type {type(value)}" ) + raise ValueError(msg) value = convert_to_messages(value) if self.n_messages: value = value[-self.n_messages :] @@ -514,9 +515,8 @@ class _StringImageMessagePromptTemplate(BaseMessagePromptTemplate): return cls(prompt=prompt, **kwargs) elif isinstance(template, list): if (partial_variables is not None) and len(partial_variables) > 0: - raise ValueError( - "Partial variables are not supported for list of templates." - ) + msg = "Partial variables are not supported for list of templates." + raise ValueError(msg) prompt = [] for tmpl in template: if isinstance(tmpl, str) or isinstance(tmpl, dict) and "text" in tmpl: @@ -536,11 +536,12 @@ class _StringImageMessagePromptTemplate(BaseMessagePromptTemplate): vars = get_template_variables(img_template, "f-string") if vars: if len(vars) > 1: - raise ValueError( + msg = ( "Only one format variable allowed per image" f" template.\nGot: {vars}" f"\nFrom: {tmpl}" ) + raise ValueError(msg) input_variables = [vars[0]] img_template = {"url": img_template} img_template_obj = ImagePromptTemplate( @@ -559,13 +560,16 @@ class _StringImageMessagePromptTemplate(BaseMessagePromptTemplate): input_variables=input_variables, template=img_template ) else: - raise ValueError(f"Invalid image template: {tmpl}") + msg = f"Invalid image template: {tmpl}" + raise ValueError(msg) prompt.append(img_template_obj) else: - raise ValueError(f"Invalid template: {tmpl}") + msg = f"Invalid template: {tmpl}" + raise ValueError(msg) return cls(prompt=prompt, **kwargs) else: - raise ValueError(f"Invalid template: {template}") + msg = f"Invalid template: {template}" + raise ValueError(msg) @classmethod def from_template_file( @@ -1042,7 +1046,8 @@ class ChatPromptTemplate(BaseChatPromptTemplate): prompt = HumanMessagePromptTemplate.from_template(other) return ChatPromptTemplate(messages=self.messages + [prompt]) # type: ignore[call-arg] else: - raise NotImplementedError(f"Unsupported operand type for +: {type(other)}") + msg = f"Unsupported operand type for +: {type(other)}" + raise NotImplementedError(msg) @model_validator(mode="before") @classmethod @@ -1085,11 +1090,12 @@ class ChatPromptTemplate(BaseChatPromptTemplate): input_vars = input_vars - optional_variables if "input_variables" in values and values.get("validate_template"): if input_vars != set(values["input_variables"]): - raise ValueError( + msg = ( "Got mismatched input_variables. " f"Expected: {input_vars}. " f"Got: {values['input_variables']}" ) + raise ValueError(msg) else: values["input_variables"] = sorted(input_vars) if optional_variables: @@ -1214,7 +1220,8 @@ class ChatPromptTemplate(BaseChatPromptTemplate): message = message_template.format_messages(**kwargs) result.extend(message) else: - raise ValueError(f"Unexpected input: {message_template}") + msg = f"Unexpected input: {message_template}" + raise ValueError(msg) return result async def aformat_messages(self, **kwargs: Any) -> list[BaseMessage]: @@ -1241,7 +1248,8 @@ class ChatPromptTemplate(BaseChatPromptTemplate): message = await message_template.aformat_messages(**kwargs) result.extend(message) else: - raise ValueError(f"Unexpected input: {message_template}") + msg = f"Unexpected input: {message_template}" + raise ValueError(msg) return result def partial(self, **kwargs: Any) -> ChatPromptTemplate: @@ -1376,38 +1384,43 @@ def _create_template_from_message_type( elif message_type == "placeholder": if isinstance(template, str): if template[0] != "{" or template[-1] != "}": - raise ValueError( + msg = ( f"Invalid placeholder template: {template}." " Expected a variable name surrounded by curly braces." ) + raise ValueError(msg) var_name = template[1:-1] message = MessagesPlaceholder(variable_name=var_name, optional=True) elif len(template) == 2 and isinstance(template[1], bool): var_name_wrapped, is_optional = template if not isinstance(var_name_wrapped, str): - raise ValueError( + msg = ( "Expected variable name to be a string." f" Got: {var_name_wrapped}" ) + raise ValueError(msg) if var_name_wrapped[0] != "{" or var_name_wrapped[-1] != "}": - raise ValueError( + msg = ( f"Invalid placeholder template: {var_name_wrapped}." " Expected a variable name surrounded by curly braces." ) + raise ValueError(msg) var_name = var_name_wrapped[1:-1] message = MessagesPlaceholder(variable_name=var_name, optional=is_optional) else: - raise ValueError( + msg = ( "Unexpected arguments for placeholder message type." " Expected either a single string variable name" " or a list of [variable_name: str, is_optional: bool]." f" Got: {template}" ) + raise ValueError(msg) else: - raise ValueError( + msg = ( f"Unexpected message type: {message_type}. Use one of 'human'," f" 'user', 'ai', 'assistant', or 'system'." ) + raise ValueError(msg) return message @@ -1448,7 +1461,8 @@ def _convert_to_message( ) elif isinstance(message, tuple): if len(message) != 2: - raise ValueError(f"Expected 2-tuple of (role, template), got {message}") + msg = f"Expected 2-tuple of (role, template), got {message}" + raise ValueError(msg) message_type_str, template = message if isinstance(message_type_str, str): _message = _create_template_from_message_type( @@ -1461,6 +1475,7 @@ def _convert_to_message( ) ) else: - raise NotImplementedError(f"Unsupported message type: {type(message)}") + msg = f"Unsupported message type: {type(message)}" + raise NotImplementedError(msg) return _message diff --git a/libs/core/langchain_core/prompts/few_shot.py b/libs/core/langchain_core/prompts/few_shot.py index d02c885aa85..54c004c23d6 100644 --- a/libs/core/langchain_core/prompts/few_shot.py +++ b/libs/core/langchain_core/prompts/few_shot.py @@ -62,14 +62,12 @@ class _FewShotPromptTemplateMixin(BaseModel): examples = values.get("examples") example_selector = values.get("example_selector") if examples and example_selector: - raise ValueError( - "Only one of 'examples' and 'example_selector' should be provided" - ) + msg = "Only one of 'examples' and 'example_selector' should be provided" + raise ValueError(msg) if examples is None and example_selector is None: - raise ValueError( - "One of 'examples' and 'example_selector' should be provided" - ) + msg = "One of 'examples' and 'example_selector' should be provided" + raise ValueError(msg) return values @@ -90,9 +88,8 @@ class _FewShotPromptTemplateMixin(BaseModel): elif self.example_selector is not None: return self.example_selector.select_examples(kwargs) else: - raise ValueError( - "One of 'examples' and 'example_selector' should be provided" - ) + msg = "One of 'examples' and 'example_selector' should be provided" + raise ValueError(msg) async def _aget_examples(self, **kwargs: Any) -> list[dict]: """Async get the examples to use for formatting the prompt. @@ -111,9 +108,8 @@ class _FewShotPromptTemplateMixin(BaseModel): elif self.example_selector is not None: return await self.example_selector.aselect_examples(kwargs) else: - raise ValueError( - "One of 'examples' and 'example_selector' should be provided" - ) + msg = "One of 'examples' and 'example_selector' should be provided" + raise ValueError(msg) class FewShotPromptTemplate(_FewShotPromptTemplateMixin, StringPromptTemplate): @@ -243,7 +239,8 @@ class FewShotPromptTemplate(_FewShotPromptTemplateMixin, StringPromptTemplate): ValueError: If example_selector is provided. """ if self.example_selector: - raise ValueError("Saving an example selector is not currently supported") + msg = "Saving an example selector is not currently supported" + raise ValueError(msg) return super().save(file_path) diff --git a/libs/core/langchain_core/prompts/few_shot_with_templates.py b/libs/core/langchain_core/prompts/few_shot_with_templates.py index 75e6344aa7a..f293aae1c80 100644 --- a/libs/core/langchain_core/prompts/few_shot_with_templates.py +++ b/libs/core/langchain_core/prompts/few_shot_with_templates.py @@ -54,14 +54,12 @@ class FewShotPromptWithTemplates(StringPromptTemplate): examples = values.get("examples") example_selector = values.get("example_selector") if examples and example_selector: - raise ValueError( - "Only one of 'examples' and 'example_selector' should be provided" - ) + msg = "Only one of 'examples' and 'example_selector' should be provided" + raise ValueError(msg) if examples is None and example_selector is None: - raise ValueError( - "One of 'examples' and 'example_selector' should be provided" - ) + msg = "One of 'examples' and 'example_selector' should be provided" + raise ValueError(msg) return values @@ -76,10 +74,11 @@ class FewShotPromptWithTemplates(StringPromptTemplate): expected_input_variables |= set(self.prefix.input_variables) missing_vars = expected_input_variables.difference(input_variables) if missing_vars: - raise ValueError( + msg = ( f"Got input_variables={input_variables}, but based on " f"prefix/suffix expected {expected_input_variables}" ) + raise ValueError(msg) else: self.input_variables = sorted( set(self.suffix.input_variables) @@ -216,5 +215,6 @@ class FewShotPromptWithTemplates(StringPromptTemplate): ValueError: If example_selector is provided. """ if self.example_selector: - raise ValueError("Saving an example selector is not currently supported") + msg = "Saving an example selector is not currently supported" + raise ValueError(msg) return super().save(file_path) diff --git a/libs/core/langchain_core/prompts/image.py b/libs/core/langchain_core/prompts/image.py index c898dac31cf..5e76cea59de 100644 --- a/libs/core/langchain_core/prompts/image.py +++ b/libs/core/langchain_core/prompts/image.py @@ -20,11 +20,12 @@ class ImagePromptTemplate(BasePromptTemplate[ImageURL]): overlap = set(kwargs["input_variables"]) & {"url", "path", "detail"} if overlap: - raise ValueError( + msg = ( "input_variables for the image template cannot contain" " any of 'url', 'path', or 'detail'." f" Found: {overlap}" ) + raise ValueError(msg) super().__init__(**kwargs) @property @@ -91,13 +92,16 @@ class ImagePromptTemplate(BasePromptTemplate[ImageURL]): path = kwargs.get("path") or formatted.get("path") detail = kwargs.get("detail") or formatted.get("detail") if not url and not path: - raise ValueError("Must provide either url or path.") + msg = "Must provide either url or path." + raise ValueError(msg) if not url: if not isinstance(path, str): - raise ValueError("path must be a string.") + msg = "path must be a string." + raise ValueError(msg) url = image_utils.image_to_data_url(path) if not isinstance(url, str): - raise ValueError("url must be a string.") + msg = "url must be a string." + raise ValueError(msg) output: ImageURL = {"url": url} if detail: # Don't check literal values here: let the API check them diff --git a/libs/core/langchain_core/prompts/loading.py b/libs/core/langchain_core/prompts/loading.py index 39fce9fc301..3d65f8323f1 100644 --- a/libs/core/langchain_core/prompts/loading.py +++ b/libs/core/langchain_core/prompts/loading.py @@ -34,7 +34,8 @@ def load_prompt_from_config(config: dict) -> BasePromptTemplate: config_type = config.pop("_type", "prompt") if config_type not in type_to_loader_dict: - raise ValueError(f"Loading {config_type} prompt not supported") + msg = f"Loading {config_type} prompt not supported" + raise ValueError(msg) prompt_loader = type_to_loader_dict[config_type] return prompt_loader(config) @@ -46,9 +47,8 @@ def _load_template(var_name: str, config: dict) -> dict: if f"{var_name}_path" in config: # If it does, make sure template variable doesn't also exist. if var_name in config: - raise ValueError( - f"Both `{var_name}_path` and `{var_name}` cannot be provided." - ) + msg = f"Both `{var_name}_path` and `{var_name}` cannot be provided." + raise ValueError(msg) # Pop the template path from the config. template_path = Path(config.pop(f"{var_name}_path")) # Load the template. @@ -73,12 +73,12 @@ def _load_examples(config: dict) -> dict: elif config["examples"].endswith((".yaml", ".yml")): examples = yaml.safe_load(f) else: - raise ValueError( - "Invalid file format. Only json or yaml formats are supported." - ) + msg = "Invalid file format. Only json or yaml formats are supported." + raise ValueError(msg) config["examples"] = examples else: - raise ValueError("Invalid examples format. Only list or string are supported.") + msg = "Invalid examples format. Only list or string are supported." + raise ValueError(msg) return config @@ -90,7 +90,8 @@ def _load_output_parser(config: dict) -> dict: if output_parser_type == "default": output_parser = StrOutputParser(**_config) else: - raise ValueError(f"Unsupported output parser {output_parser_type}") + msg = f"Unsupported output parser {output_parser_type}" + raise ValueError(msg) config["output_parser"] = output_parser return config @@ -103,10 +104,11 @@ def _load_few_shot_prompt(config: dict) -> FewShotPromptTemplate: # Load the example prompt. if "example_prompt_path" in config: if "example_prompt" in config: - raise ValueError( + msg = ( "Only one of example_prompt and example_prompt_path should " "be specified." ) + raise ValueError(msg) config["example_prompt"] = load_prompt(config.pop("example_prompt_path")) else: config["example_prompt"] = load_prompt_from_config(config["example_prompt"]) @@ -126,11 +128,12 @@ def _load_prompt(config: dict) -> PromptTemplate: if template_format == "jinja2": # Disabled due to: # https://github.com/langchain-ai/langchain/issues/4394 - raise ValueError( + msg = ( f"Loading templates with '{template_format}' format is no longer supported " f"since it can lead to arbitrary code execution. Please migrate to using " f"the 'f-string' template format, which does not suffer from this issue." ) + raise ValueError(msg) return PromptTemplate(**config) @@ -151,11 +154,12 @@ def load_prompt( RuntimeError: If the path is a Lang Chain Hub path. """ if isinstance(path, str) and path.startswith("lc://"): - raise RuntimeError( + msg = ( "Loading from the deprecated github-based Hub is no longer supported. " "Please use the new LangChain Hub at https://smith.langchain.com/hub " "instead." ) + raise RuntimeError(msg) return _load_prompt_from_file(path, encoding) @@ -173,7 +177,8 @@ def _load_prompt_from_file( with open(file_path, encoding=encoding) as f: config = yaml.safe_load(f) else: - raise ValueError(f"Got unsupported file type {file_path.suffix}") + msg = f"Got unsupported file type {file_path.suffix}" + raise ValueError(msg) # Load the prompt from the config now. return load_prompt_from_config(config) @@ -186,7 +191,8 @@ def _load_chat_prompt(config: dict) -> ChatPromptTemplate: config.pop("input_variables") if not template: - raise ValueError("Can't load chat prompt without template") + msg = "Can't load chat prompt without template" + raise ValueError(msg) return ChatPromptTemplate.from_template(template=template, **config) diff --git a/libs/core/langchain_core/prompts/prompt.py b/libs/core/langchain_core/prompts/prompt.py index 7008be58839..5c52ef36d07 100644 --- a/libs/core/langchain_core/prompts/prompt.py +++ b/libs/core/langchain_core/prompts/prompt.py @@ -89,12 +89,12 @@ class PromptTemplate(StringPromptTemplate): if values.get("validate_template"): if values["template_format"] == "mustache": - raise ValueError("Mustache templates cannot be validated.") + msg = "Mustache templates cannot be validated." + raise ValueError(msg) if "input_variables" not in values: - raise ValueError( - "Input variables must be provided to validate the template." - ) + msg = "Input variables must be provided to validate the template." + raise ValueError(msg) all_inputs = values["input_variables"] + list(values["partial_variables"]) check_valid_template( @@ -131,13 +131,11 @@ class PromptTemplate(StringPromptTemplate): # Allow for easy combining if isinstance(other, PromptTemplate): if self.template_format != "f-string": - raise ValueError( - "Adding prompt templates only supported for f-strings." - ) + msg = "Adding prompt templates only supported for f-strings." + raise ValueError(msg) if other.template_format != "f-string": - raise ValueError( - "Adding prompt templates only supported for f-strings." - ) + msg = "Adding prompt templates only supported for f-strings." + raise ValueError(msg) input_variables = list( set(self.input_variables) | set(other.input_variables) ) @@ -147,7 +145,8 @@ class PromptTemplate(StringPromptTemplate): partial_variables = dict(self.partial_variables.items()) for k, v in other.partial_variables.items(): if k in partial_variables: - raise ValueError("Cannot have same variable partialed twice.") + msg = "Cannot have same variable partialed twice." + raise ValueError(msg) else: partial_variables[k] = v return PromptTemplate( @@ -161,7 +160,8 @@ class PromptTemplate(StringPromptTemplate): prompt = PromptTemplate.from_template(other) return self + prompt else: - raise NotImplementedError(f"Unsupported operand type for +: {type(other)}") + msg = f"Unsupported operand type for +: {type(other)}" + raise NotImplementedError(msg) @property def _prompt_type(self) -> str: diff --git a/libs/core/langchain_core/prompts/string.py b/libs/core/langchain_core/prompts/string.py index cb46d452aac..01c19486b67 100644 --- a/libs/core/langchain_core/prompts/string.py +++ b/libs/core/langchain_core/prompts/string.py @@ -42,13 +42,14 @@ def jinja2_formatter(template: str, /, **kwargs: Any) -> str: try: from jinja2.sandbox import SandboxedEnvironment except ImportError as e: - raise ImportError( + msg = ( "jinja2 not installed, which is needed to use the jinja2_formatter. " "Please install it with `pip install jinja2`." "Please be cautious when using jinja2 templates. " "Do not expand jinja2 templates using unverified or user-controlled " "inputs as that can result in arbitrary Python code execution." - ) from e + ) + raise ImportError(msg) from e # This uses a sandboxed environment to prevent arbitrary code execution. # Jinja2 uses an opt-out rather than opt-in approach for sand-boxing. @@ -89,10 +90,11 @@ def _get_jinja2_variables_from_template(template: str) -> set[str]: try: from jinja2 import Environment, meta except ImportError as e: - raise ImportError( + msg = ( "jinja2 not installed, which is needed to use the jinja2_formatter. " "Please install it with `pip install jinja2`." - ) from e + ) + raise ImportError(msg) from e env = Environment() ast = env.parse(template) variables = meta.find_undeclared_variables(ast) @@ -217,17 +219,19 @@ def check_valid_template( try: validator_func = DEFAULT_VALIDATOR_MAPPING[template_format] except KeyError as exc: - raise ValueError( + msg = ( f"Invalid template format {template_format!r}, should be one of" f" {list(DEFAULT_FORMATTER_MAPPING)}." - ) from exc + ) + raise ValueError(msg) from exc try: validator_func(template, input_variables) except (KeyError, IndexError) as exc: - raise ValueError( + msg = ( "Invalid prompt schema; check for mismatched or missing input parameters" f" from {input_variables}." - ) from exc + ) + raise ValueError(msg) from exc def get_template_variables(template: str, template_format: str) -> list[str]: @@ -253,7 +257,8 @@ def get_template_variables(template: str, template_format: str) -> list[str]: elif template_format == "mustache": input_variables = mustache_template_vars(template) else: - raise ValueError(f"Unsupported template format: {template_format}") + msg = f"Unsupported template format: {template_format}" + raise ValueError(msg) return sorted(input_variables) diff --git a/libs/core/langchain_core/prompts/structured.py b/libs/core/langchain_core/prompts/structured.py index 03fefcee021..360f14ccf2f 100644 --- a/libs/core/langchain_core/prompts/structured.py +++ b/libs/core/langchain_core/prompts/structured.py @@ -156,6 +156,5 @@ class StructuredPrompt(ChatPromptTemplate): name=name, ) else: - raise NotImplementedError( - "Structured prompts need to be piped to a language model." - ) + msg = "Structured prompts need to be piped to a language model." + raise NotImplementedError(msg) diff --git a/libs/core/langchain_core/runnables/base.py b/libs/core/langchain_core/runnables/base.py index 5dd5d35d1d0..9f9a77bc705 100644 --- a/libs/core/langchain_core/runnables/base.py +++ b/libs/core/langchain_core/runnables/base.py @@ -292,10 +292,11 @@ class Runnable(Generic[Input, Output], ABC): if type_args and len(type_args) == 2: return type_args[0] - raise TypeError( + msg = ( f"Runnable {self.get_name()} doesn't have an inferable InputType. " "Override the InputType property to specify the input type." ) + raise TypeError(msg) @property def OutputType(self) -> type[Output]: # noqa: N802 @@ -313,10 +314,11 @@ class Runnable(Generic[Input, Output], ABC): if type_args and len(type_args) == 2: return type_args[1] - raise TypeError( + msg = ( f"Runnable {self.get_name()} doesn't have an inferable OutputType. " "Override the OutputType property to specify the output type." ) + raise TypeError(msg) @property def input_schema(self) -> type[BaseModel]: @@ -1379,9 +1381,8 @@ class Runnable(Generic[Input, Output], ABC): **kwargs, ) else: - raise NotImplementedError( - 'Only versions "v1" and "v2" of the schema is currently supported.' - ) + msg = 'Only versions "v1" and "v2" of the schema is currently supported.' + raise NotImplementedError(msg) async with aclosing(event_stream): async for event in event_stream: @@ -2513,10 +2514,11 @@ class RunnableSerializable(Serializable, Runnable[Input, Output]): for key in kwargs: if key not in self.model_fields: - raise ValueError( + msg = ( f"Configuration key {key} not found in {self}: " f"available keys are {self.model_fields.keys()}" ) + raise ValueError(msg) return RunnableConfigurableFields(default=self, fields=kwargs) @@ -2772,9 +2774,8 @@ class RunnableSequence(RunnableSerializable[Input, Output]): else: steps_flat.append(coerce_to_runnable(step)) if len(steps_flat) < 2: - raise ValueError( - f"RunnableSequence must have at least 2 steps, got {len(steps_flat)}" - ) + msg = f"RunnableSequence must have at least 2 steps, got {len(steps_flat)}" + raise ValueError(msg) super().__init__( # type: ignore[call-arg] first=steps_flat[0], middle=list(steps_flat[1:-1]), @@ -2923,7 +2924,8 @@ class RunnableSequence(RunnableSerializable[Input, Output]): step_graph.trim_last_node() step_first_node, _ = graph.extend(step_graph) if not step_first_node: - raise ValueError(f"Runnable {step} has no first node") + msg = f"Runnable {step} has no first node" + raise ValueError(msg) if current_last_node: graph.add_edge(current_last_node, step_first_node) @@ -3655,9 +3657,11 @@ class RunnableParallel(RunnableSerializable[Input, dict[str, Any]]): else: step_first_node, step_last_node = graph.extend(step_graph) if not step_first_node: - raise ValueError(f"Runnable {step} has no first node") + msg = f"Runnable {step} has no first node" + raise ValueError(msg) if not step_last_node: - raise ValueError(f"Runnable {step} has no last node") + msg = f"Runnable {step} has no last node" + raise ValueError(msg) graph.add_edge(input_node, step_first_node) graph.add_edge(step_last_node, output_node) @@ -4049,10 +4053,11 @@ class RunnableGenerator(Runnable[Input, Output]): self._transform = transform func_for_name = transform else: - raise TypeError( + msg = ( "Expected a generator function type for `transform`." f"Instead got an unsupported type: {type(transform)}" ) + raise TypeError(msg) try: self.name = name or func_for_name.__name__ @@ -4161,7 +4166,8 @@ class RunnableGenerator(Runnable[Input, Output]): **kwargs: Any, ) -> Iterator[Output]: if not hasattr(self, "_transform"): - raise NotImplementedError(f"{repr(self)} only supports async methods.") + msg = f"{repr(self)} only supports async methods." + raise NotImplementedError(msg) return self._transform_stream_with_config( input, self._transform, # type: ignore[arg-type] @@ -4192,7 +4198,8 @@ class RunnableGenerator(Runnable[Input, Output]): **kwargs: Any, ) -> AsyncIterator[Output]: if not hasattr(self, "_atransform"): - raise NotImplementedError(f"{repr(self)} only supports sync methods.") + msg = f"{repr(self)} only supports sync methods." + raise NotImplementedError(msg) return self._atransform_stream_with_config( input, self._atransform, config, **kwargs @@ -4320,21 +4327,23 @@ class RunnableLambda(Runnable[Input, Output]): if is_async_callable(func) or is_async_generator(func): if afunc is not None: - raise TypeError( + msg = ( "Func was provided as a coroutine function, but afunc was " "also provided. If providing both, func should be a regular " "function to avoid ambiguity." ) + raise TypeError(msg) self.afunc = func func_for_name = func elif callable(func): self.func = cast(Callable[[Input], Output], func) func_for_name = func else: - raise TypeError( + msg = ( "Expected a callable type for `func`." f"Instead got an unsupported type: {type(func)}" ) + raise TypeError(msg) try: if name is not None: @@ -4497,9 +4506,11 @@ class RunnableLambda(Runnable[Input, Output]): else: dep_first_node, dep_last_node = graph.extend(dep_graph) if not dep_first_node: - raise ValueError(f"Runnable {dep} has no first node") + msg = f"Runnable {dep} has no first node" + raise ValueError(msg) if not dep_last_node: - raise ValueError(f"Runnable {dep} has no last node") + msg = f"Runnable {dep} has no last node" + raise ValueError(msg) graph.add_edge(input_node, dep_first_node) graph.add_edge(dep_last_node, output_node) else: @@ -4560,9 +4571,10 @@ class RunnableLambda(Runnable[Input, Output]): if isinstance(output, Runnable): recursion_limit = config["recursion_limit"] if recursion_limit <= 0: - raise RecursionError( + msg = ( f"Recursion limit reached when invoking {self} with input {input}." ) + raise RecursionError(msg) output = output.invoke( input, patch_config( @@ -4659,9 +4671,10 @@ class RunnableLambda(Runnable[Input, Output]): if isinstance(output, Runnable): recursion_limit = config["recursion_limit"] if recursion_limit <= 0: - raise RecursionError( + msg = ( f"Recursion limit reached when invoking {self} with input {input}." ) + raise RecursionError(msg) output = await output.ainvoke( input, patch_config( @@ -4704,10 +4717,11 @@ class RunnableLambda(Runnable[Input, Output]): **kwargs, ) else: - raise TypeError( + msg = ( "Cannot invoke a coroutine function synchronously." "Use `ainvoke` instead." ) + raise TypeError(msg) async def ainvoke( self, @@ -4778,10 +4792,11 @@ class RunnableLambda(Runnable[Input, Output]): if isinstance(output, Runnable): recursion_limit = config["recursion_limit"] if recursion_limit <= 0: - raise RecursionError( + msg = ( f"Recursion limit reached when invoking " f"{self} with input {final}." ) + raise RecursionError(msg) for chunk in output.stream( final, patch_config( @@ -4809,10 +4824,11 @@ class RunnableLambda(Runnable[Input, Output]): **kwargs, ) else: - raise TypeError( + msg = ( "Cannot stream a coroutine function synchronously." "Use `astream` instead." ) + raise TypeError(msg) def stream( self, @@ -4849,10 +4865,11 @@ class RunnableLambda(Runnable[Input, Output]): afunc = self.afunc else: if inspect.isgeneratorfunction(self.func): - raise TypeError( + msg = ( "Cannot stream from a generator function asynchronously." "Use .stream() instead." ) + raise TypeError(msg) def func( input: Input, @@ -4899,10 +4916,11 @@ class RunnableLambda(Runnable[Input, Output]): if isinstance(output, Runnable): recursion_limit = config["recursion_limit"] if recursion_limit <= 0: - raise RecursionError( + msg = ( f"Recursion limit reached when invoking " f"{self} with input {final}." ) + raise RecursionError(msg) async for chunk in output.astream( final, patch_config( @@ -5061,9 +5079,8 @@ class RunnableEachBase(RunnableSerializable[list[Input], list[Output]]): **kwargs: Optional[Any], ) -> AsyncIterator[StreamEvent]: for _ in range(1): - raise NotImplementedError( - "RunnableEach does not support astream_events yet." - ) + msg = "RunnableEach does not support astream_events yet." + raise NotImplementedError(msg) yield @@ -5819,10 +5836,11 @@ def coerce_to_runnable(thing: RunnableLike) -> Runnable[Input, Output]: elif isinstance(thing, dict): return cast(Runnable[Input, Output], RunnableParallel(thing)) else: - raise TypeError( + msg = ( f"Expected a Runnable, callable or dict." f"Instead got an unsupported type: {type(thing)}" ) + raise TypeError(msg) @overload diff --git a/libs/core/langchain_core/runnables/branch.py b/libs/core/langchain_core/runnables/branch.py index b12fd416e03..56c43886189 100644 --- a/libs/core/langchain_core/runnables/branch.py +++ b/libs/core/langchain_core/runnables/branch.py @@ -92,7 +92,8 @@ class RunnableBranch(RunnableSerializable[Input, Output]): ValueError: If a branch is not of length 2. """ if len(branches) < 2: - raise ValueError("RunnableBranch requires at least two branches") + msg = "RunnableBranch requires at least two branches" + raise ValueError(msg) default = branches[-1] @@ -100,9 +101,8 @@ class RunnableBranch(RunnableSerializable[Input, Output]): default, (Runnable, Callable, Mapping), # type: ignore[arg-type] ): - raise TypeError( - "RunnableBranch default must be Runnable, callable or mapping." - ) + msg = "RunnableBranch default must be Runnable, callable or mapping." + raise TypeError(msg) default_ = cast( Runnable[Input, Output], coerce_to_runnable(cast(RunnableLike, default)) @@ -112,16 +112,18 @@ class RunnableBranch(RunnableSerializable[Input, Output]): for branch in branches[:-1]: if not isinstance(branch, (tuple, list)): # type: ignore[arg-type] - raise TypeError( + msg = ( f"RunnableBranch branches must be " f"tuples or lists, not {type(branch)}" ) + raise TypeError(msg) - if not len(branch) == 2: - raise ValueError( + if len(branch) != 2: + msg = ( f"RunnableBranch branches must be " f"tuples or lists of length 2, not {len(branch)}" ) + raise ValueError(msg) condition, runnable = branch condition = cast(Runnable[Input, bool], coerce_to_runnable(condition)) runnable = coerce_to_runnable(runnable) @@ -185,7 +187,8 @@ class RunnableBranch(RunnableSerializable[Input, Output]): and s.id.endswith(CONTEXT_CONFIG_SUFFIX_SET) for s in specs ): - raise ValueError("RunnableBranch cannot contain context setters.") + msg = "RunnableBranch cannot contain context setters." + raise ValueError(msg) return specs def invoke( diff --git a/libs/core/langchain_core/runnables/config.py b/libs/core/langchain_core/runnables/config.py index 15868dc269f..7c285137faf 100644 --- a/libs/core/langchain_core/runnables/config.py +++ b/libs/core/langchain_core/runnables/config.py @@ -219,12 +219,14 @@ def get_config_list( """ if length < 0: - raise ValueError(f"length must be >= 0, but got {length}") + msg = f"length must be >= 0, but got {length}" + raise ValueError(msg) if isinstance(config, Sequence) and len(config) != length: - raise ValueError( + msg = ( f"config must be a list of the same length as inputs, " f"but got {len(config)} configs for {length} inputs" ) + raise ValueError(msg) if isinstance(config, Sequence): return list(map(ensure_config, config)) diff --git a/libs/core/langchain_core/runnables/configurable.py b/libs/core/langchain_core/runnables/configurable.py index 8dc9495be27..35f976340ca 100644 --- a/libs/core/langchain_core/runnables/configurable.py +++ b/libs/core/langchain_core/runnables/configurable.py @@ -632,7 +632,8 @@ class RunnableConfigurableAlternatives(DynamicRunnable[Input, Output]): else: return (alt(), config) else: - raise ValueError(f"Unknown alternative: {which}") + msg = f"Unknown alternative: {which}" + raise ValueError(msg) def _strremoveprefix(s: str, prefix: str) -> str: diff --git a/libs/core/langchain_core/runnables/fallbacks.py b/libs/core/langchain_core/runnables/fallbacks.py index a08dc0b24f4..97d450015ea 100644 --- a/libs/core/langchain_core/runnables/fallbacks.py +++ b/libs/core/langchain_core/runnables/fallbacks.py @@ -152,10 +152,11 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None, **kwargs: Any ) -> Output: if self.exception_key is not None and not isinstance(input, dict): - raise ValueError( + msg = ( "If 'exception_key' is specified then input must be a dictionary." f"However found a type of {type(input)} for input" ) + raise ValueError(msg) # setup callbacks config = ensure_config(config) callback_manager = get_callback_manager_for_config(config) @@ -192,7 +193,8 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): run_manager.on_chain_end(output) return output if first_error is None: - raise ValueError("No error stored at end of fallbacks.") + msg = "No error stored at end of fallbacks." + raise ValueError(msg) run_manager.on_chain_error(first_error) raise first_error @@ -203,10 +205,11 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): **kwargs: Optional[Any], ) -> Output: if self.exception_key is not None and not isinstance(input, dict): - raise ValueError( + msg = ( "If 'exception_key' is specified then input must be a dictionary." f"However found a type of {type(input)} for input" ) + raise ValueError(msg) # setup callbacks config = ensure_config(config) callback_manager = get_async_callback_manager_for_config(config) @@ -243,7 +246,8 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): await run_manager.on_chain_end(output) return output if first_error is None: - raise ValueError("No error stored at end of fallbacks.") + msg = "No error stored at end of fallbacks." + raise ValueError(msg) await run_manager.on_chain_error(first_error) raise first_error @@ -260,10 +264,11 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): if self.exception_key is not None and not all( isinstance(input, dict) for input in inputs ): - raise ValueError( + msg = ( "If 'exception_key' is specified then inputs must be dictionaries." f"However found a type of {type(inputs[0])} for input" ) + raise ValueError(msg) if not inputs: return [] @@ -352,10 +357,11 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): if self.exception_key is not None and not all( isinstance(input, dict) for input in inputs ): - raise ValueError( + msg = ( "If 'exception_key' is specified then inputs must be dictionaries." f"However found a type of {type(inputs[0])} for input" ) + raise ValueError(msg) if not inputs: return [] @@ -447,10 +453,11 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): ) -> Iterator[Output]: """""" if self.exception_key is not None and not isinstance(input, dict): - raise ValueError( + msg = ( "If 'exception_key' is specified then input must be a dictionary." f"However found a type of {type(input)} for input" ) + raise ValueError(msg) # setup callbacks config = ensure_config(config) callback_manager = get_callback_manager_for_config(config) @@ -510,10 +517,11 @@ class RunnableWithFallbacks(RunnableSerializable[Input, Output]): **kwargs: Optional[Any], ) -> AsyncIterator[Output]: if self.exception_key is not None and not isinstance(input, dict): - raise ValueError( + msg = ( "If 'exception_key' is specified then input must be a dictionary." f"However found a type of {type(input)} for input" ) + raise ValueError(msg) # setup callbacks config = ensure_config(config) callback_manager = get_async_callback_manager_for_config(config) diff --git a/libs/core/langchain_core/runnables/graph.py b/libs/core/langchain_core/runnables/graph.py index baec005e5ac..fd2c8adb98b 100644 --- a/libs/core/langchain_core/runnables/graph.py +++ b/libs/core/langchain_core/runnables/graph.py @@ -330,7 +330,8 @@ class Graph: ValueError: If a node with the same id already exists. """ if id is not None and id in self.nodes: - raise ValueError(f"Node with id {id} already exists") + msg = f"Node with id {id} already exists" + raise ValueError(msg) id = id or self.next_id() node = Node(id=id, data=data, metadata=metadata, name=node_data_str(id, data)) self.nodes[node.id] = node @@ -371,9 +372,11 @@ class Graph: ValueError: If the source or target node is not in the graph. """ if source.id not in self.nodes: - raise ValueError(f"Source node {source.id} not in graph") + msg = f"Source node {source.id} not in graph" + raise ValueError(msg) if target.id not in self.nodes: - raise ValueError(f"Target node {target.id} not in graph") + msg = f"Target node {target.id} not in graph" + raise ValueError(msg) edge = Edge( source=source.id, target=target.id, data=data, conditional=conditional ) diff --git a/libs/core/langchain_core/runnables/graph_ascii.py b/libs/core/langchain_core/runnables/graph_ascii.py index bdd1b5e2e4d..f2a031ba43d 100644 --- a/libs/core/langchain_core/runnables/graph_ascii.py +++ b/libs/core/langchain_core/runnables/graph_ascii.py @@ -161,9 +161,8 @@ def _build_sugiyama_layout( route_with_lines, ) except ImportError as exc: - raise ImportError( - "Install grandalf to draw graphs: `pip install grandalf`." - ) from exc + msg = "Install grandalf to draw graphs: `pip install grandalf`." + raise ImportError(msg) from exc # # Just a reminder about naming conventions: diff --git a/libs/core/langchain_core/runnables/graph_mermaid.py b/libs/core/langchain_core/runnables/graph_mermaid.py index 175c53eb6a4..70b8e4865b5 100644 --- a/libs/core/langchain_core/runnables/graph_mermaid.py +++ b/libs/core/langchain_core/runnables/graph_mermaid.py @@ -104,11 +104,12 @@ def draw_mermaid( if prefix and not self_loop: subgraph = prefix.split(":")[-1] if subgraph in seen_subgraphs: - raise ValueError( + msg = ( f"Found duplicate subgraph '{subgraph}' -- this likely means that " "you're reusing a subgraph node with the same name. " "Please adjust your graph to have subgraph nodes with unique names." ) + raise ValueError(msg) seen_subgraphs.add(subgraph) mermaid_graph += f"\tsubgraph {subgraph}\n" @@ -214,10 +215,11 @@ def draw_mermaid_png( ) else: supported_methods = ", ".join([m.value for m in MermaidDrawMethod]) - raise ValueError( + msg = ( f"Invalid draw method: {draw_method}. " f"Supported draw methods are: {supported_methods}" ) + raise ValueError(msg) return img_bytes @@ -233,9 +235,8 @@ async def _render_mermaid_using_pyppeteer( try: from pyppeteer import launch # type: ignore[import] except ImportError as e: - raise ImportError( - "Install Pyppeteer to use the Pyppeteer method: `pip install pyppeteer`." - ) from e + msg = "Install Pyppeteer to use the Pyppeteer method: `pip install pyppeteer`." + raise ImportError(msg) from e browser = await launch() page = await browser.newPage() @@ -304,10 +305,11 @@ def _render_mermaid_using_api( try: import requests # type: ignore[import] except ImportError as e: - raise ImportError( + msg = ( "Install the `requests` module to use the Mermaid.INK API: " "`pip install requests`." - ) from e + ) + raise ImportError(msg) from e # Use Mermaid API to render the image mermaid_syntax_encoded = base64.b64encode(mermaid_syntax.encode("utf8")).decode( @@ -332,7 +334,8 @@ def _render_mermaid_using_api( return img_bytes else: - raise ValueError( + msg = ( f"Failed to render the graph using the Mermaid.INK API. " f"Status code: {response.status_code}." ) + raise ValueError(msg) diff --git a/libs/core/langchain_core/runnables/graph_png.py b/libs/core/langchain_core/runnables/graph_png.py index 9cd48b45949..4ce64ca6c1f 100644 --- a/libs/core/langchain_core/runnables/graph_png.py +++ b/libs/core/langchain_core/runnables/graph_png.py @@ -136,9 +136,8 @@ class PngDrawer: try: import pygraphviz as pgv # type: ignore[import] except ImportError as exc: - raise ImportError( - "Install pygraphviz to draw graphs: `pip install pygraphviz`." - ) from exc + msg = "Install pygraphviz to draw graphs: `pip install pygraphviz`." + raise ImportError(msg) from exc # Create a directed graph viz = pgv.AGraph(directed=True, nodesep=0.9, ranksep=1.0) diff --git a/libs/core/langchain_core/runnables/history.py b/libs/core/langchain_core/runnables/history.py index 71135513c5a..3d13da5a66d 100644 --- a/libs/core/langchain_core/runnables/history.py +++ b/libs/core/langchain_core/runnables/history.py @@ -472,16 +472,16 @@ class RunnableWithMessageHistory(RunnableBindingBase): # This occurs for chat models - since we batch inputs if isinstance(input_val[0], list): if len(input_val) != 1: - raise ValueError( - f"Expected a single list of messages. Got {input_val}." - ) + msg = f"Expected a single list of messages. Got {input_val}." + raise ValueError(msg) return input_val[0] return list(input_val) else: - raise ValueError( + msg = ( f"Expected str, BaseMessage, List[BaseMessage], or Tuple[BaseMessage]. " f"Got {input_val}." ) + raise ValueError(msg) def _get_output_messages( self, output_val: Union[str, BaseMessage, Sequence[BaseMessage], dict] @@ -513,10 +513,11 @@ class RunnableWithMessageHistory(RunnableBindingBase): elif isinstance(output_val, (list, tuple)): return list(output_val) else: - raise ValueError( + msg = ( f"Expected str, BaseMessage, List[BaseMessage], or Tuple[BaseMessage]. " f"Got {output_val}." ) + raise ValueError(msg) def _enter_history(self, input: Any, config: RunnableConfig) -> list[BaseMessage]: hist: BaseChatMessageHistory = config["configurable"]["message_history"] @@ -593,12 +594,13 @@ class RunnableWithMessageHistory(RunnableBindingBase): missing_key: "[your-value-here]" for missing_key in missing_keys } example_config = {"configurable": example_configurable} - raise ValueError( + msg = ( f"Missing keys {sorted(missing_keys)} in config['configurable'] " f"Expected keys are {sorted(expected_keys)}." f"When using via .invoke() or .stream(), pass in a config; " f"e.g., chain.invoke({example_input}, {example_config})" ) + raise ValueError(msg) if len(expected_keys) == 1: if parameter_names: @@ -613,10 +615,11 @@ class RunnableWithMessageHistory(RunnableBindingBase): else: # otherwise verify that names of keys patch and invoke by named arguments if set(expected_keys) != set(parameter_names): - raise ValueError( + msg = ( f"Expected keys {sorted(expected_keys)} do not match parameter " f"names {sorted(parameter_names)} of get_session_history." ) + raise ValueError(msg) message_history = self.get_session_history( **{key: configurable[key] for key in expected_keys} diff --git a/libs/core/langchain_core/runnables/router.py b/libs/core/langchain_core/runnables/router.py index c71cb85e4f7..8d353648cd9 100644 --- a/libs/core/langchain_core/runnables/router.py +++ b/libs/core/langchain_core/runnables/router.py @@ -101,7 +101,8 @@ class RouterRunnable(RunnableSerializable[RouterInput, Output]): key = input["key"] actual_input = input["input"] if key not in self.runnables: - raise ValueError(f"No runnable associated with key '{key}'") + msg = f"No runnable associated with key '{key}'" + raise ValueError(msg) runnable = self.runnables[key] return runnable.invoke(actual_input, config) @@ -115,7 +116,8 @@ class RouterRunnable(RunnableSerializable[RouterInput, Output]): key = input["key"] actual_input = input["input"] if key not in self.runnables: - raise ValueError(f"No runnable associated with key '{key}'") + msg = f"No runnable associated with key '{key}'" + raise ValueError(msg) runnable = self.runnables[key] return await runnable.ainvoke(actual_input, config) @@ -134,7 +136,8 @@ class RouterRunnable(RunnableSerializable[RouterInput, Output]): keys = [input["key"] for input in inputs] actual_inputs = [input["input"] for input in inputs] if any(key not in self.runnables for key in keys): - raise ValueError("One or more keys do not have a corresponding runnable") + msg = "One or more keys do not have a corresponding runnable" + raise ValueError(msg) def invoke( runnable: Runnable, input: Input, config: RunnableConfig @@ -169,7 +172,8 @@ class RouterRunnable(RunnableSerializable[RouterInput, Output]): keys = [input["key"] for input in inputs] actual_inputs = [input["input"] for input in inputs] if any(key not in self.runnables for key in keys): - raise ValueError("One or more keys do not have a corresponding runnable") + msg = "One or more keys do not have a corresponding runnable" + raise ValueError(msg) async def ainvoke( runnable: Runnable, input: Input, config: RunnableConfig @@ -201,7 +205,8 @@ class RouterRunnable(RunnableSerializable[RouterInput, Output]): key = input["key"] actual_input = input["input"] if key not in self.runnables: - raise ValueError(f"No runnable associated with key '{key}'") + msg = f"No runnable associated with key '{key}'" + raise ValueError(msg) runnable = self.runnables[key] yield from runnable.stream(actual_input, config) @@ -215,7 +220,8 @@ class RouterRunnable(RunnableSerializable[RouterInput, Output]): key = input["key"] actual_input = input["input"] if key not in self.runnables: - raise ValueError(f"No runnable associated with key '{key}'") + msg = f"No runnable associated with key '{key}'" + raise ValueError(msg) runnable = self.runnables[key] async for output in runnable.astream(actual_input, config): diff --git a/libs/core/langchain_core/runnables/utils.py b/libs/core/langchain_core/runnables/utils.py index 189207ff2e4..06168a176d0 100644 --- a/libs/core/langchain_core/runnables/utils.py +++ b/libs/core/langchain_core/runnables/utils.py @@ -639,10 +639,11 @@ def get_unique_config_specs( if len(others) == 0 or all(o == first for o in others): unique.append(first) else: - raise ValueError( + msg = ( "RunnableSequence contains conflicting config specs" f"for {id}: {[first] + others}" ) + raise ValueError(msg) return unique diff --git a/libs/core/langchain_core/structured_query.py b/libs/core/langchain_core/structured_query.py index 9c46278b77c..8aacbfbcc60 100644 --- a/libs/core/langchain_core/structured_query.py +++ b/libs/core/langchain_core/structured_query.py @@ -24,19 +24,21 @@ class Visitor(ABC): and self.allowed_operators is not None and func not in self.allowed_operators ): - raise ValueError( + msg = ( f"Received disallowed operator {func}. Allowed " f"comparators are {self.allowed_operators}" ) + raise ValueError(msg) if ( isinstance(func, Comparator) and self.allowed_comparators is not None and func not in self.allowed_comparators ): - raise ValueError( + msg = ( f"Received disallowed comparator {func}. Allowed " f"comparators are {self.allowed_comparators}" ) + raise ValueError(msg) @abstractmethod def visit_operation(self, operation: Operation) -> Any: diff --git a/libs/core/langchain_core/tools/base.py b/libs/core/langchain_core/tools/base.py index 85360f4171d..88c787558ff 100644 --- a/libs/core/langchain_core/tools/base.py +++ b/libs/core/langchain_core/tools/base.py @@ -127,9 +127,8 @@ def _validate_docstring_args_against_annotations( """Raise error if docstring arg is not in type annotations.""" for docstring_arg in arg_descriptions: if docstring_arg not in annotations: - raise ValueError( - f"Arg {docstring_arg} in docstring not found in function signature." - ) + msg = f"Arg {docstring_arg} in docstring not found in function signature." + raise ValueError(msg) def _infer_arg_descriptions( @@ -183,10 +182,11 @@ def _function_annotations_are_pydantic_v1( for parameter in signature.parameters.values() ) if any_v1_annotations and any_v2_annotations: - raise NotImplementedError( + msg = ( f"Function {func} contains a mix of Pydantic v1 and v2 annotations. " "Only one version of Pydantic annotations per function is supported." ) + raise NotImplementedError(msg) return any_v1_annotations and not any_v2_annotations @@ -335,7 +335,7 @@ class ChildTool(BaseTool): args_schema: Type[BaseModel] = SchemaClass ...""" name = cls.__name__ - raise SchemaAnnotationError( + msg = ( f"Tool definition for {name} must include valid type annotations" f" for argument 'args_schema' to behave as expected.\n" f"Expected annotation of 'Type[BaseModel]'" @@ -343,6 +343,7 @@ class ChildTool(BaseTool): f"Expected class looks like:\n" f"{typehint_mandate}" ) + raise SchemaAnnotationError(msg) name: str """The unique name of the tool that clearly communicates its purpose.""" @@ -422,10 +423,11 @@ class ChildTool(BaseTool): and kwargs["args_schema"] is not None and not is_basemodel_subclass(kwargs["args_schema"]) ): - raise TypeError( + msg = ( f"args_schema must be a subclass of pydantic BaseModel. " f"Got: {kwargs['args_schema']}." ) + raise TypeError(msg) super().__init__(**kwargs) model_config = ConfigDict( @@ -515,10 +517,11 @@ class ChildTool(BaseTool): result = input_args.parse_obj(tool_input) result_dict = result.dict() else: - raise NotImplementedError( + msg = ( "args_schema must be a Pydantic BaseModel, " f"got {self.args_schema}" ) + raise NotImplementedError(msg) return { k: getattr(result, k) for k, v in result_dict.items() @@ -653,12 +656,13 @@ class ChildTool(BaseTool): response = context.run(self._run, *tool_args, **tool_kwargs) if self.response_format == "content_and_artifact": if not isinstance(response, tuple) or len(response) != 2: - raise ValueError( + msg = ( "Since response_format='content_and_artifact' " "a two-tuple of the message content and raw tool output is " f"expected. Instead generated response of type: " f"{type(response)}." ) + raise ValueError(msg) content, artifact = response else: content = response @@ -769,12 +773,13 @@ class ChildTool(BaseTool): response = await coro if self.response_format == "content_and_artifact": if not isinstance(response, tuple) or len(response) != 2: - raise ValueError( + msg = ( "Since response_format='content_and_artifact' " "a two-tuple of the message content and raw tool output is " f"expected. Instead generated response of type: " f"{type(response)}." ) + raise ValueError(msg) content, artifact = response else: content = response @@ -825,10 +830,11 @@ def _handle_validation_error( elif callable(flag): content = flag(e) else: - raise ValueError( + msg = ( f"Got unexpected type of `handle_validation_error`. Expected bool, " f"str or callable. Received: {flag}" ) + raise ValueError(msg) return content @@ -844,10 +850,11 @@ def _handle_tool_error( elif callable(flag): content = flag(e) else: - raise ValueError( + msg = ( f"Got unexpected type of `handle_tool_error`. Expected bool, str " f"or callable. Received: {flag}" ) + raise ValueError(msg) return content diff --git a/libs/core/langchain_core/tools/convert.py b/libs/core/langchain_core/tools/convert.py index b419a595559..e85435a86df 100644 --- a/libs/core/langchain_core/tools/convert.py +++ b/libs/core/langchain_core/tools/convert.py @@ -146,7 +146,8 @@ def tool( runnable = dec_func if runnable.input_schema.model_json_schema().get("type") != "object": - raise ValueError("Runnable must have an object schema.") + msg = "Runnable must have an object schema." + raise ValueError(msg) async def ainvoke_wrapper( callbacks: Optional[Callbacks] = None, **kwargs: Any @@ -189,10 +190,11 @@ def tool( # If someone doesn't want a schema applied, we must treat it as # a simple string->string function if dec_func.__doc__ is None: - raise ValueError( + msg = ( "Function must have a docstring if " "description not provided and infer_schema is False." ) + raise ValueError(msg) return Tool( name=tool_name, func=func, @@ -222,7 +224,8 @@ def tool( return _partial else: - raise ValueError("Too many arguments for tool decorator") + msg = "Too many arguments for tool decorator" + raise ValueError(msg) def _get_description_from_runnable(runnable: Runnable) -> str: @@ -241,11 +244,12 @@ def _get_schema_from_runnable_and_arg_types( try: arg_types = get_type_hints(runnable.InputType) except TypeError as e: - raise TypeError( + msg = ( "Tool input must be str or dict. If dict, dict arguments must be " "typed. Either annotate types (e.g., with TypedDict) or pass " f"arg_types into `.as_tool` to specify. {str(e)}" - ) from e + ) + raise TypeError(msg) from e fields = {key: (key_type, Field(...)) for key, key_type in arg_types.items()} return create_model(name, **fields) # type: ignore diff --git a/libs/core/langchain_core/tools/simple.py b/libs/core/langchain_core/tools/simple.py index 6f0bdb516fc..118c8b39f6d 100644 --- a/libs/core/langchain_core/tools/simple.py +++ b/libs/core/langchain_core/tools/simple.py @@ -68,11 +68,12 @@ class Tool(BaseTool): # For backwards compatibility. The tool must be run with a single input all_args = list(args) + list(kwargs.values()) if len(all_args) != 1: - raise ToolException( + msg = ( f"""Too many arguments to single-input tool {self.name}. Consider using StructuredTool instead.""" f" Args: {all_args}" ) + raise ToolException(msg) return tuple(all_args), {} def _run( @@ -89,7 +90,8 @@ class Tool(BaseTool): if config_param := _get_runnable_config_param(self.func): kwargs[config_param] = config return self.func(*args, **kwargs) - raise NotImplementedError("Tool does not support sync invocation.") + msg = "Tool does not support sync invocation." + raise NotImplementedError(msg) async def _arun( self, @@ -152,7 +154,8 @@ class Tool(BaseTool): ValueError: If the function is not provided. """ if func is None and coroutine is None: - raise ValueError("Function and/or coroutine must be provided") + msg = "Function and/or coroutine must be provided" + raise ValueError(msg) return cls( name=name, func=func, diff --git a/libs/core/langchain_core/tools/structured.py b/libs/core/langchain_core/tools/structured.py index bf645265b45..174e7b2f537 100644 --- a/libs/core/langchain_core/tools/structured.py +++ b/libs/core/langchain_core/tools/structured.py @@ -78,7 +78,8 @@ class StructuredTool(BaseTool): if config_param := _get_runnable_config_param(self.func): kwargs[config_param] = config return self.func(*args, **kwargs) - raise NotImplementedError("StructuredTool does not support sync invocation.") + msg = "StructuredTool does not support sync invocation." + raise NotImplementedError(msg) async def _arun( self, @@ -167,7 +168,8 @@ class StructuredTool(BaseTool): elif coroutine is not None: source_function = coroutine else: - raise ValueError("Function and/or coroutine must be provided") + msg = "Function and/or coroutine must be provided" + raise ValueError(msg) name = name or source_function.__name__ if args_schema is None and infer_schema: # schema name is appended within function @@ -184,9 +186,8 @@ class StructuredTool(BaseTool): if description_ is None and args_schema: description_ = args_schema.__doc__ or None if description_ is None: - raise ValueError( - "Function must have a docstring if description not provided." - ) + msg = "Function must have a docstring if description not provided." + raise ValueError(msg) if description is None: # Only apply if using the function's docstring description_ = textwrap.dedent(description_).strip() diff --git a/libs/core/langchain_core/tracers/context.py b/libs/core/langchain_core/tracers/context.py index f2f05849d62..295c68552a3 100644 --- a/libs/core/langchain_core/tracers/context.py +++ b/libs/core/langchain_core/tracers/context.py @@ -40,9 +40,10 @@ def tracing_enabled( session_name: str = "default", ) -> Generator[TracerSessionV1, None, None]: """Throw an error because this has been replaced by tracing_v2_enabled.""" - raise RuntimeError( + msg = ( "tracing_enabled is no longer supported. Please use tracing_enabled_v2 instead." ) + raise RuntimeError(msg) @contextmanager @@ -196,9 +197,8 @@ def register_configure_hook( to a non-None value. """ if env_var is not None and handle_class is None: - raise ValueError( - "If env_var is set, handle_class must also be set to a non-None value." - ) + msg = "If env_var is set, handle_class must also be set to a non-None value." + raise ValueError(msg) from langchain_core.callbacks.base import BaseCallbackHandler _configure_hooks.append( diff --git a/libs/core/langchain_core/tracers/core.py b/libs/core/langchain_core/tracers/core.py index 0cadbf44bab..696d35150ff 100644 --- a/libs/core/langchain_core/tracers/core.py +++ b/libs/core/langchain_core/tracers/core.py @@ -137,17 +137,19 @@ class _TracerCore(ABC): try: run = self.run_map[str(run_id)] except KeyError as exc: - raise TracerException(f"No indexed run ID {run_id}.") from exc + msg = f"No indexed run ID {run_id}." + raise TracerException(msg) from exc if isinstance(run_type, str): run_types: Union[set[str], None] = {run_type} else: run_types = run_type if run_types is not None and run.run_type not in run_types: - raise TracerException( + msg = ( f"Found {run.run_type} run at ID {run_id}, " f"but expected {run_types} run." ) + raise TracerException(msg) return run def _create_chat_model_run( @@ -170,10 +172,11 @@ class _TracerCore(ABC): # This can eventually be cleaned up by writing a "modern" tracer # that has all the updated schema changes corresponding to # the "streaming_events" format. - raise NotImplementedError( + msg = ( f"Chat model tracing is not supported in " f"for {self._schema_format} format." ) + raise NotImplementedError(msg) start_time = datetime.now(timezone.utc) if metadata: kwargs.update({"metadata": metadata}) @@ -338,7 +341,8 @@ class _TracerCore(ABC): "input": inputs, } else: - raise ValueError(f"Invalid format: {self._schema_format}") + msg = f"Invalid format: {self._schema_format}" + raise ValueError(msg) def _get_chain_outputs(self, outputs: Any) -> Any: """Get the outputs for a chain run.""" @@ -349,7 +353,8 @@ class _TracerCore(ABC): "output": outputs, } else: - raise ValueError(f"Invalid format: {self._schema_format}") + msg = f"Invalid format: {self._schema_format}" + raise ValueError(msg) def _complete_chain_run( self, @@ -404,7 +409,8 @@ class _TracerCore(ABC): elif self._schema_format == "streaming_events": inputs = {"input": inputs} else: - raise AssertionError(f"Invalid format: {self._schema_format}") + msg = f"Invalid format: {self._schema_format}" + raise AssertionError(msg) return Run( id=run_id, diff --git a/libs/core/langchain_core/tracers/evaluation.py b/libs/core/langchain_core/tracers/evaluation.py index c41fa2d7f58..d74c5d86bae 100644 --- a/libs/core/langchain_core/tracers/evaluation.py +++ b/libs/core/langchain_core/tracers/evaluation.py @@ -159,10 +159,11 @@ class EvaluatorCallbackHandler(BaseTracer): elif isinstance(results, dict) and "results" in results: results_ = cast(list[EvaluationResult], results["results"]) else: - raise TypeError( + msg = ( f"Invalid evaluation result type {type(results)}." " Expected EvaluationResult or EvaluationResults." ) + raise TypeError(msg) return results_ def _log_evaluation_feedback( diff --git a/libs/core/langchain_core/tracers/event_stream.py b/libs/core/langchain_core/tracers/event_stream.py index 57cd0dc5f42..b7a1ddc853f 100644 --- a/libs/core/langchain_core/tracers/event_stream.py +++ b/libs/core/langchain_core/tracers/event_stream.py @@ -136,10 +136,11 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand while parent_id := self.parent_map.get(run_id): str_parent_id = str(parent_id) if str_parent_id in parent_ids: - raise AssertionError( + msg = ( f"Parent ID {parent_id} is already in the parent_ids list. " f"This should never happen." ) + raise AssertionError(msg) parent_ids.append(str_parent_id) run_id = parent_id @@ -411,7 +412,8 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand chunk_: Union[GenerationChunk, BaseMessageChunk] if run_info is None: - raise AssertionError(f"Run ID {run_id} not found in run map.") + msg = f"Run ID {run_id} not found in run map." + raise AssertionError(msg) if self.is_tapped.get(run_id): return if run_info["run_type"] == "chat_model": @@ -429,7 +431,8 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand else: chunk_ = cast(GenerationChunk, chunk) else: - raise ValueError(f"Unexpected run type: {run_info['run_type']}") + msg = f"Unexpected run type: {run_info['run_type']}" + raise ValueError(msg) self._send( { @@ -484,7 +487,8 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand } event = "on_llm_end" else: - raise ValueError(f"Unexpected run type: {run_info['run_type']}") + msg = f"Unexpected run type: {run_info['run_type']}" + raise ValueError(msg) self._send( { @@ -626,10 +630,11 @@ class _AstreamEventsCallbackHandler(AsyncCallbackHandler, _StreamingCallbackHand """End a trace for a tool run.""" run_info = self.run_map.pop(run_id) if "inputs" not in run_info: - raise AssertionError( + msg = ( f"Run ID {run_id} is a tool call and is expected to have " f"inputs associated with it." ) + raise AssertionError(msg) inputs = run_info["inputs"] self._send( @@ -839,11 +844,12 @@ async def _astream_events_implementation_v1( if event_type == "stream": num_chunks = len(log_entry["streamed_output"]) if num_chunks != 1: - raise AssertionError( + msg = ( f"Expected exactly one chunk of streamed output, " f"got {num_chunks} instead. This is impossible. " f"Encountered in: {log_entry['name']}" ) + raise AssertionError(msg) data = {"chunk": log_entry["streamed_output"][0]} # Clean up the stream, we don't need it anymore. @@ -866,11 +872,12 @@ async def _astream_events_implementation_v1( if state["streamed_output"]: num_chunks = len(state["streamed_output"]) if num_chunks != 1: - raise AssertionError( + msg = ( f"Expected exactly one chunk of streamed output, " f"got {num_chunks} instead. This is impossible. " f"Encountered in: {state['name']}" ) + raise AssertionError(msg) data = {"chunk": state["streamed_output"][0]} # Clean up the stream, we don't need it anymore. @@ -945,10 +952,11 @@ async def _astream_events_implementation_v2( callbacks.add_handler(event_streamer, inherit=True) config["callbacks"] = callbacks else: - raise ValueError( + msg = ( f"Unexpected type for callbacks: {callbacks}." "Expected None, list or AsyncCallbackManager." ) + raise ValueError(msg) # Call the runnable in streaming mode, # add each chunk to the output stream diff --git a/libs/core/langchain_core/tracers/langchain.py b/libs/core/langchain_core/tracers/langchain.py index e04fccaa103..0183adb2604 100644 --- a/libs/core/langchain_core/tracers/langchain.py +++ b/libs/core/langchain_core/tracers/langchain.py @@ -191,7 +191,8 @@ class LangChainTracer(BaseTracer): ValueError: If the run URL cannot be found. """ if not self.latest_run: - raise ValueError("No traced run found.") + msg = "No traced run found." + raise ValueError(msg) # If this is the first run in a project, the project may not yet be created. # This method is only really useful for debugging flows, so we will assume # there is some tolerace for latency. @@ -204,7 +205,8 @@ class LangChainTracer(BaseTracer): return self.client.get_run_url( run=self.latest_run, project_name=self.project_name ) - raise ValueError("Failed to get run URL.") + msg = "Failed to get run URL." + raise ValueError(msg) def _get_tags(self, run: Run) -> list[str]: """Get combined tags for a run.""" diff --git a/libs/core/langchain_core/tracers/langchain_v1.py b/libs/core/langchain_core/tracers/langchain_v1.py index ea1c882ea67..706dfb02edf 100644 --- a/libs/core/langchain_core/tracers/langchain_v1.py +++ b/libs/core/langchain_core/tracers/langchain_v1.py @@ -3,14 +3,16 @@ from typing import Any def get_headers(*args: Any, **kwargs: Any) -> Any: """Throw an error because this has been replaced by get_headers.""" - raise RuntimeError( + msg = ( "get_headers for LangChainTracerV1 is no longer supported. " "Please use LangChainTracer instead." ) + raise RuntimeError(msg) def LangChainTracerV1(*args: Any, **kwargs: Any) -> Any: # noqa: N802 """Throw an error because this has been replaced by LangChainTracer.""" - raise RuntimeError( + msg = ( "LangChainTracerV1 is no longer supported. Please use LangChainTracer instead." ) + raise RuntimeError(msg) diff --git a/libs/core/langchain_core/tracers/log_stream.py b/libs/core/langchain_core/tracers/log_stream.py index 439d2a45381..2284ff7022f 100644 --- a/libs/core/langchain_core/tracers/log_stream.py +++ b/libs/core/langchain_core/tracers/log_stream.py @@ -104,9 +104,8 @@ class RunLogPatch: state = jsonpatch.apply_patch(None, copy.deepcopy(ops)) return RunLog(*ops, state=state) - raise TypeError( - f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" - ) + msg = f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" + raise TypeError(msg) def __repr__(self) -> str: from pprint import pformat @@ -134,9 +133,8 @@ class RunLog(RunLogPatch): state = jsonpatch.apply_patch(self.state, other.ops) return RunLog(*ops, state=state) - raise TypeError( - f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" - ) + msg = f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" + raise TypeError(msg) def __repr__(self) -> str: from pprint import pformat @@ -197,10 +195,11 @@ class LogStreamCallbackHandler(BaseTracer, _StreamingCallbackHandler): ValueError: If an invalid schema format is provided (internal use only). """ if _schema_format not in {"original", "streaming_events"}: - raise ValueError( + msg = ( f"Invalid schema format: {_schema_format}. " f"Expected one of 'original', 'streaming_events'." ) + raise ValueError(msg) super().__init__(_schema_format=_schema_format) self.auto_close = auto_close @@ -496,11 +495,12 @@ def _get_standardized_inputs( None means that the input is not yet known! """ if schema_format == "original": - raise NotImplementedError( + msg = ( "Do not assign inputs with original schema drop the key for now." "When inputs are added to astream_log they should be added with " "standardized schema for streaming events." ) + raise NotImplementedError(msg) inputs = load(run.inputs) @@ -613,10 +613,11 @@ async def _astream_log_implementation( callbacks.add_handler(stream, inherit=True) config["callbacks"] = callbacks else: - raise ValueError( + msg = ( f"Unexpected type for callbacks: {callbacks}." "Expected None, list or AsyncCallbackManager." ) + raise ValueError(msg) # Call the runnable in streaming mode, # add each chunk to the output stream diff --git a/libs/core/langchain_core/utils/_merge.py b/libs/core/langchain_core/utils/_merge.py index 32261399d00..be8f8293874 100644 --- a/libs/core/langchain_core/utils/_merge.py +++ b/libs/core/langchain_core/utils/_merge.py @@ -34,10 +34,11 @@ def merge_dicts(left: dict[str, Any], *others: dict[str, Any]) -> dict[str, Any] elif right_v is None: continue elif type(merged[right_k]) is not type(right_v): - raise TypeError( + msg = ( f'additional_kwargs["{right_k}"] already exists in this message,' " but with a different type." ) + raise TypeError(msg) elif isinstance(merged[right_k], str): # TODO: Add below special handling for 'type' key in 0.3 and remove # merge_lists 'type' logic. @@ -60,10 +61,11 @@ def merge_dicts(left: dict[str, Any], *others: dict[str, Any]) -> dict[str, Any] elif merged[right_k] == right_v: continue else: - raise TypeError( + msg = ( f"Additional kwargs key {right_k} already exists in left dict and " f"value has unsupported type {type(merged[right_k])}." ) + raise TypeError(msg) return merged @@ -125,10 +127,11 @@ def merge_obj(left: Any, right: Any) -> Any: if left is None or right is None: return left if left is not None else right elif type(left) is not type(right): - raise TypeError( + msg = ( f"left and right are of different types. Left type: {type(left)}. Right " f"type: {type(right)}." ) + raise TypeError(msg) elif isinstance(left, str): return left + right elif isinstance(left, dict): @@ -138,7 +141,8 @@ def merge_obj(left: Any, right: Any) -> Any: elif left == right: return left else: - raise ValueError( + msg = ( f"Unable to merge {left=} and {right=}. Both must be of type str, dict, or " f"list, or else be two equal objects." ) + raise ValueError(msg) diff --git a/libs/core/langchain_core/utils/aiter.py b/libs/core/langchain_core/utils/aiter.py index 135b116a419..5d4ef032efa 100644 --- a/libs/core/langchain_core/utils/aiter.py +++ b/libs/core/langchain_core/utils/aiter.py @@ -60,7 +60,8 @@ def py_anext( Callable[[AsyncIterator[T]], Awaitable[T]], type(iterator).__anext__ ) except AttributeError as e: - raise TypeError(f"{iterator!r} is not an async iterator") from e + msg = f"{iterator!r} is not an async iterator" + raise TypeError(msg) from e if default is _no_default: return __anext__(iterator) diff --git a/libs/core/langchain_core/utils/env.py b/libs/core/langchain_core/utils/env.py index 8319c9abb98..ac018b0208a 100644 --- a/libs/core/langchain_core/utils/env.py +++ b/libs/core/langchain_core/utils/env.py @@ -73,8 +73,9 @@ def get_from_env(key: str, env_key: str, default: Optional[str] = None) -> str: elif default is not None: return default else: - raise ValueError( + msg = ( f"Did not find {key}, please add an environment variable" f" `{env_key}` which contains it, or pass" f" `{key}` as a named parameter." ) + raise ValueError(msg) diff --git a/libs/core/langchain_core/utils/formatting.py b/libs/core/langchain_core/utils/formatting.py index 1e71cdf28ce..d00431be85b 100644 --- a/libs/core/langchain_core/utils/formatting.py +++ b/libs/core/langchain_core/utils/formatting.py @@ -25,10 +25,11 @@ class StrictFormatter(Formatter): ValueError: If any arguments are provided. """ if len(args) > 0: - raise ValueError( + msg = ( "No arguments should be provided, " "everything should be passed as keyword arguments." ) + raise ValueError(msg) return super().vformat(format_string, args, kwargs) def validate_input_variables( diff --git a/libs/core/langchain_core/utils/function_calling.py b/libs/core/langchain_core/utils/function_calling.py index d93f5cb0098..9bb62c92b9e 100644 --- a/libs/core/langchain_core/utils/function_calling.py +++ b/libs/core/langchain_core/utils/function_calling.py @@ -105,7 +105,8 @@ def convert_pydantic_to_openai_function( elif hasattr(model, "schema"): schema = model.schema() # Pydantic 1 else: - raise TypeError("Model must be a Pydantic model.") + msg = "Model must be a Pydantic model." + raise TypeError(msg) schema = dereference_refs(schema) if "definitions" in schema: # pydantic 1 schema.pop("definitions", None) @@ -237,11 +238,12 @@ def _convert_any_typed_dicts_to_pydantic( if (field_desc := field_kwargs.get("description")) and not isinstance( field_desc, str ): - raise ValueError( + msg = ( f"Invalid annotation for field {arg}. Third argument to " f"Annotated must be a string description, received value of " f"type {type(field_desc)}." ) + raise ValueError(msg) elif arg_desc := arg_descriptions.get(arg): field_kwargs["description"] = arg_desc else: @@ -387,12 +389,13 @@ def convert_to_openai_function( elif callable(function): oai_function = cast(dict, convert_python_function_to_openai_function(function)) else: - raise ValueError( + msg = ( f"Unsupported function\n\n{function}\n\nFunctions must be passed in" " as Dict, pydantic.BaseModel, or Callable. If they're a dict they must" " either be in OpenAI function format or valid JSON schema with top-level" " 'title' and 'description' keys." ) + raise ValueError(msg) if strict is not None: oai_function["strict"] = strict @@ -553,7 +556,8 @@ def _parse_google_docstring( if filtered_annotations and ( len(docstring_blocks) < 2 or not docstring_blocks[1].startswith("Args:") ): - raise ValueError("Found invalid Google-Style docstring.") + msg = "Found invalid Google-Style docstring." + raise ValueError(msg) descriptors = [] args_block = None past_descriptors = False @@ -571,7 +575,8 @@ def _parse_google_docstring( description = " ".join(descriptors) else: if error_on_invalid_docstring: - raise ValueError("Found invalid Google-Style docstring.") + msg = "Found invalid Google-Style docstring." + raise ValueError(msg) description = "" args_block = None arg_descriptions = {} diff --git a/libs/core/langchain_core/utils/json.py b/libs/core/langchain_core/utils/json.py index 0ef93c05abe..88e91899b91 100644 --- a/libs/core/langchain_core/utils/json.py +++ b/libs/core/langchain_core/utils/json.py @@ -179,11 +179,13 @@ def parse_and_check_json_markdown(text: str, expected_keys: list[str]) -> dict: try: json_obj = parse_json_markdown(text) except json.JSONDecodeError as e: - raise OutputParserException(f"Got invalid JSON object. Error: {e}") from e + msg = f"Got invalid JSON object. Error: {e}" + raise OutputParserException(msg) from e for key in expected_keys: if key not in json_obj: - raise OutputParserException( + msg = ( f"Got invalid return object. Expected key `{key}` " f"to be present, but got {json_obj}" ) + raise OutputParserException(msg) return json_obj diff --git a/libs/core/langchain_core/utils/json_schema.py b/libs/core/langchain_core/utils/json_schema.py index be9642808c1..8ac177e342c 100644 --- a/libs/core/langchain_core/utils/json_schema.py +++ b/libs/core/langchain_core/utils/json_schema.py @@ -8,10 +8,11 @@ from typing import Any, Optional def _retrieve_ref(path: str, schema: dict) -> dict: components = path.split("/") if components[0] != "#": - raise ValueError( + msg = ( "ref paths are expected to be URI fragments, meaning they should start " "with #." ) + raise ValueError(msg) out = schema for component in components[1:]: if component in out: @@ -19,7 +20,8 @@ def _retrieve_ref(path: str, schema: dict) -> dict: elif component.isdigit() and int(component) in out: out = out[int(component)] else: - raise KeyError(f"Reference '{path}' not found.") + msg = f"Reference '{path}' not found." + raise KeyError(msg) return deepcopy(out) diff --git a/libs/core/langchain_core/utils/mustache.py b/libs/core/langchain_core/utils/mustache.py index 56538d945f6..89d5d9fbbf1 100644 --- a/libs/core/langchain_core/utils/mustache.py +++ b/libs/core/langchain_core/utils/mustache.py @@ -144,7 +144,8 @@ def parse_tag(template: str, l_del: str, r_del: str) -> tuple[tuple[str, str], s try: tag, template = template.split(r_del, 1) except ValueError as e: - raise ChevronError("unclosed tag " f"at line {_CURRENT_LINE}") from e + msg = "unclosed tag " f"at line {_CURRENT_LINE}" + raise ChevronError(msg) from e # Find the type meaning of the first character tag_type = tag_types.get(tag[0], "variable") @@ -164,9 +165,8 @@ def parse_tag(template: str, l_del: str, r_del: str) -> tuple[tuple[str, str], s # Otherwise we should complain else: - raise ChevronError( - "unclosed set delimiter tag\n" f"at line {_CURRENT_LINE}" - ) + msg = "unclosed set delimiter tag\n" f"at line {_CURRENT_LINE}" + raise ChevronError(msg) elif ( # If we might be a no html escape tag @@ -275,18 +275,20 @@ def tokenize( try: last_section = open_sections.pop() except IndexError as e: - raise ChevronError( + msg = ( f'Trying to close tag "{tag_key}"\n' "Looks like it was not opened.\n" f"line {_CURRENT_LINE + 1}" - ) from e + ) + raise ChevronError(msg) from e if tag_key != last_section: # Otherwise we need to complain - raise ChevronError( + msg = ( f'Trying to close tag "{tag_key}"\n' f'last open tag is "{last_section}"\n' f"line {_CURRENT_LINE + 1}" ) + raise ChevronError(msg) # Do the second check to see if we're a standalone is_standalone = r_sa_check(template, tag_type, is_standalone) @@ -313,11 +315,12 @@ def tokenize( # If there are any open sections when we're done if open_sections: # Then we need to complain - raise ChevronError( + msg = ( "Unexpected EOF\n" f'the tag "{open_sections[-1]}" was never closed\n' f"was opened at line {_LAST_TAG_LINE}" ) + raise ChevronError(msg) # diff --git a/libs/core/langchain_core/utils/pydantic.py b/libs/core/langchain_core/utils/pydantic.py index 93375e09f34..7d81b8f70f0 100644 --- a/libs/core/langchain_core/utils/pydantic.py +++ b/libs/core/langchain_core/utils/pydantic.py @@ -63,7 +63,8 @@ elif PYDANTIC_MAJOR_VERSION == 2: PydanticBaseModel = Union[BaseModel, pydantic.BaseModel] # type: ignore TypeBaseModel = Union[type[BaseModel], type[pydantic.BaseModel]] # type: ignore else: - raise ValueError(f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}") + msg = f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise ValueError(msg) TBaseModel = TypeVar("TBaseModel", bound=PydanticBaseModel) @@ -116,7 +117,8 @@ def is_basemodel_subclass(cls: type) -> bool: if issubclass(cls, BaseModelV1): return True else: - raise ValueError(f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}") + msg = f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise ValueError(msg) return False @@ -144,7 +146,8 @@ def is_basemodel_instance(obj: Any) -> bool: if isinstance(obj, BaseModelV1): return True else: - raise ValueError(f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}") + msg = f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise ValueError(msg) return False @@ -233,9 +236,8 @@ def _create_subset_model_v1( elif PYDANTIC_MAJOR_VERSION == 2: from pydantic.v1 import create_model # type: ignore else: - raise NotImplementedError( - f"Unsupported pydantic version: {PYDANTIC_MAJOR_VERSION}" - ) + msg = f"Unsupported pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise NotImplementedError(msg) fields = {} @@ -339,9 +341,8 @@ def _create_subset_model( fn_description=fn_description, ) else: - raise NotImplementedError( - f"Unsupported pydantic version: {PYDANTIC_MAJOR_VERSION}" - ) + msg = f"Unsupported pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise NotImplementedError(msg) if PYDANTIC_MAJOR_VERSION == 2: @@ -376,7 +377,8 @@ if PYDANTIC_MAJOR_VERSION == 2: elif hasattr(model, "__fields__"): return model.__fields__ # type: ignore else: - raise TypeError(f"Expected a Pydantic model. Got {type(model)}") + msg = f"Expected a Pydantic model. Got {type(model)}" + raise TypeError(msg) elif PYDANTIC_MAJOR_VERSION == 1: from pydantic import BaseModel as BaseModelV1_ @@ -386,7 +388,8 @@ elif PYDANTIC_MAJOR_VERSION == 1: """Get the field names of a Pydantic model.""" return model.__fields__ # type: ignore else: - raise ValueError(f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}") + msg = f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise ValueError(msg) _SchemaConfig = ConfigDict( arbitrary_types_allowed=True, frozen=True, protected_namespaces=() @@ -536,11 +539,12 @@ def _remap_field_definitions(field_definitions: dict[str, Any]) -> dict[str, Any if key.startswith("_") or key in _RESERVED_NAMES: # Let's add a prefix to avoid colliding with internal pydantic fields if isinstance(value, FieldInfo): - raise NotImplementedError( + msg = ( f"Remapping for fields starting with '_' or fields with a name " f"matching a reserved name {_RESERVED_NAMES} is not supported if " f" the field is a pydantic Field instance. Got {key}." ) + raise NotImplementedError(msg) type_, default_ = value remapped[f"private_{key}"] = ( type_, @@ -583,10 +587,11 @@ def create_model_v2( if root: if field_definitions: - raise NotImplementedError( + msg = ( "When specifying __root__ no other " f"fields should be provided. Got {field_definitions}" ) + raise NotImplementedError(msg) if isinstance(root, tuple): kwargs = {"type_": root[0], "default_": root[1]} diff --git a/libs/core/langchain_core/utils/utils.py b/libs/core/langchain_core/utils/utils.py index 7bbea2d4e0c..94f356da331 100644 --- a/libs/core/langchain_core/utils/utils.py +++ b/libs/core/langchain_core/utils/utils.py @@ -44,11 +44,12 @@ def xor_args(*arg_groups: tuple[str, ...]) -> Callable: invalid_groups = [i for i, count in enumerate(counts) if count != 1] if invalid_groups: invalid_group_names = [", ".join(arg_groups[i]) for i in invalid_groups] - raise ValueError( + msg = ( "Exactly one argument in each of the following" " groups must be defined:" f" {', '.join(invalid_group_names)}" ) + raise ValueError(msg) return func(*args, **kwargs) return wrapper @@ -134,10 +135,11 @@ def guard_import( module = importlib.import_module(module_name, package) except (ImportError, ModuleNotFoundError) as e: pip_name = pip_name or module_name.split(".")[0].replace("_", "-") - raise ImportError( + msg = ( f"Could not import {module_name} python package. " f"Please install it with `pip install {pip_name}`." - ) from e + ) + raise ImportError(msg) from e return module @@ -166,25 +168,29 @@ def check_package_version( """ imported_version = parse(version(package)) if lt_version is not None and imported_version >= parse(lt_version): - raise ValueError( + msg = ( f"Expected {package} version to be < {lt_version}. Received " f"{imported_version}." ) + raise ValueError(msg) if lte_version is not None and imported_version > parse(lte_version): - raise ValueError( + msg = ( f"Expected {package} version to be <= {lte_version}. Received " f"{imported_version}." ) + raise ValueError(msg) if gt_version is not None and imported_version <= parse(gt_version): - raise ValueError( + msg = ( f"Expected {package} version to be > {gt_version}. Received " f"{imported_version}." ) + raise ValueError(msg) if gte_version is not None and imported_version < parse(gte_version): - raise ValueError( + msg = ( f"Expected {package} version to be >= {gte_version}. Received " f"{imported_version}." ) + raise ValueError(msg) def get_pydantic_field_names(pydantic_cls: Any) -> set[str]: @@ -230,7 +236,8 @@ def _build_model_kwargs( extra_kwargs = values.get("model_kwargs", {}) for field_name in list(values): if field_name in extra_kwargs: - raise ValueError(f"Found {field_name} supplied twice.") + msg = f"Found {field_name} supplied twice." + raise ValueError(msg) if field_name not in all_required_field_names: warnings.warn( f"""WARNING! {field_name} is not default parameter. @@ -276,7 +283,8 @@ def build_extra_kwargs( """ for field_name in list(values): if field_name in extra_kwargs: - raise ValueError(f"Found {field_name} supplied twice.") + msg = f"Found {field_name} supplied twice." + raise ValueError(msg) if field_name not in all_required_field_names: warnings.warn( f"""WARNING! {field_name} is not default parameter. @@ -288,10 +296,11 @@ def build_extra_kwargs( invalid_model_kwargs = all_required_field_names.intersection(extra_kwargs.keys()) if invalid_model_kwargs: - raise ValueError( + msg = ( f"Parameters {invalid_model_kwargs} should be specified explicitly. " f"Instead they were passed in as part of `model_kwargs` parameter." ) + raise ValueError(msg) return extra_kwargs @@ -386,11 +395,12 @@ def from_env( if error_message: raise ValueError(error_message) else: - raise ValueError( + msg = ( f"Did not find {key}, please add an environment variable" f" `{key}` which contains it, or pass" f" `{key}` as a named parameter." ) + raise ValueError(msg) return get_from_env_fn @@ -449,10 +459,11 @@ def secret_from_env( if error_message: raise ValueError(error_message) else: - raise ValueError( + msg = ( f"Did not find {key}, please add an environment variable" f" `{key}` which contains it, or pass" f" `{key}` as a named parameter." ) + raise ValueError(msg) return get_secret_from_env diff --git a/libs/core/langchain_core/vectorstores/base.py b/libs/core/langchain_core/vectorstores/base.py index ccc966d9f2a..c87da224acd 100644 --- a/libs/core/langchain_core/vectorstores/base.py +++ b/libs/core/langchain_core/vectorstores/base.py @@ -93,10 +93,11 @@ class VectorStore(ABC): texts if isinstance(texts, (list, tuple)) else list(texts) ) if metadatas and len(metadatas) != len(texts_): - raise ValueError( + msg = ( "The number of metadatas must match the number of texts." f"Got {len(metadatas)} metadatas and {len(texts_)} texts." ) + raise ValueError(msg) metadatas_ = iter(metadatas) if metadatas else cycle([{}]) ids_: Iterator[Optional[str]] = iter(ids) if ids else cycle([None]) docs = [ @@ -108,9 +109,8 @@ class VectorStore(ABC): kwargs["ids"] = ids return self.add_documents(docs, **kwargs) - raise NotImplementedError( - f"`add_texts` has not been implemented for {self.__class__.__name__} " - ) + msg = f"`add_texts` has not been implemented for {self.__class__.__name__} " + raise NotImplementedError(msg) @property def embeddings(self) -> Optional[Embeddings]: @@ -133,7 +133,8 @@ class VectorStore(ABC): False otherwise, None if not implemented. """ - raise NotImplementedError("delete method must be implemented by subclass.") + msg = "delete method must be implemented by subclass." + raise NotImplementedError(msg) def get_by_ids(self, ids: Sequence[str], /) -> list[Document]: """Get documents by their IDs. @@ -159,9 +160,8 @@ class VectorStore(ABC): .. versionadded:: 0.2.11 """ - raise NotImplementedError( - f"{self.__class__.__name__} does not yet support get_by_ids." - ) + msg = f"{self.__class__.__name__} does not yet support get_by_ids." + raise NotImplementedError(msg) # Implementations should override this method to provide an async native version. async def aget_by_ids(self, ids: Sequence[str], /) -> list[Document]: @@ -243,10 +243,11 @@ class VectorStore(ABC): texts if isinstance(texts, (list, tuple)) else list(texts) ) if metadatas and len(metadatas) != len(texts_): - raise ValueError( + msg = ( "The number of metadatas must match the number of texts." f"Got {len(metadatas)} metadatas and {len(texts_)} texts." ) + raise ValueError(msg) metadatas_ = iter(metadatas) if metadatas else cycle([{}]) ids_: Iterator[Optional[str]] = iter(ids) if ids else cycle([None]) @@ -284,10 +285,11 @@ class VectorStore(ABC): texts = [doc.page_content for doc in documents] metadatas = [doc.metadata for doc in documents] return self.add_texts(texts, metadatas, **kwargs) - raise NotImplementedError( + msg = ( f"`add_documents` and `add_texts` has not been implemented " f"for {self.__class__.__name__} " ) + raise NotImplementedError(msg) async def aadd_documents( self, documents: list[Document], **kwargs: Any @@ -347,11 +349,12 @@ class VectorStore(ABC): elif search_type == "mmr": return self.max_marginal_relevance_search(query, **kwargs) else: - raise ValueError( + msg = ( f"search_type of {search_type} not allowed. Expected " "search_type to be 'similarity', 'similarity_score_threshold'" " or 'mmr'." ) + raise ValueError(msg) async def asearch( self, query: str, search_type: str, **kwargs: Any @@ -381,10 +384,11 @@ class VectorStore(ABC): elif search_type == "mmr": return await self.amax_marginal_relevance_search(query, **kwargs) else: - raise ValueError( + msg = ( f"search_type of {search_type} not allowed. Expected " "search_type to be 'similarity', 'similarity_score_threshold' or 'mmr'." ) + raise ValueError(msg) @abstractmethod def similarity_search( @@ -1035,17 +1039,19 @@ class VectorStoreRetriever(BaseRetriever): """ search_type = values.get("search_type", "similarity") if search_type not in cls.allowed_search_types: - raise ValueError( + msg = ( f"search_type of {search_type} not allowed. Valid values are: " f"{cls.allowed_search_types}" ) + raise ValueError(msg) if search_type == "similarity_score_threshold": score_threshold = values.get("search_kwargs", {}).get("score_threshold") if (score_threshold is None) or (not isinstance(score_threshold, float)): - raise ValueError( + msg = ( "`score_threshold` is not specified with a float value(0~1) " "in `search_kwargs`." ) + raise ValueError(msg) return values def _get_ls_params(self, **kwargs: Any) -> LangSmithRetrieverParams: @@ -1084,7 +1090,8 @@ class VectorStoreRetriever(BaseRetriever): query, **self.search_kwargs ) else: - raise ValueError(f"search_type of {self.search_type} not allowed.") + msg = f"search_type of {self.search_type} not allowed." + raise ValueError(msg) return docs async def _aget_relevant_documents( @@ -1106,7 +1113,8 @@ class VectorStoreRetriever(BaseRetriever): query, **self.search_kwargs ) else: - raise ValueError(f"search_type of {self.search_type} not allowed.") + msg = f"search_type of {self.search_type} not allowed." + raise ValueError(msg) return docs def add_documents(self, documents: list[Document], **kwargs: Any) -> list[str]: diff --git a/libs/core/langchain_core/vectorstores/in_memory.py b/libs/core/langchain_core/vectorstores/in_memory.py index 0b0a7c08653..06aa13f785a 100644 --- a/libs/core/langchain_core/vectorstores/in_memory.py +++ b/libs/core/langchain_core/vectorstores/in_memory.py @@ -175,10 +175,11 @@ class InMemoryVectorStore(VectorStore): vectors = self.embedding.embed_documents(texts) if ids and len(ids) != len(texts): - raise ValueError( + msg = ( f"ids must be the same length as texts. " f"Got {len(ids)} ids and {len(texts)} texts." ) + raise ValueError(msg) id_iterator: Iterator[Optional[str]] = ( iter(ids) if ids else iter(doc.id for doc in documents) @@ -207,10 +208,11 @@ class InMemoryVectorStore(VectorStore): vectors = await self.embedding.aembed_documents(texts) if ids and len(ids) != len(texts): - raise ValueError( + msg = ( f"ids must be the same length as texts. " f"Got {len(ids)} ids and {len(texts)} texts." ) + raise ValueError(msg) id_iterator: Iterator[Optional[str]] = ( iter(ids) if ids else iter(doc.id for doc in documents) @@ -432,10 +434,11 @@ class InMemoryVectorStore(VectorStore): try: import numpy as np except ImportError as e: - raise ImportError( + msg = ( "numpy must be installed to use max_marginal_relevance_search " "pip install numpy" - ) from e + ) + raise ImportError(msg) from e mmr_chosen_indices = maximal_marginal_relevance( np.array(embedding, dtype=np.float32), diff --git a/libs/core/langchain_core/vectorstores/utils.py b/libs/core/langchain_core/vectorstores/utils.py index 777bb68b68d..6a8f6758f99 100644 --- a/libs/core/langchain_core/vectorstores/utils.py +++ b/libs/core/langchain_core/vectorstores/utils.py @@ -35,10 +35,11 @@ def _cosine_similarity(x: Matrix, y: Matrix) -> np.ndarray: try: import numpy as np except ImportError as e: - raise ImportError( + msg = ( "cosine_similarity requires numpy to be installed. " "Please install numpy with `pip install numpy`." - ) from e + ) + raise ImportError(msg) from e if len(x) == 0 or len(y) == 0: return np.array([]) @@ -46,10 +47,11 @@ def _cosine_similarity(x: Matrix, y: Matrix) -> np.ndarray: x = np.array(x) y = np.array(y) if x.shape[1] != y.shape[1]: - raise ValueError( + msg = ( f"Number of columns in X and Y must be the same. X has shape {x.shape} " f"and Y has shape {y.shape}." ) + raise ValueError(msg) try: import simsimd as simd # type: ignore[import-not-found] @@ -94,10 +96,11 @@ def maximal_marginal_relevance( try: import numpy as np except ImportError as e: - raise ImportError( + msg = ( "maximal_marginal_relevance requires numpy to be installed. " "Please install numpy with `pip install numpy`." - ) from e + ) + raise ImportError(msg) from e if min(k, len(embedding_list)) <= 0: return [] diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index 36a6cb9f593..365db50c53b 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -44,7 +44,7 @@ python = ">=3.12.4" [tool.poetry.extras] [tool.ruff.lint] -select = [ "B", "C4", "E", "F", "I", "N", "PIE", "SIM", "T201", "UP", "W",] +select = [ "B", "C4", "E", "EM", "F", "I", "N", "PIE", "SIM", "T201", "UP", "W",] ignore = [ "UP007", "W293",] [tool.coverage.run] diff --git a/libs/core/tests/unit_tests/conftest.py b/libs/core/tests/unit_tests/conftest.py index 53104b12b2a..29819a80669 100644 --- a/libs/core/tests/unit_tests/conftest.py +++ b/libs/core/tests/unit_tests/conftest.py @@ -47,7 +47,8 @@ def pytest_collection_modifyitems(config: Config, items: Sequence[Function]) -> only_core = config.getoption("--only-core") or False if only_extended and only_core: - raise ValueError("Cannot specify both `--only-extended` and `--only-core`.") + msg = "Cannot specify both `--only-extended` and `--only-core`." + raise ValueError(msg) for item in items: requires_marker = item.get_closest_marker("requires") diff --git a/libs/core/tests/unit_tests/language_models/llms/test_cache.py b/libs/core/tests/unit_tests/language_models/llms/test_cache.py index 4c5eb04cb9c..6894328724b 100644 --- a/libs/core/tests/unit_tests/language_models/llms/test_cache.py +++ b/libs/core/tests/unit_tests/language_models/llms/test_cache.py @@ -66,11 +66,13 @@ class InMemoryCacheBad(BaseCache): def lookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: """Look up based on prompt and llm_string.""" - raise NotImplementedError("This code should not be triggered") + msg = "This code should not be triggered" + raise NotImplementedError(msg) def update(self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE) -> None: """Update cache based on prompt and llm_string.""" - raise NotImplementedError("This code should not be triggered") + msg = "This code should not be triggered" + raise NotImplementedError(msg) def clear(self, **kwargs: Any) -> None: """Clear cache.""" diff --git a/libs/core/tests/unit_tests/load/test_serializable.py b/libs/core/tests/unit_tests/load/test_serializable.py index a8b03a801e6..65040a6841b 100644 --- a/libs/core/tests/unit_tests/load/test_serializable.py +++ b/libs/core/tests/unit_tests/load/test_serializable.py @@ -76,17 +76,20 @@ def test_simple_serialization_secret() -> None: def test__is_field_useful() -> None: class ArrayObj: def __bool__(self) -> bool: - raise ValueError("Truthiness can't be determined") + msg = "Truthiness can't be determined" + raise ValueError(msg) def __eq__(self, other: object) -> bool: return self # type: ignore[return-value] class NonBoolObj: def __bool__(self) -> bool: - raise ValueError("Truthiness can't be determined") + msg = "Truthiness can't be determined" + raise ValueError(msg) def __eq__(self, other: object) -> bool: - raise ValueError("Equality can't be determined") + msg = "Equality can't be determined" + raise ValueError(msg) default_x = ArrayObj() default_y = NonBoolObj() diff --git a/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py b/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py index a883eabc35a..c4c97292b01 100644 --- a/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py +++ b/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py @@ -32,15 +32,13 @@ def test_base_generation_parser() -> None: that support streaming """ if len(result) != 1: - raise NotImplementedError( - "This output parser can only be used with a single generation." - ) + msg = "This output parser can only be used with a single generation." + raise NotImplementedError(msg) generation = result[0] if not isinstance(generation, ChatGeneration): # Say that this one only works with chat generations - raise OutputParserException( - "This output parser can only be used with a chat generation." - ) + msg = "This output parser can only be used with a chat generation." + raise OutputParserException(msg) content = generation.message.content assert isinstance(content, str) @@ -77,15 +75,13 @@ def test_base_transform_output_parser() -> None: that support streaming """ if len(result) != 1: - raise NotImplementedError( - "This output parser can only be used with a single generation." - ) + msg = "This output parser can only be used with a single generation." + raise NotImplementedError(msg) generation = result[0] if not isinstance(generation, ChatGeneration): # Say that this one only works with chat generations - raise OutputParserException( - "This output parser can only be used with a chat generation." - ) + msg = "This output parser can only be used with a chat generation." + raise OutputParserException(msg) content = generation.message.content assert isinstance(content, str) return content.swapcase() # type: ignore diff --git a/libs/core/tests/unit_tests/prompts/test_prompt.py b/libs/core/tests/unit_tests/prompts/test_prompt.py index 3e3452f78b4..cf256a8ae1d 100644 --- a/libs/core/tests/unit_tests/prompts/test_prompt.py +++ b/libs/core/tests/unit_tests/prompts/test_prompt.py @@ -618,7 +618,8 @@ def test_prompt_falsy_vars( elif template_format == "mustache": template = "{{my_var}}" else: - raise ValueError(f"Invalid template format: {template_format}") + msg = f"Invalid template format: {template_format}" + raise ValueError(msg) prompt = PromptTemplate.from_template(template, template_format=template_format) diff --git a/libs/core/tests/unit_tests/pydantic_utils.py b/libs/core/tests/unit_tests/pydantic_utils.py index e64e1e24dfe..e7e03750fd2 100644 --- a/libs/core/tests/unit_tests/pydantic_utils.py +++ b/libs/core/tests/unit_tests/pydantic_utils.py @@ -77,9 +77,8 @@ def _schema(obj: Any) -> dict: """Return the schema of the object.""" if not is_basemodel_subclass(obj): - raise TypeError( - f"Object must be a Pydantic BaseModel subclass. Got {type(obj)}" - ) + msg = f"Object must be a Pydantic BaseModel subclass. Got {type(obj)}" + raise TypeError(msg) # Remap to old style schema if not hasattr(obj, "model_json_schema"): # V1 model return obj.schema() diff --git a/libs/core/tests/unit_tests/runnables/test_configurable.py b/libs/core/tests/unit_tests/runnables/test_configurable.py index 99f10f6c600..9467d6dd039 100644 --- a/libs/core/tests/unit_tests/runnables/test_configurable.py +++ b/libs/core/tests/unit_tests/runnables/test_configurable.py @@ -23,7 +23,8 @@ class MyRunnable(RunnableSerializable[str, str]): @classmethod def my_error(cls, values: dict[str, Any]) -> Any: if "_my_hidden_property" in values: - raise ValueError("Cannot set _my_hidden_property") + msg = "Cannot set _my_hidden_property" + raise ValueError(msg) return values @model_validator(mode="after") diff --git a/libs/core/tests/unit_tests/runnables/test_runnable.py b/libs/core/tests/unit_tests/runnables/test_runnable.py index f9dff49c0b9..6fdf76bf03f 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable.py @@ -2824,7 +2824,8 @@ async def test_higher_order_lambda_runnable( elif input["key"] == "english": return itemgetter("input") | english_chain else: - raise ValueError(f"Unknown key: {input['key']}") + msg = f"Unknown key: {input['key']}" + raise ValueError(msg) chain: Runnable = input_map | router assert dumps(chain, pretty=True) == snapshot @@ -2873,7 +2874,8 @@ async def test_higher_order_lambda_runnable( elif input["key"] == "english": return itemgetter("input") | english_chain else: - raise ValueError(f"Unknown key: {input['key']}") + msg = f"Unknown key: {input['key']}" + raise ValueError(msg) achain: Runnable = input_map | arouter math_spy = mocker.spy(math_chain.__class__, "ainvoke") @@ -3065,7 +3067,8 @@ def test_map_stream() -> None: streamed_chunks[0] == {"llm": "i"} or {"chat": _any_id_ai_message_chunk(content="i")} ): - raise AssertionError(f"Got an unexpected chunk: {streamed_chunks[0]}") + msg = f"Got an unexpected chunk: {streamed_chunks[0]}" + raise AssertionError(msg) assert len(streamed_chunks) == len(llm_res) + len(chat_res) @@ -3714,9 +3717,11 @@ def test_recursive_lambda() -> None: def test_retrying(mocker: MockerFixture) -> None: def _lambda(x: int) -> Union[int, Runnable]: if x == 1: - raise ValueError("x is 1") + msg = "x is 1" + raise ValueError(msg) elif x == 2: - raise RuntimeError("x is 2") + msg = "x is 2" + raise RuntimeError(msg) else: return x @@ -3777,9 +3782,11 @@ def test_retrying(mocker: MockerFixture) -> None: async def test_async_retrying(mocker: MockerFixture) -> None: def _lambda(x: int) -> Union[int, Runnable]: if x == 1: - raise ValueError("x is 1") + msg = "x is 1" + raise ValueError(msg) elif x == 2: - raise RuntimeError("x is 2") + msg = "x is 2" + raise RuntimeError(msg) else: return x @@ -3872,7 +3879,8 @@ def test_runnable_lambda_stream_with_callbacks() -> None: def raise_value_error(x: int) -> int: """Raise a value error.""" - raise ValueError("x is too large") + msg = "x is too large" + raise ValueError(msg) # Check that the chain on error is invoked with pytest.raises(ValueError): @@ -3950,7 +3958,8 @@ async def test_runnable_lambda_astream_with_callbacks() -> None: def raise_value_error(x: int) -> int: """Raise a value error.""" - raise ValueError("x is too large") + msg = "x is too large" + raise ValueError(msg) # Check that the chain on error is invoked with pytest.raises(ValueError): @@ -4285,7 +4294,8 @@ def test_runnable_branch_invoke() -> None: # Test with single branch def raise_value_error(x: int) -> int: """Raise a value error.""" - raise ValueError("x is too large") + msg = "x is too large" + raise ValueError(msg) branch = RunnableBranch[int, int]( (lambda x: x > 100, raise_value_error), @@ -4349,7 +4359,8 @@ def test_runnable_branch_invoke_callbacks() -> None: def raise_value_error(x: int) -> int: """Raise a value error.""" - raise ValueError("x is too large") + msg = "x is too large" + raise ValueError(msg) branch = RunnableBranch[int, int]( (lambda x: x > 100, raise_value_error), @@ -4376,7 +4387,8 @@ async def test_runnable_branch_ainvoke_callbacks() -> None: async def raise_value_error(x: int) -> int: """Raise a value error.""" - raise ValueError("x is too large") + msg = "x is too large" + raise ValueError(msg) branch = RunnableBranch[int, int]( (lambda x: x > 100, raise_value_error), @@ -4430,7 +4442,8 @@ def test_runnable_branch_stream_with_callbacks() -> None: def raise_value_error(x: str) -> Any: """Raise a value error.""" - raise ValueError(f"x is {x}") + msg = f"x is {x}" + raise ValueError(msg) llm_res = "i'm a textbot" # sleep to better simulate a real stream @@ -4507,7 +4520,8 @@ async def test_runnable_branch_astream_with_callbacks() -> None: def raise_value_error(x: str) -> Any: """Raise a value error.""" - raise ValueError(f"x is {x}") + msg = f"x is {x}" + raise ValueError(msg) llm_res = "i'm a textbot" # sleep to better simulate a real stream diff --git a/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py b/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py index 67b303b3518..7389d887769 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable_events_v1.py @@ -1596,7 +1596,8 @@ async def test_event_stream_with_retry() -> None: def fail(inputs: str) -> None: """Simple func.""" - raise Exception("fail") + msg = "fail" + raise Exception(msg) chain = RunnableLambda(success) | RunnableLambda(fail).with_retry( stop_after_attempt=1, diff --git a/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py b/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py index 4014c9687e9..afc05ae39f6 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py @@ -1552,7 +1552,8 @@ async def test_event_stream_with_retry() -> None: def fail(inputs: str) -> None: """Simple func.""" - raise Exception("fail") + msg = "fail" + raise Exception(msg) chain = RunnableLambda(success) | RunnableLambda(fail).with_retry( stop_after_attempt=1, @@ -2057,7 +2058,8 @@ class StreamingRunnable(Runnable[Input, Output]): self, input: Input, config: Optional[RunnableConfig] = None, **kwargs: Any ) -> Output: """Invoke the runnable.""" - raise ValueError("Server side error") + msg = "Server side error" + raise ValueError(msg) def stream( self, diff --git a/libs/core/tests/unit_tests/runnables/test_tracing_interops.py b/libs/core/tests/unit_tests/runnables/test_tracing_interops.py index 6cf8b8ea612..af6a5e84ce9 100644 --- a/libs/core/tests/unit_tests/runnables/test_tracing_interops.py +++ b/libs/core/tests/unit_tests/runnables/test_tracing_interops.py @@ -293,7 +293,8 @@ async def test_runnable_sequence_parallel_trace_nesting(method: str) -> None: elif method == "abatch": res = (await parent.abatch([1], {"callbacks": cb}))[0] # type: ignore else: - raise ValueError(f"Unknown method {method}") + msg = f"Unknown method {method}" + raise ValueError(msg) assert res == 3 posts = _get_posts(mock_client_) name_order = [ @@ -345,7 +346,8 @@ async def test_runnable_sequence_parallel_trace_nesting(method: str) -> None: ), f"{name} not after {name_order[i-1]}" prev_dotted_order = dotted_order if name in dotted_order_map: - raise ValueError(f"Duplicate name {name}") + msg = f"Duplicate name {name}" + raise ValueError(msg) dotted_order_map[name] = dotted_order id_map[name] = posts[i]["id"] parent_id_map[name] = posts[i].get("parent_run_id") diff --git a/libs/core/tests/unit_tests/test_imports.py b/libs/core/tests/unit_tests/test_imports.py index ed336df0c31..d046976e8e5 100644 --- a/libs/core/tests/unit_tests/test_imports.py +++ b/libs/core/tests/unit_tests/test_imports.py @@ -52,4 +52,5 @@ def test_importable_all_via_subprocess() -> None: result = future.result() # Will raise an exception if the callable raised code, module_name = result if code != 0: - raise ValueError(f"Failed to import {module_name}.") + msg = f"Failed to import {module_name}." + raise ValueError(msg) diff --git a/libs/core/tests/unit_tests/utils/test_pydantic.py b/libs/core/tests/unit_tests/utils/test_pydantic.py index 8ba4beeab76..01e5657866f 100644 --- a/libs/core/tests/unit_tests/utils/test_pydantic.py +++ b/libs/core/tests/unit_tests/utils/test_pydantic.py @@ -106,7 +106,8 @@ def test_is_basemodel_subclass() -> None: assert is_basemodel_subclass(BaseModelV1) else: - raise ValueError(f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}") + msg = f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise ValueError(msg) def test_is_basemodel_instance() -> None: @@ -132,7 +133,8 @@ def test_is_basemodel_instance() -> None: assert is_basemodel_instance(Bar(x=5)) else: - raise ValueError(f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}") + msg = f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}" + raise ValueError(msg) @pytest.mark.skipif(PYDANTIC_MAJOR_VERSION != 2, reason="Only tests Pydantic v2") diff --git a/libs/core/tests/unit_tests/utils/test_utils.py b/libs/core/tests/unit_tests/utils/test_utils.py index 68ad11b3e96..806ace226e5 100644 --- a/libs/core/tests/unit_tests/utils/test_utils.py +++ b/libs/core/tests/unit_tests/utils/test_utils.py @@ -177,7 +177,8 @@ def test_guard_import( elif package is not None and pip_name is not None: ret = guard_import(module_name, pip_name=pip_name, package=package) else: - raise ValueError("Invalid test case") + msg = "Invalid test case" + raise ValueError(msg) assert ret == expected @@ -204,7 +205,8 @@ def test_guard_import_failure( elif package is not None and pip_name is not None: guard_import(module_name, pip_name=pip_name, package=package) else: - raise ValueError("Invalid test case") + msg = "Invalid test case" + raise ValueError(msg) pip_name = pip_name or module_name.split(".")[0].replace("_", "-") err_msg = ( f"Could not import {module_name} python package. " From 5c826faece7aa5ade4d39e9fb09198dffc2b19c8 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Mon, 7 Oct 2024 15:20:47 -0700 Subject: [PATCH 48/62] core: update make format to fix all autofixable things (#27174) --- libs/core/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/core/Makefile b/libs/core/Makefile index 1582fcd4784..d6d84f09117 100644 --- a/libs/core/Makefile +++ b/libs/core/Makefile @@ -46,7 +46,7 @@ lint lint_diff lint_package lint_tests: format format_diff: [ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES) + [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --fix $(PYTHON_FILES) spell_check: poetry run codespell --toml pyproject.toml From 16f5fdb38b307ee3f3b5065f671b28c90661b698 Mon Sep 17 00:00:00 2001 From: Christophe Bornet Date: Tue, 8 Oct 2024 00:30:27 +0200 Subject: [PATCH 49/62] core: Add various ruff rules (#26836) Adds - ASYNC - COM - DJ - EXE - FLY - FURB - ICN - INT - LOG - NPY - PD - Q - RSE - SLOT - T10 - TID - YTT Co-authored-by: Erick Friis --- libs/core/langchain_core/embeddings/fake.py | 6 +-- .../langchain_core/language_models/base.py | 2 +- .../language_models/chat_models.py | 4 +- .../langchain_core/language_models/llms.py | 2 +- .../output_parsers/openai_functions.py | 2 +- .../output_parsers/openai_tools.py | 2 +- .../output_parsers/transform.py | 2 +- libs/core/langchain_core/prompts/chat.py | 2 +- libs/core/langchain_core/prompts/few_shot.py | 2 +- libs/core/langchain_core/prompts/image.py | 2 +- .../langchain_core/runnables/graph_mermaid.py | 10 ++++- libs/core/langchain_core/utils/utils.py | 2 +- libs/core/pyproject.toml | 38 ++++++++++++++++++- .../chat_history/test_chat_history.py | 4 +- .../language_models/chat_models/test_base.py | 4 +- .../language_models/llms/test_base.py | 4 +- .../output_parsers/test_base_parsers.py | 2 +- .../unit_tests/runnables/test_fallbacks.py | 16 ++++---- .../tests/unit_tests/runnables/test_graph.py | 4 +- .../unit_tests/runnables/test_runnable.py | 23 ++++++++--- .../runnables/test_runnable_events_v2.py | 2 +- .../tests/unit_tests/runnables/test_utils.py | 2 +- libs/core/tests/unit_tests/stubs.py | 2 + libs/core/tests/unit_tests/test_messages.py | 2 +- libs/core/tests/unit_tests/test_tools.py | 10 ++--- .../unit_tests/vectorstores/test_in_memory.py | 6 +-- .../vectorstores/test_vectorstore.py | 4 +- 27 files changed, 108 insertions(+), 53 deletions(-) diff --git a/libs/core/langchain_core/embeddings/fake.py b/libs/core/langchain_core/embeddings/fake.py index b5286a9a09c..6f7c4241d54 100644 --- a/libs/core/langchain_core/embeddings/fake.py +++ b/libs/core/langchain_core/embeddings/fake.py @@ -53,7 +53,7 @@ class FakeEmbeddings(Embeddings, BaseModel): def _get_embedding(self) -> list[float]: import numpy as np # type: ignore[import-not-found, import-untyped] - return list(np.random.normal(size=self.size)) + return list(np.random.default_rng().normal(size=self.size)) def embed_documents(self, texts: list[str]) -> list[list[float]]: return [self._get_embedding() for _ in texts] @@ -109,8 +109,8 @@ class DeterministicFakeEmbedding(Embeddings, BaseModel): import numpy as np # type: ignore[import-not-found, import-untyped] # set the seed for the random generator - np.random.seed(seed) - return list(np.random.normal(size=self.size)) + rng = np.random.default_rng(seed) + return list(rng.normal(size=self.size)) def _get_seed(self, text: str) -> int: """Get a seed for the random generator, using the hash of the text.""" diff --git a/libs/core/langchain_core/language_models/base.py b/libs/core/langchain_core/language_models/base.py index d1ac7891d85..5e60c890a47 100644 --- a/libs/core/langchain_core/language_models/base.py +++ b/libs/core/langchain_core/language_models/base.py @@ -237,7 +237,7 @@ class BaseLanguageModel( """Not implemented on this class.""" # Implement this on child class if there is a way of steering the model to # generate responses that match a given schema. - raise NotImplementedError() + raise NotImplementedError @deprecated("0.1.7", alternative="invoke", removal="1.0") @abstractmethod diff --git a/libs/core/langchain_core/language_models/chat_models.py b/libs/core/langchain_core/language_models/chat_models.py index ad238eda459..39fd11c247f 100644 --- a/libs/core/langchain_core/language_models/chat_models.py +++ b/libs/core/langchain_core/language_models/chat_models.py @@ -977,7 +977,7 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any, ) -> Iterator[ChatGenerationChunk]: - raise NotImplementedError() + raise NotImplementedError async def _astream( self, @@ -1112,7 +1112,7 @@ class BaseChatModel(BaseLanguageModel[BaseMessage], ABC): ], **kwargs: Any, ) -> Runnable[LanguageModelInput, BaseMessage]: - raise NotImplementedError() + raise NotImplementedError def with_structured_output( self, diff --git a/libs/core/langchain_core/language_models/llms.py b/libs/core/langchain_core/language_models/llms.py index c247078a3a8..7fd47e627d7 100644 --- a/libs/core/langchain_core/language_models/llms.py +++ b/libs/core/langchain_core/language_models/llms.py @@ -698,7 +698,7 @@ class BaseLLM(BaseLanguageModel[str], ABC): Returns: An iterator of GenerationChunks. """ - raise NotImplementedError() + raise NotImplementedError async def _astream( self, diff --git a/libs/core/langchain_core/output_parsers/openai_functions.py b/libs/core/langchain_core/output_parsers/openai_functions.py index d61533855fd..66b8865a1ea 100644 --- a/libs/core/langchain_core/output_parsers/openai_functions.py +++ b/libs/core/langchain_core/output_parsers/openai_functions.py @@ -151,7 +151,7 @@ class JsonOutputFunctionsParser(BaseCumulativeTransformOutputParser[Any]): Returns: The parsed JSON object. """ - raise NotImplementedError() + raise NotImplementedError class JsonKeyOutputFunctionsParser(JsonOutputFunctionsParser): diff --git a/libs/core/langchain_core/output_parsers/openai_tools.py b/libs/core/langchain_core/output_parsers/openai_tools.py index 9e768e5da44..2944eff4223 100644 --- a/libs/core/langchain_core/output_parsers/openai_tools.py +++ b/libs/core/langchain_core/output_parsers/openai_tools.py @@ -207,7 +207,7 @@ class JsonOutputToolsParser(BaseCumulativeTransformOutputParser[Any]): Returns: The parsed tool calls. """ - raise NotImplementedError() + raise NotImplementedError class JsonOutputKeyToolsParser(JsonOutputToolsParser): diff --git a/libs/core/langchain_core/output_parsers/transform.py b/libs/core/langchain_core/output_parsers/transform.py index 8367681d56b..0636d2d661b 100644 --- a/libs/core/langchain_core/output_parsers/transform.py +++ b/libs/core/langchain_core/output_parsers/transform.py @@ -106,7 +106,7 @@ class BaseCumulativeTransformOutputParser(BaseTransformOutputParser[T]): Returns: The diff between the previous and current parsed output. """ - raise NotImplementedError() + raise NotImplementedError def _transform(self, input: Iterator[Union[str, BaseMessage]]) -> Iterator[Any]: prev_parsed = None diff --git a/libs/core/langchain_core/prompts/chat.py b/libs/core/langchain_core/prompts/chat.py index e3771ab40a6..111aed89b3c 100644 --- a/libs/core/langchain_core/prompts/chat.py +++ b/libs/core/langchain_core/prompts/chat.py @@ -1336,7 +1336,7 @@ class ChatPromptTemplate(BaseChatPromptTemplate): Args: file_path: path to file. """ - raise NotImplementedError() + raise NotImplementedError def pretty_repr(self, html: bool = False) -> str: """Human-readable representation. diff --git a/libs/core/langchain_core/prompts/few_shot.py b/libs/core/langchain_core/prompts/few_shot.py index 54c004c23d6..96e70c17d95 100644 --- a/libs/core/langchain_core/prompts/few_shot.py +++ b/libs/core/langchain_core/prompts/few_shot.py @@ -464,4 +464,4 @@ class FewShotChatMessagePromptTemplate( Returns: A pretty representation of the prompt template. """ - raise NotImplementedError() + raise NotImplementedError diff --git a/libs/core/langchain_core/prompts/image.py b/libs/core/langchain_core/prompts/image.py index 5e76cea59de..a75a5eece0f 100644 --- a/libs/core/langchain_core/prompts/image.py +++ b/libs/core/langchain_core/prompts/image.py @@ -132,4 +132,4 @@ class ImagePromptTemplate(BasePromptTemplate[ImageURL]): Returns: A pretty representation of the prompt. """ - raise NotImplementedError() + raise NotImplementedError diff --git a/libs/core/langchain_core/runnables/graph_mermaid.py b/libs/core/langchain_core/runnables/graph_mermaid.py index 70b8e4865b5..2c8319f027b 100644 --- a/libs/core/langchain_core/runnables/graph_mermaid.py +++ b/libs/core/langchain_core/runnables/graph_mermaid.py @@ -1,3 +1,4 @@ +import asyncio import base64 import re from dataclasses import asdict @@ -289,9 +290,14 @@ async def _render_mermaid_using_pyppeteer( img_bytes = await page.screenshot({"fullPage": False}) await browser.close() + def write_to_file(path: str, bytes: bytes) -> None: + with open(path, "wb") as file: + file.write(bytes) + if output_file_path is not None: - with open(output_file_path, "wb") as file: - file.write(img_bytes) + await asyncio.get_event_loop().run_in_executor( + None, write_to_file, output_file_path, img_bytes + ) return img_bytes diff --git a/libs/core/langchain_core/utils/utils.py b/libs/core/langchain_core/utils/utils.py index 94f356da331..c66ed52228c 100644 --- a/libs/core/langchain_core/utils/utils.py +++ b/libs/core/langchain_core/utils/utils.py @@ -453,7 +453,7 @@ def secret_from_env( return SecretStr(os.environ[key]) if isinstance(default, str): return SecretStr(default) - elif isinstance(default, type(None)): + elif default is None: return None else: if error_message: diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index 365db50c53b..80ef45805d2 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -44,8 +44,42 @@ python = ">=3.12.4" [tool.poetry.extras] [tool.ruff.lint] -select = [ "B", "C4", "E", "EM", "F", "I", "N", "PIE", "SIM", "T201", "UP", "W",] -ignore = [ "UP007", "W293",] +select = [ + "ASYNC", + "B", + "C4", + "COM", + "DJ", + "E", + "EM", + "EXE", + "F", + "FLY", + "FURB", + "I", + "ICN", + "INT", + "LOG", + "N", + "NPY", + "PD", + "PIE", + "Q", + "RSE", + "SIM", + "SLOT", + "T10", + "T201", + "TID", + "UP", + "W", + "YTT" +] +ignore = [ + "COM812", # Messes with the formatter + "UP007", # Incompatible with pydantic + Python 3.9 + "W293", # +] [tool.coverage.run] omit = [ "tests/*",] diff --git a/libs/core/tests/unit_tests/chat_history/test_chat_history.py b/libs/core/tests/unit_tests/chat_history/test_chat_history.py index 729f15381c1..eb7690335f9 100644 --- a/libs/core/tests/unit_tests/chat_history/test_chat_history.py +++ b/libs/core/tests/unit_tests/chat_history/test_chat_history.py @@ -17,7 +17,7 @@ def test_add_message_implementation_only() -> None: def clear(self) -> None: """Clear the store.""" - raise NotImplementedError() + raise NotImplementedError store: list[BaseMessage] = [] chat_history = SampleChatHistory(store=store) @@ -50,7 +50,7 @@ def test_bulk_message_implementation_only() -> None: def clear(self) -> None: """Clear the store.""" - raise NotImplementedError() + raise NotImplementedError chat_history = BulkAddHistory(store=store) chat_history.add_message(HumanMessage(content="Hello")) diff --git a/libs/core/tests/unit_tests/language_models/chat_models/test_base.py b/libs/core/tests/unit_tests/language_models/chat_models/test_base.py index 85f6d5bee1d..2cd08a27d03 100644 --- a/libs/core/tests/unit_tests/language_models/chat_models/test_base.py +++ b/libs/core/tests/unit_tests/language_models/chat_models/test_base.py @@ -165,7 +165,7 @@ async def test_astream_implementation_fallback_to_stream() -> None: **kwargs: Any, ) -> ChatResult: """Top Level call""" - raise NotImplementedError() + raise NotImplementedError def _stream( self, @@ -210,7 +210,7 @@ async def test_astream_implementation_uses_astream() -> None: **kwargs: Any, ) -> ChatResult: """Top Level call""" - raise NotImplementedError() + raise NotImplementedError async def _astream( # type: ignore self, diff --git a/libs/core/tests/unit_tests/language_models/llms/test_base.py b/libs/core/tests/unit_tests/language_models/llms/test_base.py index 9c995f924ce..f8ff2fdc4f2 100644 --- a/libs/core/tests/unit_tests/language_models/llms/test_base.py +++ b/libs/core/tests/unit_tests/language_models/llms/test_base.py @@ -161,7 +161,7 @@ async def test_astream_implementation_fallback_to_stream() -> None: **kwargs: Any, ) -> LLMResult: """Top Level call""" - raise NotImplementedError() + raise NotImplementedError def _stream( self, @@ -198,7 +198,7 @@ async def test_astream_implementation_uses_astream() -> None: **kwargs: Any, ) -> LLMResult: """Top Level call""" - raise NotImplementedError() + raise NotImplementedError async def _astream( self, diff --git a/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py b/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py index c4c97292b01..49f04911265 100644 --- a/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py +++ b/libs/core/tests/unit_tests/output_parsers/test_base_parsers.py @@ -59,7 +59,7 @@ def test_base_transform_output_parser() -> None: def parse(self, text: str) -> str: """Parse a single string into a specific format.""" - raise NotImplementedError() + raise NotImplementedError def parse_result( self, result: list[Generation], *, partial: bool = False diff --git a/libs/core/tests/unit_tests/runnables/test_fallbacks.py b/libs/core/tests/unit_tests/runnables/test_fallbacks.py index 69ea68ba9af..731b3ddaa62 100644 --- a/libs/core/tests/unit_tests/runnables/test_fallbacks.py +++ b/libs/core/tests/unit_tests/runnables/test_fallbacks.py @@ -61,13 +61,13 @@ def chain() -> Runnable: def _raise_error(inputs: dict) -> str: - raise ValueError() + raise ValueError def _dont_raise_error(inputs: dict) -> str: if "exception" in inputs: return "bar" - raise ValueError() + raise ValueError @pytest.fixture() @@ -99,11 +99,11 @@ def _runnable(inputs: dict) -> str: if inputs["text"] == "foo": return "first" if "exception" not in inputs: - raise ValueError() + raise ValueError if inputs["text"] == "bar": return "second" if isinstance(inputs["exception"], ValueError): - raise RuntimeError() + raise RuntimeError return "third" @@ -251,13 +251,13 @@ def _generate(input: Iterator) -> Iterator[str]: def _generate_immediate_error(input: Iterator) -> Iterator[str]: - raise ValueError() + raise ValueError yield "" def _generate_delayed_error(input: Iterator) -> Iterator[str]: yield "" - raise ValueError() + raise ValueError def test_fallbacks_stream() -> None: @@ -279,13 +279,13 @@ async def _agenerate(input: AsyncIterator) -> AsyncIterator[str]: async def _agenerate_immediate_error(input: AsyncIterator) -> AsyncIterator[str]: - raise ValueError() + raise ValueError yield "" async def _agenerate_delayed_error(input: AsyncIterator) -> AsyncIterator[str]: yield "" - raise ValueError() + raise ValueError async def test_fallbacks_astream() -> None: diff --git a/libs/core/tests/unit_tests/runnables/test_graph.py b/libs/core/tests/unit_tests/runnables/test_graph.py index 870842bcc49..8898b64c01f 100644 --- a/libs/core/tests/unit_tests/runnables/test_graph.py +++ b/libs/core/tests/unit_tests/runnables/test_graph.py @@ -356,7 +356,7 @@ def test_runnable_get_graph_with_invalid_input_type() -> None: @property @override def InputType(self) -> type: - raise TypeError() + raise TypeError @override def invoke( @@ -381,7 +381,7 @@ def test_runnable_get_graph_with_invalid_output_type() -> None: @property @override def OutputType(self) -> type: - raise TypeError() + raise TypeError @override def invoke( diff --git a/libs/core/tests/unit_tests/runnables/test_runnable.py b/libs/core/tests/unit_tests/runnables/test_runnable.py index 6fdf76bf03f..a58e81dc362 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable.py @@ -653,7 +653,7 @@ def test_with_types_with_type_generics() -> None: def foo(x: int) -> None: """Add one to the input.""" - raise NotImplementedError() + raise NotImplementedError # Try specifying some RunnableLambda(foo).with_types( @@ -3980,7 +3980,7 @@ def test_seq_batch_return_exceptions(mocker: MockerFixture) -> None: def invoke( self, input: Any, config: Optional[RunnableConfig] = None, **kwargs: Any ) -> Any: - raise NotImplementedError() + raise NotImplementedError def _batch( self, @@ -4101,7 +4101,7 @@ async def test_seq_abatch_return_exceptions(mocker: MockerFixture) -> None: def invoke( self, input: Any, config: Optional[RunnableConfig] = None, **kwargs: Any ) -> Any: - raise NotImplementedError() + raise NotImplementedError async def _abatch( self, @@ -5352,7 +5352,7 @@ async def test_listeners_async() -> None: assert value2 in shared_state.values(), "Value not found in the dictionary." -async def test_closing_iterator_doesnt_raise_error() -> None: +def test_closing_iterator_doesnt_raise_error() -> None: """Test that closing an iterator calls on_chain_end rather than on_chain_error.""" import time @@ -5361,9 +5361,10 @@ async def test_closing_iterator_doesnt_raise_error() -> None: from langchain_core.output_parsers import StrOutputParser on_chain_error_triggered = False + on_chain_end_triggered = False class MyHandler(BaseCallbackHandler): - async def on_chain_error( + def on_chain_error( self, error: BaseException, *, @@ -5376,6 +5377,17 @@ async def test_closing_iterator_doesnt_raise_error() -> None: nonlocal on_chain_error_triggered on_chain_error_triggered = True + def on_chain_end( + self, + outputs: dict[str, Any], + *, + run_id: UUID, + parent_run_id: Optional[UUID] = None, + **kwargs: Any, + ) -> None: + nonlocal on_chain_end_triggered + on_chain_end_triggered = True + llm = GenericFakeChatModel(messages=iter(["hi there"])) chain = llm | StrOutputParser() chain_ = chain.with_config({"callbacks": [MyHandler()]}) @@ -5386,6 +5398,7 @@ async def test_closing_iterator_doesnt_raise_error() -> None: # Wait for a bit to make sure that the callback is called. time.sleep(0.05) assert on_chain_error_triggered is False + assert on_chain_end_triggered is True def test_pydantic_protected_namespaces() -> None: diff --git a/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py b/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py index afc05ae39f6..8ceb4bf38b5 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable_events_v2.py @@ -2067,7 +2067,7 @@ class StreamingRunnable(Runnable[Input, Output]): config: Optional[RunnableConfig] = None, **kwargs: Optional[Any], ) -> Iterator[Output]: - raise NotImplementedError() + raise NotImplementedError async def astream( self, diff --git a/libs/core/tests/unit_tests/runnables/test_utils.py b/libs/core/tests/unit_tests/runnables/test_utils.py index c07a33da3d3..27d1272ee27 100644 --- a/libs/core/tests/unit_tests/runnables/test_utils.py +++ b/libs/core/tests/unit_tests/runnables/test_utils.py @@ -19,7 +19,7 @@ from langchain_core.runnables.utils import ( [ (lambda x: x * 2, "lambda x: x * 2"), (lambda a, b: a + b, "lambda a, b: a + b"), - (lambda x: x if x > 0 else 0, "lambda x: x if x > 0 else 0"), + (lambda x: x if x > 0 else 0, "lambda x: x if x > 0 else 0"), # noqa: FURB136 ], ) def test_get_lambda_source(func: Callable, expected_source: str) -> None: diff --git a/libs/core/tests/unit_tests/stubs.py b/libs/core/tests/unit_tests/stubs.py index 95f36b72b0f..8fdeccfc7d8 100644 --- a/libs/core/tests/unit_tests/stubs.py +++ b/libs/core/tests/unit_tests/stubs.py @@ -5,6 +5,8 @@ from langchain_core.messages import AIMessage, AIMessageChunk, HumanMessage class AnyStr(str): + __slots__ = () + def __eq__(self, other: Any) -> bool: return isinstance(other, str) diff --git a/libs/core/tests/unit_tests/test_messages.py b/libs/core/tests/unit_tests/test_messages.py index 1a6e0f8f9ed..aafcd15e1bb 100644 --- a/libs/core/tests/unit_tests/test_messages.py +++ b/libs/core/tests/unit_tests/test_messages.py @@ -346,7 +346,7 @@ class TestGetBufferString(unittest.TestCase): self.chat_msg, self.tool_calls_msg, ] - expected_output = "\n".join( + expected_output = "\n".join( # noqa: FLY002 [ "Human: human", "AI: ai", diff --git a/libs/core/tests/unit_tests/test_tools.py b/libs/core/tests/unit_tests/test_tools.py index 3eae40ede1e..f77b473d39f 100644 --- a/libs/core/tests/unit_tests/test_tools.py +++ b/libs/core/tests/unit_tests/test_tools.py @@ -401,7 +401,7 @@ def test_structured_tool_from_function_docstring() -> None: bar: the bar value baz: the baz value """ - raise NotImplementedError() + raise NotImplementedError structured_tool = StructuredTool.from_function(foo) assert structured_tool.name == "foo" @@ -435,7 +435,7 @@ def test_structured_tool_from_function_docstring_complex_args() -> None: bar: int baz: List[str] """ - raise NotImplementedError() + raise NotImplementedError structured_tool = StructuredTool.from_function(foo) assert structured_tool.name == "foo" @@ -781,7 +781,7 @@ def test_structured_tool_from_function() -> None: bar: the bar value baz: the baz value """ - raise NotImplementedError() + raise NotImplementedError structured_tool = StructuredTool.from_function(foo) assert structured_tool.name == "foo" @@ -854,7 +854,7 @@ def test_validation_error_handling_non_validation_error( self, tool_input: Union[str, dict], ) -> Union[str, dict[str, Any]]: - raise NotImplementedError() + raise NotImplementedError def _run(self) -> str: return "dummy" @@ -916,7 +916,7 @@ async def test_async_validation_error_handling_non_validation_error( self, tool_input: Union[str, dict], ) -> Union[str, dict[str, Any]]: - raise NotImplementedError() + raise NotImplementedError def _run(self) -> str: return "dummy" diff --git a/libs/core/tests/unit_tests/vectorstores/test_in_memory.py b/libs/core/tests/unit_tests/vectorstores/test_in_memory.py index 5373d022dbf..1ab61868826 100644 --- a/libs/core/tests/unit_tests/vectorstores/test_in_memory.py +++ b/libs/core/tests/unit_tests/vectorstores/test_in_memory.py @@ -39,7 +39,7 @@ async def test_inmemory_similarity_search() -> None: output = await store.asimilarity_search("bar", k=2) assert output == [ _any_id_document(page_content="bar"), - _any_id_document(page_content="baz"), + _any_id_document(page_content="foo"), ] @@ -81,7 +81,7 @@ async def test_inmemory_mmr() -> None: output = docsearch.max_marginal_relevance_search("foo", k=10, lambda_mult=0.1) assert len(output) == len(texts) assert output[0] == _any_id_document(page_content="foo") - assert output[1] == _any_id_document(page_content="foy") + assert output[1] == _any_id_document(page_content="fou") # Check async version output = await docsearch.amax_marginal_relevance_search( @@ -89,7 +89,7 @@ async def test_inmemory_mmr() -> None: ) assert len(output) == len(texts) assert output[0] == _any_id_document(page_content="foo") - assert output[1] == _any_id_document(page_content="foy") + assert output[1] == _any_id_document(page_content="fou") async def test_inmemory_dump_load(tmp_path: Path) -> None: diff --git a/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py b/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py index aba1481c623..a0472b70cda 100644 --- a/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py +++ b/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py @@ -63,7 +63,7 @@ class CustomAddTextsVectorstore(VectorStore): def similarity_search( self, query: str, k: int = 4, **kwargs: Any ) -> list[Document]: - raise NotImplementedError() + raise NotImplementedError class CustomAddDocumentsVectorstore(VectorStore): @@ -107,7 +107,7 @@ class CustomAddDocumentsVectorstore(VectorStore): def similarity_search( self, query: str, k: int = 4, **kwargs: Any ) -> list[Document]: - raise NotImplementedError() + raise NotImplementedError @pytest.mark.parametrize( From 8d27325dbc987a79edd841d7e78759c9c9aad139 Mon Sep 17 00:00:00 2001 From: Vadym Barda Date: Tue, 8 Oct 2024 10:19:04 -0400 Subject: [PATCH 50/62] core[patch]: support ValidationError from pydantic v1 in tools (#27194) --- libs/core/langchain_core/tools/base.py | 11 +++++++---- libs/core/tests/unit_tests/test_tools.py | 13 +++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/libs/core/langchain_core/tools/base.py b/libs/core/langchain_core/tools/base.py index 88c787558ff..4de0452020f 100644 --- a/libs/core/langchain_core/tools/base.py +++ b/libs/core/langchain_core/tools/base.py @@ -35,6 +35,7 @@ from pydantic import ( validate_arguments, ) from pydantic.v1 import BaseModel as BaseModelV1 +from pydantic.v1 import ValidationError as ValidationErrorV1 from pydantic.v1 import validate_arguments as validate_arguments_v1 from langchain_core._api import deprecated @@ -404,7 +405,7 @@ class ChildTool(BaseTool): """Handle the content of the ToolException thrown.""" handle_validation_error: Optional[ - Union[bool, str, Callable[[ValidationError], str]] + Union[bool, str, Callable[[Union[ValidationError, ValidationErrorV1]], str]] ] = False """Handle the content of the ValidationError thrown.""" @@ -667,7 +668,7 @@ class ChildTool(BaseTool): else: content = response status = "success" - except ValidationError as e: + except (ValidationError, ValidationErrorV1) as e: if not self.handle_validation_error: error_to_raise = e else: @@ -819,9 +820,11 @@ def _is_tool_call(x: Any) -> bool: def _handle_validation_error( - e: ValidationError, + e: Union[ValidationError, ValidationErrorV1], *, - flag: Union[Literal[True], str, Callable[[ValidationError], str]], + flag: Union[ + Literal[True], str, Callable[[Union[ValidationError, ValidationErrorV1]], str] + ], ) -> str: if isinstance(flag, bool): content = "Tool input validation error" diff --git a/libs/core/tests/unit_tests/test_tools.py b/libs/core/tests/unit_tests/test_tools.py index f77b473d39f..065e36c8668 100644 --- a/libs/core/tests/unit_tests/test_tools.py +++ b/libs/core/tests/unit_tests/test_tools.py @@ -22,6 +22,7 @@ from typing import ( import pytest from pydantic import BaseModel, Field, ValidationError from pydantic.v1 import BaseModel as BaseModelV1 +from pydantic.v1 import ValidationError as ValidationErrorV1 from typing_extensions import TypedDict from langchain_core import tools @@ -825,7 +826,7 @@ def test_validation_error_handling_callable() -> None: """Test that validation errors are handled correctly.""" expected = "foo bar" - def handling(e: ValidationError) -> str: + def handling(e: Union[ValidationError, ValidationErrorV1]) -> str: return expected _tool = _MockStructuredTool(handle_validation_error=handling) @@ -842,7 +843,9 @@ def test_validation_error_handling_callable() -> None: ], ) def test_validation_error_handling_non_validation_error( - handler: Union[bool, str, Callable[[ValidationError], str]], + handler: Union[ + bool, str, Callable[[Union[ValidationError, ValidationErrorV1]], str] + ], ) -> None: """Test that validation errors are handled correctly.""" @@ -887,7 +890,7 @@ async def test_async_validation_error_handling_callable() -> None: """Test that validation errors are handled correctly.""" expected = "foo bar" - def handling(e: ValidationError) -> str: + def handling(e: Union[ValidationError, ValidationErrorV1]) -> str: return expected _tool = _MockStructuredTool(handle_validation_error=handling) @@ -904,7 +907,9 @@ async def test_async_validation_error_handling_callable() -> None: ], ) async def test_async_validation_error_handling_non_validation_error( - handler: Union[bool, str, Callable[[ValidationError], str]], + handler: Union[ + bool, str, Callable[[Union[ValidationError, ValidationErrorV1]], str] + ], ) -> None: """Test that validation errors are handled correctly.""" From ea9a59bcf52eda76126a1f713f5eb4924494b215 Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Tue, 8 Oct 2024 10:03:18 -0700 Subject: [PATCH 51/62] docs: `integrations` updates 17 (#27015) Added missed provider pages. Added missed descriptions and links. I fixed the Ipex-LLM titles, so the ToC is now sorted properly for these titles. --------- Co-authored-by: Erick Friis --- docs/docs/integrations/providers/baai.mdx | 44 +++++++++++++++++++ docs/docs/integrations/providers/jina.mdx | 33 ++++++++++---- .../text_embedding/ipex_llm.ipynb | 20 +++++++-- .../text_embedding/ipex_llm_gpu.ipynb | 20 +++++++-- .../integrations/text_embedding/jina.ipynb | 8 +++- .../integrations/tools/sql_database.ipynb | 26 +++++++---- 6 files changed, 126 insertions(+), 25 deletions(-) create mode 100644 docs/docs/integrations/providers/baai.mdx diff --git a/docs/docs/integrations/providers/baai.mdx b/docs/docs/integrations/providers/baai.mdx new file mode 100644 index 00000000000..58ff1152ef8 --- /dev/null +++ b/docs/docs/integrations/providers/baai.mdx @@ -0,0 +1,44 @@ +# BAAI + +>[Beijing Academy of Artificial Intelligence (BAAI) (Wikipedia)](https://en.wikipedia.org/wiki/Beijing_Academy_of_Artificial_Intelligence), +> also known as `Zhiyuan Institute`, is a Chinese non-profit artificial +> intelligence (AI) research laboratory. `BAAI` conducts AI research +> and is dedicated to promoting collaboration among academia and industry, +> as well as fostering top talent and a focus on long-term research on +> the fundamentals of AI technology. As a collaborative hub, BAAI's founding +> members include leading AI companies, universities, and research institutes. + + +## Embedding Models + +### HuggingFaceBgeEmbeddings + +>[BGE models on the HuggingFace](https://huggingface.co/BAAI/bge-large-en-v1.5) +> are one of [the best open-source embedding models](https://huggingface.co/spaces/mteb/leaderboard). + +See a [usage example](/docs/integrations/text_embedding/bge_huggingface). + +```python +from langchain_community.embeddings import HuggingFaceBgeEmbeddings +``` + +### IpexLLMBgeEmbeddings + +>[IPEX-LLM](https://github.com/intel-analytics/ipex-llm) is a PyTorch +> library for running LLM on Intel CPU and GPU (e.g., local PC with iGPU, +> discrete GPU such as Arc, Flex and Max) with very low latency. + +See a [usage example running model on Intel CPU](/docs/integrations/text_embedding/ipex_llm). +See a [usage example running model on Intel GPU](/docs/integrations/text_embedding/ipex_llm_gpu). + +```python +from langchain_community.embeddings import IpexLLMBgeEmbeddings +``` + +### QuantizedBgeEmbeddings + +See a [usage example](/docs/integrations/text_embedding/itrex). + +```python +from langchain_community.embeddings import QuantizedBgeEmbeddings +``` diff --git a/docs/docs/integrations/providers/jina.mdx b/docs/docs/integrations/providers/jina.mdx index 057ace079fa..5262889c37d 100644 --- a/docs/docs/integrations/providers/jina.mdx +++ b/docs/docs/integrations/providers/jina.mdx @@ -1,20 +1,35 @@ -# Jina +# Jina AI -This page covers how to use the Jina Embeddings within LangChain. -It is broken into two parts: installation and setup, and then references to specific Jina wrappers. +>[Jina AI](https://jina.ai/about-us) is a search AI company. `Jina` helps businesses and developers unlock multimodal data with a better search. ## Installation and Setup - Get a Jina AI API token from [here](https://jina.ai/embeddings/) and set it as an environment variable (`JINA_API_TOKEN`) -There exists a Jina Embeddings wrapper, which you can access with +## Chat Models ```python -from langchain_community.embeddings import JinaEmbeddings - -# you can pas jina_api_key, if none is passed it will be taken from `JINA_API_TOKEN` environment variable -embeddings = JinaEmbeddings(jina_api_key='jina_**', model_name='jina-embeddings-v2-base-en') +from langchain_community.chat_models import JinaChat ``` +See a [usage examples](/docs/integrations/chat/jinachat). + +## Embedding Models + You can check the list of available models from [here](https://jina.ai/embeddings/) -For a more detailed walkthrough of this, see [this notebook](/docs/integrations/text_embedding/jina) +```python +from langchain_community.embeddings import JinaEmbeddings +``` + +See a [usage examples](/docs/integrations/text_embedding/jina). + +## Document Transformers + +### Jina Rerank + +```python +from langchain_community.document_compressors import JinaRerank +``` + +See a [usage examples](/docs/integrations/document_transformers/jina_rerank). + diff --git a/docs/docs/integrations/text_embedding/ipex_llm.ipynb b/docs/docs/integrations/text_embedding/ipex_llm.ipynb index e8d7c2dd0e8..17f9fca8ca4 100644 --- a/docs/docs/integrations/text_embedding/ipex_llm.ipynb +++ b/docs/docs/integrations/text_embedding/ipex_llm.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Local BGE Embeddings with IPEX-LLM on Intel CPU\n", + "# IPEX-LLM: Local BGE Embeddings on Intel CPU\n", "\n", "> [IPEX-LLM](https://github.com/intel-analytics/ipex-llm) is a PyTorch library for running LLM on Intel CPU and GPU (e.g., local PC with iGPU, discrete GPU such as Arc, Flex and Max) with very low latency.\n", "\n", @@ -92,10 +92,24 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/docs/integrations/text_embedding/ipex_llm_gpu.ipynb b/docs/docs/integrations/text_embedding/ipex_llm_gpu.ipynb index ca3ad124e6f..70498d979d3 100644 --- a/docs/docs/integrations/text_embedding/ipex_llm_gpu.ipynb +++ b/docs/docs/integrations/text_embedding/ipex_llm_gpu.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Local BGE Embeddings with IPEX-LLM on Intel GPU\n", + "# IPEX-LLM: Local BGE Embeddings on Intel GPU\n", "\n", "> [IPEX-LLM](https://github.com/intel-analytics/ipex-llm) is a PyTorch library for running LLM on Intel CPU and GPU (e.g., local PC with iGPU, discrete GPU such as Arc, Flex and Max) with very low latency.\n", "\n", @@ -155,10 +155,24 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/docs/docs/integrations/text_embedding/jina.ipynb b/docs/docs/integrations/text_embedding/jina.ipynb index e77fe213d30..aa75ba8766e 100644 --- a/docs/docs/integrations/text_embedding/jina.ipynb +++ b/docs/docs/integrations/text_embedding/jina.ipynb @@ -5,7 +5,11 @@ "id": "1c0cf975", "metadata": {}, "source": [ - "# Jina" + "# Jina\n", + "\n", + "You can check the list of available models from [here](https://jina.ai/embeddings/).\n", + "\n", + "## Installation and setup" ] }, { @@ -231,7 +235,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/docs/docs/integrations/tools/sql_database.ipynb b/docs/docs/integrations/tools/sql_database.ipynb index ef3d63e2b26..f5be93f2c5e 100644 --- a/docs/docs/integrations/tools/sql_database.ipynb +++ b/docs/docs/integrations/tools/sql_database.ipynb @@ -209,15 +209,25 @@ }, { "cell_type": "markdown", - "id": "5f5751e3-2e98-485f-8164-db8094039c25", + "id": "4e3fd064-aa86-448d-8db3-3c55eaa5bc15", "metadata": {}, "source": [ - "API references:\n", - "\n", - "- [QuerySQLDataBaseTool](https://python.langchain.com/api_reference/community/tools/langchain_community.tools.sql_database.tool.QuerySQLDataBaseTool.html)\n", - "- [InfoSQLDatabaseTool](https://python.langchain.com/api_reference/community/tools/langchain_community.tools.sql_database.tool.InfoSQLDatabaseTool.html)\n", - "- [ListSQLDatabaseTool](https://python.langchain.com/api_reference/community/tools/langchain_community.tools.sql_database.tool.ListSQLDatabaseTool.html)\n", - "- [QuerySQLCheckerTool](https://python.langchain.com/api_reference/community/tools/langchain_community.tools.sql_database.tool.QuerySQLCheckerTool.html)" + "You can use the individual tools directly:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7fa8d00c-750c-4803-9b66-057d12b26b06", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_community.tools.sql_database.tool import (\n", + " InfoSQLDatabaseTool,\n", + " ListSQLDatabaseTool,\n", + " QuerySQLCheckerTool,\n", + " QuerySQLDataBaseTool,\n", + ")" ] }, { @@ -604,7 +614,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.10.12" } }, "nbformat": 4, From 0ec74fbc1487a088b69dddd17b5755b001bf841d Mon Sep 17 00:00:00 2001 From: Jacob Lee Date: Tue, 8 Oct 2024 10:09:07 -0700 Subject: [PATCH 52/62] =?UTF-8?q?docs:=20=F0=9F=91=A5=20Update=20LangChain?= =?UTF-8?q?=20people=20data=20(#27022)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 👥 Update LangChain people data --------- Co-authored-by: github-actions Co-authored-by: Erick Friis --- docs/data/people.yml | 641 ++++++++++++++++++------------------------- 1 file changed, 273 insertions(+), 368 deletions(-) diff --git a/docs/data/people.yml b/docs/data/people.yml index 2b22da95e02..3f600aa62dc 100644 --- a/docs/data/people.yml +++ b/docs/data/people.yml @@ -1,225 +1,155 @@ maintainers: -- login: hwchase17 - count: 1246 - avatarUrl: https://avatars.githubusercontent.com/u/11986836?u=f4c4f21a82b2af6c9f91e1f1d99ea40062f7a101&v=4 - twitterUsername: null - url: https://github.com/hwchase17 - login: baskaryan - count: 1168 + count: 1279 avatarUrl: https://avatars.githubusercontent.com/u/22008038?u=8e3d6bbd0adbe02f0bd259c44f2ddb8612f90d88&v=4 twitterUsername: null url: https://github.com/baskaryan - login: ccurme - count: 249 + count: 333 avatarUrl: https://avatars.githubusercontent.com/u/26529506?u=528b1df1ba3ba4f21e3e1fb74b12766e5b04c487&v=4 twitterUsername: null url: https://github.com/ccurme +- login: hinthornw + count: 305 + avatarUrl: https://avatars.githubusercontent.com/u/13333726?u=82ebf1e0eb0663ebd49ba66f67a43f51bbf11442&v=4 + twitterUsername: null + url: https://github.com/hinthornw - login: rlancemartin count: 128 avatarUrl: https://avatars.githubusercontent.com/u/122662504?u=e88c472fba16a74332c550cc9707fd015738a0da&v=4 twitterUsername: RLanceMartin url: https://github.com/rlancemartin - login: nfcampos - count: 236 + count: 242 avatarUrl: https://avatars.githubusercontent.com/u/56902?u=fdb30e802c68bc338dd9c0820f713e4fdac75db7&v=4 twitterUsername: nfcampos url: https://github.com/nfcampos -- login: hinthornw - count: 296 - avatarUrl: https://avatars.githubusercontent.com/u/13333726?u=82ebf1e0eb0663ebd49ba66f67a43f51bbf11442&v=4 - twitterUsername: null - url: https://github.com/hinthornw - login: agola11 count: 77 avatarUrl: https://avatars.githubusercontent.com/u/9536492?u=820809d60f4a720a4e1f507a1bf866dfb5f86614&v=4 twitterUsername: null url: https://github.com/agola11 +- login: hwchase17 + count: 1248 + avatarUrl: https://avatars.githubusercontent.com/u/11986836?u=f4c4f21a82b2af6c9f91e1f1d99ea40062f7a101&v=4 + twitterUsername: null + url: https://github.com/hwchase17 - login: vbarda - count: 9 + count: 14 avatarUrl: https://avatars.githubusercontent.com/u/19161700?u=e76bcd472b51c9f07befd2654783d0a381f49005&v=4 twitterUsername: vadymbarda url: https://github.com/vbarda +- login: efriis + count: 789 + avatarUrl: https://avatars.githubusercontent.com/u/9557659?u=44391f1f5f5e3a72acc9772ca30f28bfdcc25fac&v=4 + twitterUsername: eyfriis + url: https://github.com/efriis - login: eyurtsev - count: 568 + count: 643 avatarUrl: https://avatars.githubusercontent.com/u/3205522?v=4 twitterUsername: veryboldbagel url: https://github.com/eyurtsev -- login: efriis - count: 699 - avatarUrl: https://avatars.githubusercontent.com/u/9557659?u=44391f1f5f5e3a72acc9772ca30f28bfdcc25fac&v=4 - twitterUsername: null - url: https://github.com/efriis top_recent_contributors: - login: leo-gan - count: 38.3630229938045 + count: 26.294073035106397 avatarUrl: https://avatars.githubusercontent.com/u/2256422?v=4 twitterUsername: null url: https://github.com/leo-gan -- login: maang-h - count: 17.18973629457492 - avatarUrl: https://avatars.githubusercontent.com/u/55082429?v=4 - twitterUsername: null - url: https://github.com/maang-h - login: cbornet - count: 12.04532549715858 + count: 21.74499663341953 avatarUrl: https://avatars.githubusercontent.com/u/11633333?u=e13817e11b3fb8c3d209d747c77a0f0742d11138&v=4 twitterUsername: null url: https://github.com/cbornet +- login: maang-h + count: 12.060455262511026 + avatarUrl: https://avatars.githubusercontent.com/u/55082429?v=4 + twitterUsername: null + url: https://github.com/maang-h - login: Anush008 - count: 7.189116787127303 + count: 6.716576741360714 avatarUrl: https://avatars.githubusercontent.com/u/46051506?u=026f5f140e8b7ba4744bf971f9ebdea9ebab67ca&v=4 twitterUsername: null url: https://github.com/Anush008 -- login: B-Step62 - count: 6.060673199059597 - avatarUrl: https://avatars.githubusercontent.com/u/31463517?u=635a36cf4e20a25b5bc8cdc3aa27c613fa701cfa&v=4 - twitterUsername: null - url: https://github.com/B-Step62 - login: Raj725 - count: 5.090662028054163 + count: 6.693295190899701 avatarUrl: https://avatars.githubusercontent.com/u/17705063?v=4 twitterUsername: Raj__725 url: https://github.com/Raj725 - login: ZhangShenao - count: 4.790622533033173 + count: 5.476597159935018 avatarUrl: https://avatars.githubusercontent.com/u/24444502?u=324d8acd5a220bfd93b1b46dac1d9d1d82d7d516&v=4 twitterUsername: null url: https://github.com/ZhangShenao -- login: wenngong - count: 4.337367990270534 - avatarUrl: https://avatars.githubusercontent.com/u/76683249?u=3f2d197d1391ab3d27cc8be37ac48e6912564204&v=4 - twitterUsername: null - url: https://github.com/wenngong -- login: tomasonjo - count: 4.260052782743622 - avatarUrl: https://avatars.githubusercontent.com/u/19948365?v=4 - twitterUsername: tb_tomaz - url: https://github.com/tomasonjo - login: shurrey - count: 3.922271810088077 + count: 5.009117276243888 avatarUrl: https://avatars.githubusercontent.com/u/886516?u=9ee4c1643932282abedaf432a5e39c76ca260700&v=4 twitterUsername: shurrey url: https://github.com/shurrey - login: bjchambers - count: 3.695536682862132 + count: 4.444292076157851 avatarUrl: https://avatars.githubusercontent.com/u/35960?v=4 twitterUsername: null url: https://github.com/bjchambers -- login: caseyclements - count: 3.689541019409881 - avatarUrl: https://avatars.githubusercontent.com/u/737181?u=037bd3004f6c333108d7b32a4c8f96f2e8d57e78&v=4 +- login: tomasonjo + count: 4.307077471703467 + avatarUrl: https://avatars.githubusercontent.com/u/19948365?v=4 + twitterUsername: tb_tomaz + url: https://github.com/tomasonjo +- login: B-Step62 + count: 4.037149604705943 + avatarUrl: https://avatars.githubusercontent.com/u/31463517?u=635a36cf4e20a25b5bc8cdc3aa27c613fa701cfa&v=4 twitterUsername: null - url: https://github.com/caseyclements -- login: keenborder786 - count: 3.21357927137795 - avatarUrl: https://avatars.githubusercontent.com/u/45242107?u=bf122f1371d59c3ba69a87225255fbd00e894404&v=4 - twitterUsername: null - url: https://github.com/keenborder786 -- login: nithishr - count: 2.8620727105628907 - avatarUrl: https://avatars.githubusercontent.com/u/12782505?u=a3f1c6e7e68b96bb7be08ecd25f74f2396394597&v=4 - twitterUsername: nithishr - url: https://github.com/nithishr -- login: Coniferish - count: 2.844584376084463 - avatarUrl: https://avatars.githubusercontent.com/u/43506685?u=20e4be682f43988bd43b039a801856498e31c764&v=4 - twitterUsername: null - url: https://github.com/Coniferish -- login: MateuszOssGit - count: 2.780952207886384 - avatarUrl: https://avatars.githubusercontent.com/u/139469471?u=4f555a1c581194f9957bf95921d3ebec61da0f3c&v=4 - twitterUsername: null - url: https://github.com/MateuszOssGit -- login: pprados - count: 2.7139963756821675 - avatarUrl: https://avatars.githubusercontent.com/u/204694?u=c42de41cff108d35269dd2e8fac8977f1f4e471d&v=4 - twitterUsername: null - url: https://github.com/pprados -- login: mainred - count: 2.3022290879981164 - avatarUrl: https://avatars.githubusercontent.com/u/1465768?u=642a7b963f24fd2caaa744eee90a7157322e22db&v=4 - twitterUsername: null - url: https://github.com/mainred -- login: raveharpaz - count: 2.1824963446750756 - avatarUrl: https://avatars.githubusercontent.com/u/154643880?u=3792a3c4581984a90f91ab05f720fd3d7b647d5b&v=4 - twitterUsername: null - url: https://github.com/raveharpaz -- login: cwlacewe - count: 2.136935528239876 - avatarUrl: https://avatars.githubusercontent.com/u/33070862?v=4 - twitterUsername: null - url: https://github.com/cwlacewe + url: https://github.com/B-Step62 - login: jhpiedrahitao - count: 2.1088161276504604 + count: 3.4633861178305234 avatarUrl: https://avatars.githubusercontent.com/u/14959173?u=87fcb0013440f648fb263168583695258b6dbf1c&v=4 twitterUsername: null url: https://github.com/jhpiedrahitao -- login: lucas-tucker - count: 2.05110440740362 - avatarUrl: https://avatars.githubusercontent.com/u/47258766?u=4d98445aff6d752476aaf6ec88ec000496db7677&v=4 +- login: nithishr + count: 2.880852351880346 + avatarUrl: https://avatars.githubusercontent.com/u/12782505?u=a3f1c6e7e68b96bb7be08ecd25f74f2396394597&v=4 + twitterUsername: nithishr + url: https://github.com/nithishr +- login: caseyclements + count: 2.6917932716621333 + avatarUrl: https://avatars.githubusercontent.com/u/737181?u=037bd3004f6c333108d7b32a4c8f96f2e8d57e78&v=4 twitterUsername: null - url: https://github.com/lucas-tucker + url: https://github.com/caseyclements +- login: Coniferish + count: 2.6050895608826536 + avatarUrl: https://avatars.githubusercontent.com/u/43506685?u=20e4be682f43988bd43b039a801856498e31c764&v=4 + twitterUsername: null + url: https://github.com/Coniferish +- login: zc277584121 + count: 1.9934438171164923 + avatarUrl: https://avatars.githubusercontent.com/u/17022025?u=ceee62d53f1c06bf9a014096b651ca0c42cfea3b&v=4 + twitterUsername: null + url: https://github.com/zc277584121 - login: serena-ruan - count: 1.8281195130165993 + count: 1.9233576082546944 avatarUrl: https://avatars.githubusercontent.com/u/82044803?u=451c2955f0862cccf64cac30e062570d208d6903&v=4 twitterUsername: null url: https://github.com/serena-ruan -- login: Anindyadeep - count: 1.8277403019481135 - avatarUrl: https://avatars.githubusercontent.com/u/58508471?u=74423e863298863bf5c7dd7d1bff0aa106a9cc75&v=4 - twitterUsername: AnindyadeepS - url: https://github.com/Anindyadeep -- login: mackong - count: 1.672934682625409 - avatarUrl: https://avatars.githubusercontent.com/u/2212586?v=4 +- login: keenborder786 + count: 1.8693565974384976 + avatarUrl: https://avatars.githubusercontent.com/u/45242107?u=bf122f1371d59c3ba69a87225255fbd00e894404&v=4 twitterUsername: null - url: https://github.com/mackong + url: https://github.com/keenborder786 - login: dristysrivastava count: 1.619061627802763 avatarUrl: https://avatars.githubusercontent.com/u/58721149?v=4 twitterUsername: null url: https://github.com/dristysrivastava -- login: christeefy - count: 1.4967399867782312 - avatarUrl: https://avatars.githubusercontent.com/u/8013575?u=13891ea430c3534079de533ea11aa92111300d0d&v=4 +- login: gbaian10 + count: 1.3984064294337593 + avatarUrl: https://avatars.githubusercontent.com/u/34255899?u=05aba76f1912a56538c8a5141f8135d0e3b1e1bd&v=4 twitterUsername: null - url: https://github.com/christeefy -- login: Adi8885 - count: 1.4509997270418626 - avatarUrl: https://avatars.githubusercontent.com/u/31382824?u=6d105aac7d9644321baf32108937e70878593880&v=4 - twitterUsername: null - url: https://github.com/Adi8885 -- login: Joffref - count: 1.4345309381237525 - avatarUrl: https://avatars.githubusercontent.com/u/51022808?u=15abba69b0bbc1e4b03d97769c37a58af637bd81&v=4 - twitterUsername: null - url: https://github.com/Joffref -- login: Anirudh31415926535 - count: 1.4287851037851036 - avatarUrl: https://avatars.githubusercontent.com/u/171019460?v=4 - twitterUsername: null - url: https://github.com/Anirudh31415926535 + url: https://github.com/gbaian10 - login: thedavgar count: 1.3691357457047835 avatarUrl: https://avatars.githubusercontent.com/u/87140293?v=4 twitterUsername: null url: https://github.com/thedavgar -- login: ovuruska - count: 1.2709631792346532 - avatarUrl: https://avatars.githubusercontent.com/u/75265893?u=7f11152d07f1719da22084388c09b5fc64ab6c89&v=4 - twitterUsername: VuruskanerOguz - url: https://github.com/ovuruska -- login: Josephasafg - count: 1.2554316506714547 - avatarUrl: https://avatars.githubusercontent.com/u/39553475?u=919fcd626077055164ce97bf6cde0a47c54507de&v=4 - twitterUsername: null - url: https://github.com/Josephasafg -- login: gbaian10 - count: 1.2436445246718544 - avatarUrl: https://avatars.githubusercontent.com/u/34255899?u=05aba76f1912a56538c8a5141f8135d0e3b1e1bd&v=4 - twitterUsername: null - url: https://github.com/gbaian10 - login: gdj0nes count: 1.2208993893035593 avatarUrl: https://avatars.githubusercontent.com/u/16679979?u=ddfe3499c7008b4d7c5cf55677a8f6ef77c7abc1&v=4 @@ -245,76 +175,46 @@ top_recent_contributors: avatarUrl: https://avatars.githubusercontent.com/u/130898843?u=0fedb2a0f0f82cd756dbd279e5fd34e2419d054c&v=4 twitterUsername: Haijian_01AI url: https://github.com/Haijian06 +- login: pprados + count: 1.1979531763823281 + avatarUrl: https://avatars.githubusercontent.com/u/204694?u=c42de41cff108d35269dd2e8fac8977f1f4e471d&v=4 + twitterUsername: null + url: https://github.com/pprados - login: bovlb count: 1.1831501831501832 avatarUrl: https://avatars.githubusercontent.com/u/31326650?u=a4db4389f5fa6d2cd4b9f99e38bc08d61f1d8962&v=4 twitterUsername: null url: https://github.com/bovlb -- login: zanussbaum - count: 1.1615353037766831 - avatarUrl: https://avatars.githubusercontent.com/u/33707069?u=8587c5bd028774c9af3674197fedca2380bbe2f9&v=4 - twitterUsername: zach_nussbaum - url: https://github.com/zanussbaum -- login: RafaelXokito - count: 1.1366441408979646 - avatarUrl: https://avatars.githubusercontent.com/u/82586689?u=f10792bb4d6db272be85086ae5a8159f56d8a64f&v=4 +- login: 3coins + count: 1.1379890246061248 + avatarUrl: https://avatars.githubusercontent.com/u/289369?u=80655eb5f9a4d03bf1a526b07a67adc6eacccc6b&v=4 + twitterUsername: pjain7 + url: https://github.com/3coins +- login: abhiaagarwal + count: 1.1232048374905517 + avatarUrl: https://avatars.githubusercontent.com/u/12056337?u=93476ac29d44271b67ffbce7f055af1f6f294345&v=4 twitterUsername: null - url: https://github.com/RafaelXokito -- login: ThanhNguye-n - count: 1.1340804218853 - avatarUrl: https://avatars.githubusercontent.com/u/67593995?u=cfda26bc17e98e1f0b1d7829acb010e0783fd8dc&v=4 - twitterUsername: null - url: https://github.com/ThanhNguye-n -- login: igor-drozdov - count: 1.1336444339395642 - avatarUrl: https://avatars.githubusercontent.com/u/3660805?u=d06f0923c5f6478f935e317ad901a0a3aef06903&v=4 - twitterUsername: null - url: https://github.com/igor-drozdov + url: https://github.com/abhiaagarwal - login: bsbodden count: 1.1145018257694315 avatarUrl: https://avatars.githubusercontent.com/u/24109?u=5801e139c8d3bbf45557ba0f79d536f56b7716a8&v=4 twitterUsername: bsbodden url: https://github.com/bsbodden -- login: yonarw - count: 1.1081443898314043 - avatarUrl: https://avatars.githubusercontent.com/u/5901336?u=be9c290e3f2214d93c5e788d7d950c8f63390f06&v=4 - twitterUsername: null - url: https://github.com/yonarw - login: mkhludnev count: 1.105531691862627 avatarUrl: https://avatars.githubusercontent.com/u/807522?u=03c5551457e21c3c3a2dd8cbbe35eb6183feb3ed&v=4 twitterUsername: null url: https://github.com/mkhludnev -- login: volodymyr-memsql - count: 1.1052088705518308 - avatarUrl: https://avatars.githubusercontent.com/u/57520563?v=4 - twitterUsername: null - url: https://github.com/volodymyr-memsql -- login: TejaHara - count: 1.099582587954681 - avatarUrl: https://avatars.githubusercontent.com/u/48952237?v=4 - twitterUsername: null - url: https://github.com/TejaHara -- login: raghavdixit99 - count: 1.095932273568457 - avatarUrl: https://avatars.githubusercontent.com/u/34462078?u=20243a60ac608142887c14251502c2a975614ba3&v=4 - twitterUsername: null - url: https://github.com/raghavdixit99 -- login: francesco-kruk - count: 1.0881530749951802 - avatarUrl: https://avatars.githubusercontent.com/u/46400934?u=fe4dad00d1e0e6cb555e21ce72bcffa8ec9bf684&v=4 - twitterUsername: null - url: https://github.com/francesco-kruk -- login: LastMonopoly - count: 1.054014598540146 - avatarUrl: https://avatars.githubusercontent.com/u/839799?u=e12646ad6aa244d58cf5fa624dc2933c95acaad9&v=4 - twitterUsername: null - url: https://github.com/LastMonopoly -- login: RichmondAlake - count: 1.0319120407615983 - avatarUrl: https://avatars.githubusercontent.com/u/16384755?v=4 - twitterUsername: null - url: https://github.com/RichmondAlake +- login: andrewmbenton + count: 1.0716395473428721 + avatarUrl: https://avatars.githubusercontent.com/u/100479?u=5d055e42f37638939325d39ad857dc3a7b466533&v=4 + twitterUsername: sircromulent + url: https://github.com/andrewmbenton +- login: Anindyadeep + count: 1.0362885701868754 + avatarUrl: https://avatars.githubusercontent.com/u/58508471?u=74423e863298863bf5c7dd7d1bff0aa106a9cc75&v=4 + twitterUsername: AnindyadeepS + url: https://github.com/Anindyadeep - login: NoahBPeterson count: 1.0312978463786364 avatarUrl: https://avatars.githubusercontent.com/u/16275535?v=4 @@ -325,44 +225,29 @@ top_recent_contributors: avatarUrl: https://avatars.githubusercontent.com/u/23738320?u=5193798d57e7e887fb121101272718f4f120f56c&v=4 twitterUsername: null url: https://github.com/BobMerkus -- login: mrugank-wadekar - count: 1.0165395662077845 - avatarUrl: https://avatars.githubusercontent.com/u/79035539?u=fef791ebd0cfd10281254b81a96cd8bf6907f8c6&v=4 - twitterUsername: null - url: https://github.com/mrugank-wadekar - login: moyid count: 1.0142276422764227 avatarUrl: https://avatars.githubusercontent.com/u/46605732?u=a77312f77cca12c30f506c0e68537ff80898bb25&v=4 twitterUsername: moyi_dang url: https://github.com/moyid -- login: mengxr - count: 1.0113871635610767 - avatarUrl: https://avatars.githubusercontent.com/u/829644?u=56a7fd939b2d15ed21011497db77ad3f569e8a60&v=4 +- login: yonarw + count: 1.003921568627451 + avatarUrl: https://avatars.githubusercontent.com/u/5901336?u=be9c290e3f2214d93c5e788d7d950c8f63390f06&v=4 twitterUsername: null - url: https://github.com/mengxr -- login: kevaldekivadiya2415 - count: 1.009433962264151 - avatarUrl: https://avatars.githubusercontent.com/u/68591522?u=af3217265b078969783ccbf5159101a5973e7aeb&v=4 - twitterUsername: null - url: https://github.com/kevaldekivadiya2415 -- login: andrewmbenton - count: 1.0044126565865696 - avatarUrl: https://avatars.githubusercontent.com/u/100479?u=5d055e42f37638939325d39ad857dc3a7b466533&v=4 - twitterUsername: sircromulent - url: https://github.com/andrewmbenton + url: https://github.com/yonarw top_contributors: - login: leo-gan - count: 257.9627677457016 + count: 262.43222557983603 avatarUrl: https://avatars.githubusercontent.com/u/2256422?v=4 twitterUsername: null url: https://github.com/leo-gan - login: cbornet - count: 71.78484099395938 + count: 85.89921279823972 avatarUrl: https://avatars.githubusercontent.com/u/11633333?u=e13817e11b3fb8c3d209d747c77a0f0742d11138&v=4 twitterUsername: null url: https://github.com/cbornet - login: tomasonjo - count: 49.96460093468815 + count: 51.694819587086336 avatarUrl: https://avatars.githubusercontent.com/u/19948365?v=4 twitterUsername: tb_tomaz url: https://github.com/tomasonjo @@ -391,6 +276,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/14221764?u=47a1405343b4d92caed3744e82dda1d28d01a251&v=4 twitterUsername: null url: https://github.com/hemidactylus +- login: 3coins + count: 14.684552168690972 + avatarUrl: https://avatars.githubusercontent.com/u/289369?u=80655eb5f9a4d03bf1a526b07a67adc6eacccc6b&v=4 + twitterUsername: pjain7 + url: https://github.com/3coins - login: liugddx count: 14.065113068592098 avatarUrl: https://avatars.githubusercontent.com/u/48236177?u=757490c6af76be0a8837dd5886991005a23c89c7&v=4 @@ -406,16 +296,16 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/6690839?u=e56c2161ddc98c58b01fb82da4076e5400fb1e6d&v=4 twitterUsername: sjwhitmore url: https://github.com/sjwhitmore -- login: 3coins - count: 13.546563144084848 - avatarUrl: https://avatars.githubusercontent.com/u/289369?u=80655eb5f9a4d03bf1a526b07a67adc6eacccc6b&v=4 - twitterUsername: pjain7 - url: https://github.com/3coins - login: MateuszOssGit count: 12.94595688294647 avatarUrl: https://avatars.githubusercontent.com/u/139469471?u=4f555a1c581194f9957bf95921d3ebec61da0f3c&v=4 twitterUsername: null url: https://github.com/MateuszOssGit +- login: keenborder786 + count: 12.833231586078803 + avatarUrl: https://avatars.githubusercontent.com/u/45242107?u=bf122f1371d59c3ba69a87225255fbd00e894404&v=4 + twitterUsername: null + url: https://github.com/keenborder786 - login: mbchang count: 12.736227581367578 avatarUrl: https://avatars.githubusercontent.com/u/6439365?u=51c4e9ea28b36473f21524fb68f7b717047e36f9&v=4 @@ -431,11 +321,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/46051506?u=026f5f140e8b7ba4744bf971f9ebdea9ebab67ca&v=4 twitterUsername: null url: https://github.com/Anush008 -- login: keenborder786 - count: 12.261485289561863 - avatarUrl: https://avatars.githubusercontent.com/u/45242107?u=bf122f1371d59c3ba69a87225255fbd00e894404&v=4 - twitterUsername: null - url: https://github.com/keenborder786 - login: mspronesti count: 11.752469751839076 avatarUrl: https://avatars.githubusercontent.com/u/44113430?u=34bdaacaeb2880e40fb4b07897c481771c6de544&v=4 @@ -491,13 +376,23 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/749277?u=84aeb7b75146a67f8b18b389dc591ba72ef105e4&v=4 twitterUsername: tjaffri url: https://github.com/tjaffri +- login: jhpiedrahitao + count: 9.237980533812372 + avatarUrl: https://avatars.githubusercontent.com/u/14959173?u=87fcb0013440f648fb263168583695258b6dbf1c&v=4 + twitterUsername: null + url: https://github.com/jhpiedrahitao +- login: Raj725 + count: 9.210520220442758 + avatarUrl: https://avatars.githubusercontent.com/u/17705063?v=4 + twitterUsername: Raj__725 + url: https://github.com/Raj725 - login: billytrend-cohere count: 8.922716936751982 avatarUrl: https://avatars.githubusercontent.com/u/144115527?u=b881a61482b25b543dacd217d18fc5b98c38e7a3&v=4 twitterUsername: null url: https://github.com/billytrend-cohere - login: nickscamara - count: 8.580958404078633 + count: 8.710329033449263 avatarUrl: https://avatars.githubusercontent.com/u/20311743?u=29bf2391ae34297a12a88d813731b0bdf289e4a5&v=4 twitterUsername: nickscamara_ url: https://github.com/nickscamara @@ -516,6 +411,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/57520563?v=4 twitterUsername: null url: https://github.com/volodymyr-memsql +- login: nithishr + count: 7.904920183179639 + avatarUrl: https://avatars.githubusercontent.com/u/12782505?u=a3f1c6e7e68b96bb7be08ecd25f74f2396394597&v=4 + twitterUsername: nithishr + url: https://github.com/nithishr - login: Jibola count: 7.793062992666114 avatarUrl: https://avatars.githubusercontent.com/u/2887713?u=7bb198c7d11d29a412dc836818f3da6666f643ee&v=4 @@ -526,11 +426,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/31382824?u=6d105aac7d9644321baf32108937e70878593880&v=4 twitterUsername: null url: https://github.com/Adi8885 -- login: Raj725 - count: 7.521806471516634 - avatarUrl: https://avatars.githubusercontent.com/u/17705063?v=4 - twitterUsername: Raj__725 - url: https://github.com/Raj725 +- login: B-Step62 + count: 7.465127997303938 + avatarUrl: https://avatars.githubusercontent.com/u/31463517?u=635a36cf4e20a25b5bc8cdc3aa27c613fa701cfa&v=4 + twitterUsername: null + url: https://github.com/B-Step62 - login: sergerdn count: 7.43609256642621 avatarUrl: https://avatars.githubusercontent.com/u/64213648?u=a9a3c39e0277dcb74d102e73511df929d2a1ecc6&v=4 @@ -541,21 +441,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/91237924?u=76e7131a2ebbe9ef35061620286d6d06258e7a61&v=4 twitterUsername: null url: https://github.com/openvino-dev-samples -- login: B-Step62 - count: 6.918198818002826 - avatarUrl: https://avatars.githubusercontent.com/u/31463517?u=635a36cf4e20a25b5bc8cdc3aa27c613fa701cfa&v=4 - twitterUsername: null - url: https://github.com/B-Step62 - login: averikitsch count: 6.691292200589024 avatarUrl: https://avatars.githubusercontent.com/u/6519888?u=fe0b0f093e8683bdac4f205b237d2e48d7c755d4&v=4 twitterUsername: averikitsch url: https://github.com/averikitsch -- login: nithishr - count: 6.6421087116234565 - avatarUrl: https://avatars.githubusercontent.com/u/12782505?u=a3f1c6e7e68b96bb7be08ecd25f74f2396394597&v=4 - twitterUsername: nithishr - url: https://github.com/nithishr - login: naveentatikonda count: 6.596387190287167 avatarUrl: https://avatars.githubusercontent.com/u/89161683?u=4a59b199c77215fe3cb8c937797b909061ec49af&v=4 @@ -566,11 +456,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/56769451?u=088102b6160822bc68c25a2a5df170080d0b16a2&v=4 twitterUsername: null url: https://github.com/tyumentsev4 -- login: jhpiedrahitao - count: 6.547101019822785 - avatarUrl: https://avatars.githubusercontent.com/u/14959173?u=87fcb0013440f648fb263168583695258b6dbf1c&v=4 - twitterUsername: null - url: https://github.com/jhpiedrahitao - login: UmerHA count: 6.5115903804909285 avatarUrl: https://avatars.githubusercontent.com/u/40663591?u=d0a44575938f379eb414c15d9bdc0ecf6911f1b8&v=4 @@ -598,7 +483,7 @@ top_contributors: url: https://github.com/seamusp - login: michaelfeil count: 6.30450671251487 - avatarUrl: https://avatars.githubusercontent.com/u/63565275?u=08a65e589a3045dad9c13218858c8a91d16528fc&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/63565275?u=14db8a9a8d8164fd4973597296c3e015423706bc&v=4 twitterUsername: feilsystem url: https://github.com/michaelfeil - login: rahul-trip @@ -646,6 +531,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/1296705?v=4 twitterUsername: null url: https://github.com/lalanikarim +- login: zc277584121 + count: 5.869000769570294 + avatarUrl: https://avatars.githubusercontent.com/u/17022025?u=ceee62d53f1c06bf9a014096b651ca0c42cfea3b&v=4 + twitterUsername: null + url: https://github.com/zc277584121 - login: maiqingqiang count: 5.8179145453313685 avatarUrl: https://avatars.githubusercontent.com/u/1825679?u=bc5db0325ef2a546c67e1e2ae1f7a0af7afe6803&v=4 @@ -661,6 +551,16 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/62768671?u=279f772a5b8325a191a1a8bb623aa40f32a01856&v=4 twitterUsername: null url: https://github.com/skcoirz +- login: ZhangShenao + count: 5.476597159935018 + avatarUrl: https://avatars.githubusercontent.com/u/24444502?u=324d8acd5a220bfd93b1b46dac1d9d1d82d7d516&v=4 + twitterUsername: null + url: https://github.com/ZhangShenao +- login: harupy + count: 5.387155646897978 + avatarUrl: https://avatars.githubusercontent.com/u/17039389?u=796226152becf82c4d7fd5cc49a24e58a73ce66f&v=4 + twitterUsername: null + url: https://github.com/harupy - login: manuel-soria count: 5.364594471667274 avatarUrl: https://avatars.githubusercontent.com/u/66525873?u=71102c35b5c8d325d34c32a4f9a07b6f97d90836&v=4 @@ -706,6 +606,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/13748374?u=47b1f523342466ab97dd23e285418c5f5c9820c4&v=4 twitterUsername: null url: https://github.com/wangxuqi +- login: shurrey + count: 5.009117276243888 + avatarUrl: https://avatars.githubusercontent.com/u/886516?u=9ee4c1643932282abedaf432a5e39c76ca260700&v=4 + twitterUsername: shurrey + url: https://github.com/shurrey - login: mackong count: 4.955658314056572 avatarUrl: https://avatars.githubusercontent.com/u/2212586?v=4 @@ -721,21 +626,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/20971593?u=1574196bb286044d23a04aa5aa34203ada8f4309&v=4 twitterUsername: jonzluo url: https://github.com/jzluo -- login: zc277584121 - count: 4.833567698704153 - avatarUrl: https://avatars.githubusercontent.com/u/17022025?u=ceee62d53f1c06bf9a014096b651ca0c42cfea3b&v=4 - twitterUsername: null - url: https://github.com/zc277584121 - login: Anindyadeep count: 4.797100065127253 avatarUrl: https://avatars.githubusercontent.com/u/58508471?u=74423e863298863bf5c7dd7d1bff0aa106a9cc75&v=4 twitterUsername: AnindyadeepS url: https://github.com/Anindyadeep -- login: ZhangShenao - count: 4.790622533033173 - avatarUrl: https://avatars.githubusercontent.com/u/24444502?u=324d8acd5a220bfd93b1b46dac1d9d1d82d7d516&v=4 - twitterUsername: null - url: https://github.com/ZhangShenao - login: mateusz-wosinski-ds count: 4.729385171126772 avatarUrl: https://avatars.githubusercontent.com/u/142883372?u=45481f472f5f89c4d8ca8788617ffac47c5ebd88&v=4 @@ -761,16 +656,21 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/141953346?u=ede12989daf498a2df632344378a57e4f2b4c317&v=4 twitterUsername: null url: https://github.com/ShorthillsAI -- login: harupy - count: 4.621684367938917 - avatarUrl: https://avatars.githubusercontent.com/u/17039389?u=796226152becf82c4d7fd5cc49a24e58a73ce66f&v=4 +- login: bjchambers + count: 4.444292076157851 + avatarUrl: https://avatars.githubusercontent.com/u/35960?v=4 twitterUsername: null - url: https://github.com/harupy + url: https://github.com/bjchambers - login: kylehh count: 4.402950642669773 avatarUrl: https://avatars.githubusercontent.com/u/24217337?u=09d0e274f382e264ef578e93b547fb55a5b179fe&v=4 twitterUsername: null url: https://github.com/kylehh +- login: eltociear + count: 4.401956380036294 + avatarUrl: https://avatars.githubusercontent.com/u/22633385?u=29190f6c8aed91fa9574b064a9995f1e49944acf&v=4 + twitterUsername: null + url: https://github.com/eltociear - login: jeffvestal count: 4.398641422660617 avatarUrl: https://avatars.githubusercontent.com/u/53237856?u=656560c61bb540c9930574037126d2280ef0b4f8&v=4 @@ -791,11 +691,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/76683249?u=3f2d197d1391ab3d27cc8be37ac48e6912564204&v=4 twitterUsername: null url: https://github.com/wenngong -- login: eltociear - count: 4.334729489279992 - avatarUrl: https://avatars.githubusercontent.com/u/22633385?u=29190f6c8aed91fa9574b064a9995f1e49944acf&v=4 - twitterUsername: eltociear - url: https://github.com/eltociear - login: raveharpaz count: 4.272269017441798 avatarUrl: https://avatars.githubusercontent.com/u/154643880?u=3792a3c4581984a90f91ab05f720fd3d7b647d5b&v=4 @@ -811,6 +706,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/14010132?u=7b08fe21105fd9835fe7e7c55a2174f2ec4d0a91&v=4 twitterUsername: null url: https://github.com/aayush3011 +- login: Coniferish + count: 4.124165504386392 + avatarUrl: https://avatars.githubusercontent.com/u/43506685?u=20e4be682f43988bd43b039a801856498e31c764&v=4 + twitterUsername: null + url: https://github.com/Coniferish - login: KyrianC count: 4.0808756867444735 avatarUrl: https://avatars.githubusercontent.com/u/67210837?u=7e6d3db8c71e8fdd631017b8c9f6b83248923007&v=4 @@ -836,11 +736,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/10434946?u=517fa2eeadb35b317ec479f813126cbd1c5cc86a&v=4 twitterUsername: yakigac url: https://github.com/yakigac -- login: shurrey - count: 3.922271810088077 - avatarUrl: https://avatars.githubusercontent.com/u/886516?u=9ee4c1643932282abedaf432a5e39c76ca260700&v=4 - twitterUsername: shurrey - url: https://github.com/shurrey - login: HunterGerlach count: 3.8651978890968324 avatarUrl: https://avatars.githubusercontent.com/u/5001050?u=d5d0c24dc9566cec4b8e3cd376150c05b42c5210&v=4 @@ -871,11 +766,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/12809212?u=8c1f0baf8a29f3007e3a51f5cf7b4a8e04c5ca8d&v=4 twitterUsername: null url: https://github.com/parambharat -- login: bjchambers - count: 3.695536682862132 - avatarUrl: https://avatars.githubusercontent.com/u/35960?v=4 - twitterUsername: null - url: https://github.com/bjchambers - login: caseyclements count: 3.689541019409881 avatarUrl: https://avatars.githubusercontent.com/u/737181?u=037bd3004f6c333108d7b32a4c8f96f2e8d57e78&v=4 @@ -906,6 +796,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/3032459?u=590f1489107c91803bbe75de26cfeeeb77b25f8d&v=4 twitterUsername: null url: https://github.com/nelly-hateva +- login: serena-ruan + count: 3.465164253640294 + avatarUrl: https://avatars.githubusercontent.com/u/82044803?u=451c2955f0862cccf64cac30e062570d208d6903&v=4 + twitterUsername: null + url: https://github.com/serena-ruan - login: wemysschen count: 3.4513780719164755 avatarUrl: https://avatars.githubusercontent.com/u/38650638?u=2b526137f18a7c41934c8da0722f1fedb74c3422&v=4 @@ -913,7 +808,7 @@ top_contributors: url: https://github.com/wemysschen - login: alexsherstinsky count: 3.4195222285195195 - avatarUrl: https://avatars.githubusercontent.com/u/339166?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/339166?u=9736b363a1200d66058ff83c58921b19d51c474f&v=4 twitterUsername: null url: https://github.com/alexsherstinsky - login: zanderchase @@ -941,11 +836,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/112245?u=c129f9b2439b082cca4a7a322e558fca514bb87d&v=4 twitterUsername: cevianNY url: https://github.com/cevian -- login: serena-ruan - count: 3.3699261584021984 - avatarUrl: https://avatars.githubusercontent.com/u/82044803?u=451c2955f0862cccf64cac30e062570d208d6903&v=4 - twitterUsername: null - url: https://github.com/serena-ruan - login: charliermarsh count: 3.357395278037737 avatarUrl: https://avatars.githubusercontent.com/u/1309177?u=6328c998d93a48eba87c6b039783b8a7644c62c3&v=4 @@ -1061,11 +951,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/1157440?u=2f81a28298c1172e732898a1f8e800342434801d&v=4 twitterUsername: t_azarov url: https://github.com/tazarov -- login: Coniferish - count: 2.844584376084463 - avatarUrl: https://avatars.githubusercontent.com/u/43506685?u=20e4be682f43988bd43b039a801856498e31c764&v=4 - twitterUsername: null - url: https://github.com/Coniferish - login: mattgotteiner count: 2.8443682107106456 avatarUrl: https://avatars.githubusercontent.com/u/57731498?u=fec622b37ca3dc04125144116ad5165f37f85823&v=4 @@ -1101,6 +986,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/128378696?u=8c818bd39c9cd75b606f3b5b1479787e4e6845d9&v=4 twitterUsername: null url: https://github.com/BeatrixCohere +- login: mainred + count: 2.7874129619911727 + avatarUrl: https://avatars.githubusercontent.com/u/1465768?u=642a7b963f24fd2caaa744eee90a7157322e22db&v=4 + twitterUsername: null + url: https://github.com/mainred - login: CahidArda count: 2.7461434951945285 avatarUrl: https://avatars.githubusercontent.com/u/57228345?v=4 @@ -1181,11 +1071,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/1074525?v=4 twitterUsername: null url: https://github.com/gradenr -- login: mainred - count: 2.552802044453426 - avatarUrl: https://avatars.githubusercontent.com/u/1465768?u=642a7b963f24fd2caaa744eee90a7157322e22db&v=4 - twitterUsername: null - url: https://github.com/mainred - login: zhaoshengbo count: 2.5359631155826756 avatarUrl: https://avatars.githubusercontent.com/u/4787922?u=dd4c7a18d86a6ad56455aa13e66daedbbbcf31b7&v=4 @@ -1476,6 +1361,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/829644?u=56a7fd939b2d15ed21011497db77ad3f569e8a60&v=4 twitterUsername: null url: https://github.com/mengxr +- login: erika-cardenas + count: 2.0351187582413504 + avatarUrl: https://avatars.githubusercontent.com/u/110841617?u=e473cda5a87ca1dae11082c11db9c1ed1f4c7032&v=4 + twitterUsername: ecardenas300 + url: https://github.com/erika-cardenas - login: juliuslipp count: 2.028741411094352 avatarUrl: https://avatars.githubusercontent.com/u/43986145?u=3d15192e4d6ae36696e49e6c061d29f074f5ba77&v=4 @@ -1511,6 +1401,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/1555858?v=4 twitterUsername: null url: https://github.com/prakul +- login: Oscilloscope98 + count: 1.992425408391795 + avatarUrl: https://avatars.githubusercontent.com/u/54161268?v=4 + twitterUsername: null + url: https://github.com/Oscilloscope98 - login: ecneladis count: 1.9904503004643521 avatarUrl: https://avatars.githubusercontent.com/u/6756744?u=f576bd2ad9bb2ebfc8d45feb4a49e8add9ae79dc&v=4 @@ -1519,7 +1414,7 @@ top_contributors: - login: Undertone0809 count: 1.9878760341675945 avatarUrl: https://avatars.githubusercontent.com/u/72488598?u=98dc24a63369cbae14913caff5f379f80f305aab&v=4 - twitterUsername: null + twitterUsername: kfhedRk3lXofRIB url: https://github.com/Undertone0809 - login: hetaoBackend count: 1.9761810838733918 @@ -1626,16 +1521,16 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/2283778?u=0c5a2a583bc77b138b346c5974551ac459059026&v=4 twitterUsername: vinoyang url: https://github.com/yanghua +- login: miri-bar + count: 1.8906306616552775 + avatarUrl: https://avatars.githubusercontent.com/u/160584887?v=4 + twitterUsername: null + url: https://github.com/miri-bar - login: klein-t count: 1.8811998282586517 avatarUrl: https://avatars.githubusercontent.com/u/62718109?u=ab38af3009ae3adcff49a309580e55bc6f586ba2&v=4 twitterUsername: KleinTahiraj url: https://github.com/klein-t -- login: erika-cardenas - count: 1.8724554628346919 - avatarUrl: https://avatars.githubusercontent.com/u/110841617?u=e473cda5a87ca1dae11082c11db9c1ed1f4c7032&v=4 - twitterUsername: ecardenas300 - url: https://github.com/erika-cardenas - login: Ayan-Bandyopadhyay count: 1.8648072277486105 avatarUrl: https://avatars.githubusercontent.com/u/13636019?v=4 @@ -2041,6 +1936,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/16456186?u=b9b30585eb3ddd0c8819bda9694636303c510233&v=4 twitterUsername: null url: https://github.com/ThatsJustCheesy +- login: MacanPN + count: 1.522461677570369 + avatarUrl: https://avatars.githubusercontent.com/u/1621509?u=e54d671ddef5ac7580003427246fc2247964c9ed&v=4 + twitterUsername: null + url: https://github.com/MacanPN - login: kristapratico count: 1.513941196896642 avatarUrl: https://avatars.githubusercontent.com/u/31998003?u=0d91cde56e2c25d8ee7447bc55099e3dad047e99&v=4 @@ -2081,6 +1981,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/61808204?v=4 twitterUsername: null url: https://github.com/akiradev0x +- login: JonZeolla + count: 1.4673206586923402 + avatarUrl: https://avatars.githubusercontent.com/u/1385510?u=b3066560b9122fc5db6d2e80adf9d5c84113be15&v=4 + twitterUsername: jonzeolla + url: https://github.com/JonZeolla - login: mlejva count: 1.4650246693128453 avatarUrl: https://avatars.githubusercontent.com/u/5136688?u=471ef01a31cc054f84abbe1b9e77ce07b2ac6853&v=4 @@ -2166,6 +2071,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/433221?u=714ae935eadb460e1a7d41d7d29e26c7fed0bbbf&v=4 twitterUsername: null url: https://github.com/brendancol +- login: gbaian10 + count: 1.3984064294337593 + avatarUrl: https://avatars.githubusercontent.com/u/34255899?u=05aba76f1912a56538c8a5141f8135d0e3b1e1bd&v=4 + twitterUsername: null + url: https://github.com/gbaian10 - login: juliensalinas count: 1.3973862269091648 avatarUrl: https://avatars.githubusercontent.com/u/22055188?u=779840a35ef12f6734b630b1bdedd694132ec68f&v=4 @@ -2381,6 +2291,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/104267837?u=762d6b00291c68379d66260d7b644942e3bab891&v=4 twitterUsername: null url: https://github.com/lvliang-intel +- login: balvisio + count: 1.2906877135954402 + avatarUrl: https://avatars.githubusercontent.com/u/1909351?u=26bf36601ef34e0aa8a846ff3c98eb077987e882&v=4 + twitterUsername: null + url: https://github.com/balvisio - login: xinqiu count: 1.2842349022975048 avatarUrl: https://avatars.githubusercontent.com/u/8972416?u=8cef7c30a819e5157bece1f1e06a50beab52845f&v=4 @@ -2461,11 +2376,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/3887295?u=55c8b3263df68b67f9b465c1758c78898f8b163b&v=4 twitterUsername: null url: https://github.com/zoltan-fedor -- login: miri-bar - count: 1.2631796812631206 - avatarUrl: https://avatars.githubusercontent.com/u/160584887?v=4 - twitterUsername: null - url: https://github.com/miri-bar - login: berkedilekoglu count: 1.2621472959739344 avatarUrl: https://avatars.githubusercontent.com/u/19657350?u=9847c9919a636e9d7022803e829ffd80008cb2d3&v=4 @@ -2531,11 +2441,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/13622183?u=c23256501191447d645cc03c1f6bc83282ef1498&v=4 twitterUsername: null url: https://github.com/liaokongVFX -- login: gbaian10 - count: 1.2436445246718544 - avatarUrl: https://avatars.githubusercontent.com/u/34255899?u=05aba76f1912a56538c8a5141f8135d0e3b1e1bd&v=4 - twitterUsername: null - url: https://github.com/gbaian10 - login: 0xRaduan count: 1.2415770609318995 avatarUrl: https://avatars.githubusercontent.com/u/36044389?u=e669016609aeb3e08e4f2a50f4faa163d633c073&v=4 @@ -2713,7 +2618,7 @@ top_contributors: url: https://github.com/ChrKahl - login: bongsang count: 1.1924765680164058 - avatarUrl: https://avatars.githubusercontent.com/u/8433665?u=1c39439298436f2acaa30c21863e02d3ba13af02&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/8433665?u=5adeb0f5b7d3af0f5f6149bc09076fd37f964e00&v=4 twitterUsername: null url: https://github.com/bongsang - login: clwillhuang @@ -2976,6 +2881,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/460966?v=4 twitterUsername: null url: https://github.com/ebrehault +- login: wlleiiwang + count: 1.1275620862870288 + avatarUrl: https://avatars.githubusercontent.com/u/6872942?v=4 + twitterUsername: null + url: https://github.com/wlleiiwang - login: santiagxf count: 1.1241594226668854 avatarUrl: https://avatars.githubusercontent.com/u/32112894?u=d317c16ef9614adbeb3cf18ac39239c585db2264&v=4 @@ -2986,6 +2896,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/30162978?v=4 twitterUsername: thehappydinoa url: https://github.com/thehappydinoa +- login: abhiaagarwal + count: 1.1232048374905517 + avatarUrl: https://avatars.githubusercontent.com/u/12056337?u=93476ac29d44271b67ffbce7f055af1f6f294345&v=4 + twitterUsername: null + url: https://github.com/abhiaagarwal - login: LMC117 count: 1.1226611226611227 avatarUrl: https://avatars.githubusercontent.com/u/30344258?u=51c169c8996024b68e9b3ec0bfe93465940dc8b4&v=4 @@ -2993,7 +2908,7 @@ top_contributors: url: https://github.com/LMC117 - login: WilliamEspegren count: 1.1222886759609925 - avatarUrl: https://avatars.githubusercontent.com/u/131612909?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/131612909?u=5ea799680a40107fcd922392026312204abb9fe8&v=4 twitterUsername: WilliamEspegren url: https://github.com/WilliamEspegren - login: sunbc0120 @@ -3193,8 +3108,8 @@ top_contributors: url: https://github.com/vrushankportkey - login: jxnl count: 1.0761732546629572 - avatarUrl: https://avatars.githubusercontent.com/u/4852235?u=69b6d23a20085d57e304196e304cfd06f3393f3d&v=4 - twitterUsername: null + avatarUrl: https://avatars.githubusercontent.com/u/4852235?u=f3927adbaafbeaccd6fd4d0bc805414ef08b8b54&v=4 + twitterUsername: jxnlco url: https://github.com/jxnl - login: arron2003 count: 1.0755919854280511 @@ -3216,6 +3131,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/1473079?v=4 twitterUsername: null url: https://github.com/constantinmusca +- login: andrewmbenton + count: 1.0716395473428721 + avatarUrl: https://avatars.githubusercontent.com/u/100479?u=5d055e42f37638939325d39ad857dc3a7b466533&v=4 + twitterUsername: sircromulent + url: https://github.com/andrewmbenton - login: Subsegment count: 1.0702550461586606 avatarUrl: https://avatars.githubusercontent.com/u/74497693?u=0d49e69abc1f1c5299d479d943285fcac7eee1ae&v=4 @@ -3261,16 +3181,11 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/51958314?u=ff1c617481aa52a540a1b444280c9308beb83db5&v=4 twitterUsername: imshubham31 url: https://github.com/sp35 -- login: MacanPN - count: 1.0604834042713411 - avatarUrl: https://avatars.githubusercontent.com/u/1621509?u=e54d671ddef5ac7580003427246fc2247964c9ed&v=4 - twitterUsername: null - url: https://github.com/MacanPN -- login: wlleiiwang - count: 1.0603351955307263 - avatarUrl: https://avatars.githubusercontent.com/u/6872942?v=4 - twitterUsername: null - url: https://github.com/wlleiiwang +- login: Yash-1511 + count: 1.0620206004821389 + avatarUrl: https://avatars.githubusercontent.com/u/82636823?u=e7e57044f6fca0b0255dfeac66a8c3ec660263c6&v=4 + twitterUsername: Yash15113 + url: https://github.com/Yash-1511 - login: abdalrohman count: 1.0589562764456981 avatarUrl: https://avatars.githubusercontent.com/u/20760062?u=422c372863e9c42406db2241e41cc52c522431ef&v=4 @@ -3311,11 +3226,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/5522060?v=4 twitterUsername: null url: https://github.com/tesfagabir -- login: Oscilloscope98 - count: 1.0525161113396408 - avatarUrl: https://avatars.githubusercontent.com/u/54161268?v=4 - twitterUsername: null - url: https://github.com/Oscilloscope98 - login: chocolate4 count: 1.0517565764717955 avatarUrl: https://avatars.githubusercontent.com/u/56334152?v=4 @@ -3403,7 +3313,7 @@ top_contributors: url: https://github.com/DN6 - login: spike-spiegel-21 count: 1.0372767684148758 - avatarUrl: https://avatars.githubusercontent.com/u/83648453?u=da1e569522d3acd72be09d8d07028a9bfdbcce8e&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/83648453?u=9cb34e2b4ef5be7311fc0cd9949280542f8947d8&v=4 twitterUsername: mynksol url: https://github.com/spike-spiegel-21 - login: mziru @@ -3646,11 +3556,6 @@ top_contributors: avatarUrl: https://avatars.githubusercontent.com/u/18140070?u=1992cdb13c62ee66f4ccc8f000d2c6efae3056c3&v=4 twitterUsername: ChristianKasimL url: https://github.com/C-K-Loan -- login: andrewmbenton - count: 1.0044126565865696 - avatarUrl: https://avatars.githubusercontent.com/u/100479?u=5d055e42f37638939325d39ad857dc3a7b466533&v=4 - twitterUsername: sircromulent - url: https://github.com/andrewmbenton - login: daniel-brenot count: 1.0020177420409888 avatarUrl: https://avatars.githubusercontent.com/u/18020640?u=d47ad1cc8fb82340d1c77d1f191038372987f85a&v=4 @@ -3668,32 +3573,32 @@ top_contributors: url: https://github.com/giacbrd top_reviewers: - login: leo-gan - count: 153 + count: 155 avatarUrl: https://avatars.githubusercontent.com/u/2256422?v=4 twitterUsername: null url: https://github.com/leo-gan +- login: cbornet + count: 48 + avatarUrl: https://avatars.githubusercontent.com/u/11633333?u=e13817e11b3fb8c3d209d747c77a0f0742d11138&v=4 + twitterUsername: null + url: https://github.com/cbornet - login: lkuligin count: 46 avatarUrl: https://avatars.githubusercontent.com/u/11026406?v=4 twitterUsername: null url: https://github.com/lkuligin -- login: cbornet - count: 46 - avatarUrl: https://avatars.githubusercontent.com/u/11633333?u=e13817e11b3fb8c3d209d747c77a0f0742d11138&v=4 - twitterUsername: null - url: https://github.com/cbornet - login: 3coins count: 30 avatarUrl: https://avatars.githubusercontent.com/u/289369?u=80655eb5f9a4d03bf1a526b07a67adc6eacccc6b&v=4 twitterUsername: pjain7 url: https://github.com/3coins - login: jexp - count: 20 + count: 22 avatarUrl: https://avatars.githubusercontent.com/u/67427?v=4 twitterUsername: mesirii url: https://github.com/jexp - login: tomasonjo - count: 19 + count: 20 avatarUrl: https://avatars.githubusercontent.com/u/19948365?v=4 twitterUsername: tb_tomaz url: https://github.com/tomasonjo @@ -3703,20 +3608,20 @@ top_reviewers: twitterUsername: null url: https://github.com/liugddx - login: joemcelroy - count: 17 + count: 18 avatarUrl: https://avatars.githubusercontent.com/u/49480?u=4a9b7c8820211aae14da7f72f617d88019a06569&v=4 twitterUsername: phoey1 url: https://github.com/joemcelroy +- login: Undertone0809 + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/72488598?u=98dc24a63369cbae14913caff5f379f80f305aab&v=4 + twitterUsername: kfhedRk3lXofRIB + url: https://github.com/Undertone0809 - login: mspronesti count: 17 avatarUrl: https://avatars.githubusercontent.com/u/44113430?u=34bdaacaeb2880e40fb4b07897c481771c6de544&v=4 twitterUsername: null url: https://github.com/mspronesti -- login: Undertone0809 - count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/72488598?u=98dc24a63369cbae14913caff5f379f80f305aab&v=4 - twitterUsername: null - url: https://github.com/Undertone0809 - login: JohnNay count: 14 avatarUrl: https://avatars.githubusercontent.com/u/8429627?u=d28653fbd93c966ac840f93a05f0ef949495851f&v=4 @@ -3742,16 +3647,21 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/62768671?u=279f772a5b8325a191a1a8bb623aa40f32a01856&v=4 twitterUsername: null url: https://github.com/skcoirz +- login: harupy + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/17039389?u=796226152becf82c4d7fd5cc49a24e58a73ce66f&v=4 + twitterUsername: null + url: https://github.com/harupy - login: tylerhutcherson count: 10 avatarUrl: https://avatars.githubusercontent.com/u/20304844?u=f00461bcedad6ba384a4e234a44c906802448b4e&v=4 twitterUsername: tchutch94 url: https://github.com/tylerhutcherson -- login: harupy +- login: keenborder786 count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/17039389?u=796226152becf82c4d7fd5cc49a24e58a73ce66f&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/45242107?u=bf122f1371d59c3ba69a87225255fbd00e894404&v=4 twitterUsername: null - url: https://github.com/harupy + url: https://github.com/keenborder786 - login: Anush008 count: 10 avatarUrl: https://avatars.githubusercontent.com/u/46051506?u=026f5f140e8b7ba4744bf971f9ebdea9ebab67ca&v=4 @@ -3767,11 +3677,11 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/13009163?u=c2b3a11cceaadbc9415f545b971250c9e2b2078b&v=4 twitterUsername: sampartee url: https://github.com/Spartee -- login: keenborder786 +- login: Raj725 count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/45242107?u=bf122f1371d59c3ba69a87225255fbd00e894404&v=4 - twitterUsername: null - url: https://github.com/keenborder786 + avatarUrl: https://avatars.githubusercontent.com/u/17705063?v=4 + twitterUsername: Raj__725 + url: https://github.com/Raj725 - login: MthwRobinson count: 8 avatarUrl: https://avatars.githubusercontent.com/u/1635179?u=0631cb84ca580089198114f94d9c27efe730220e&v=4 @@ -3782,6 +3692,11 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/23314389?u=2014e20e246530fa89bd902fe703b6f9e6ecf833&v=4 twitterUsername: nicoloboschi url: https://github.com/nicoloboschi +- login: Jibola + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/2887713?u=7bb198c7d11d29a412dc836818f3da6666f643ee&v=4 + twitterUsername: null + url: https://github.com/Jibola - login: ShaneHarvey count: 8 avatarUrl: https://avatars.githubusercontent.com/u/5015933?u=80e339672a321cde25f4b484129bbddfefb2356d&v=4 @@ -3792,11 +3707,6 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/19181718?u=79a9013dea28a7fa654431cd7e89b08dc76434dd&v=4 twitterUsername: null url: https://github.com/sepiatone -- login: Raj725 - count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/17705063?v=4 - twitterUsername: Raj__725 - url: https://github.com/Raj725 - login: scadEfUr count: 7 avatarUrl: https://avatars.githubusercontent.com/u/123224380?v=4 @@ -3822,11 +3732,6 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/2096628?u=2a4822ff8dc6b4f1162c58716d48fdfac08c8601&v=4 twitterUsername: null url: https://github.com/blink1073 -- login: Jibola - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/2887713?u=7bb198c7d11d29a412dc836818f3da6666f643ee&v=4 - twitterUsername: null - url: https://github.com/Jibola - login: B-Step62 count: 7 avatarUrl: https://avatars.githubusercontent.com/u/31463517?u=635a36cf4e20a25b5bc8cdc3aa27c613fa701cfa&v=4 @@ -3877,11 +3782,11 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/35960?v=4 twitterUsername: null url: https://github.com/bjchambers -- login: andersenchen +- login: andychenmagrathea-06e0a82f-34fc-48ca count: 5 avatarUrl: https://avatars.githubusercontent.com/u/101075607?v=4 twitterUsername: null - url: https://github.com/andersenchen + url: https://github.com/andychenmagrathea-06e0a82f-34fc-48ca - login: sam-h-bean count: 5 avatarUrl: https://avatars.githubusercontent.com/u/43734688?u=78f139fa940620e301361a58821c9f56128f71d9&v=4 @@ -3909,7 +3814,7 @@ top_reviewers: url: https://github.com/ofermend - login: navneet1v count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/6162415?u=82e86c06ae37add3750f9db9ad9d7dfa250ddae7&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/6162415?u=637859605152bece4f99fdc13ef5b4f0027b00e1&v=4 twitterUsername: null url: https://github.com/navneet1v - login: billytrend-cohere From 0b36ed09cf1d44a3900dd569a214847bbe1e0108 Mon Sep 17 00:00:00 2001 From: Nihal Chaudhary <120308161+Dehelaan@users.noreply.github.com> Date: Tue, 8 Oct 2024 23:18:08 +0530 Subject: [PATCH 53/62] DOC:Changed /docs/integrations/tools/jira/ (#27023) - [x] - **Description:** replaced `%pip install -qU langchain-community` to `%pip install -qU langchain-community langchain_openai ` in doc \langchain\docs\docs\integrations\tools\jira.ipynb - [x] - **Issue:** the issue #27013 - [x] Add docs Co-authored-by: Erick Friis --- docs/docs/integrations/tools/jira.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/integrations/tools/jira.ipynb b/docs/docs/integrations/tools/jira.ipynb index 05e74edc40e..feb4331a4e7 100644 --- a/docs/docs/integrations/tools/jira.ipynb +++ b/docs/docs/integrations/tools/jira.ipynb @@ -47,7 +47,7 @@ }, "outputs": [], "source": [ - "%pip install -qU langchain-community" + "%pip install -qU langchain-community langchain_openai" ] }, { From 9b7bdf1a26c4083a30a9e6910bf0be0509b1245d Mon Sep 17 00:00:00 2001 From: Ajayeswar Reddy Date: Tue, 8 Oct 2024 12:51:26 -0500 Subject: [PATCH 54/62] Fixed typo in llibs/community/langchain_community/storage/sql.py (#27029) - [ ] **PR title**: docs: fix typo in SQLStore import path - [ ] **PR message**: - **Description:** This PR corrects a typo in the docstrings for the class SQLStore(BaseStore[str, bytes]). The import path in the docstring currently reads from langchain_rag.storage import SQLStore, which should be changed to langchain_community.storage import SQLStore. This typo is also reflected in the official documentation. - **Issue:** N/A - **Dependencies:** None - **Twitter handle:** N/A Co-authored-by: Erick Friis --- libs/community/langchain_community/storage/sql.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/community/langchain_community/storage/sql.py b/libs/community/langchain_community/storage/sql.py index aae7e1149e4..c5b4ae978ff 100644 --- a/libs/community/langchain_community/storage/sql.py +++ b/libs/community/langchain_community/storage/sql.py @@ -95,7 +95,7 @@ class SQLStore(BaseStore[str, bytes]): .. code-block:: python - from langchain_rag.storage import SQLStore + from langchain_community.storage import SQLStore # Instantiate the SQLStore with the root path sql_store = SQLStore(namespace="test", db_url="sqlite://:memory:") From b84e00283f8936a4779d4384911b1b83e6a23f57 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Tue, 8 Oct 2024 11:35:32 -0700 Subject: [PATCH 55/62] standard-tests: test that only one chunk sets input_tokens (#27177) --- .../integration_tests/chat_models.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py index b5e0a9a0bd4..5c0c8c6628c 100644 --- a/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py +++ b/libs/standard-tests/langchain_standard_tests/integration_tests/chat_models.py @@ -1,6 +1,6 @@ import base64 import json -from typing import List, Optional +from typing import List, Optional, cast import httpx import pytest @@ -209,10 +209,21 @@ class ChatModelIntegrationTests(ChatModelTests): def test_usage_metadata_streaming(self, model: BaseChatModel) -> None: if not self.returns_usage_metadata: pytest.skip("Not implemented.") - full: Optional[BaseMessageChunk] = None - for chunk in model.stream("Hello"): + full: Optional[AIMessageChunk] = None + for chunk in model.stream("Write me 2 haikus. Only include the haikus."): assert isinstance(chunk, AIMessageChunk) - full = chunk if full is None else full + chunk + # only one chunk is allowed to set usage_metadata.input_tokens + # if multiple do, it's likely a bug that will result in overcounting + # input tokens + if full and full.usage_metadata and full.usage_metadata["input_tokens"]: + assert ( + not chunk.usage_metadata or not chunk.usage_metadata["input_tokens"] + ), ( + "Only one chunk should set input_tokens," + " the rest should be 0 or None" + ) + full = chunk if full is None else cast(AIMessageChunk, full + chunk) + assert isinstance(full, AIMessageChunk) assert full.usage_metadata is not None assert isinstance(full.usage_metadata["input_tokens"], int) From c10e1f70fe71ba292681012f456a0907c68558f6 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Wed, 9 Oct 2024 03:35:48 +0900 Subject: [PATCH 56/62] docs: update passio_nutrition_ai.ipynb (#27041) initalize -> initialize - [x] **PR title**: "package: description" - Where "package" is whichever of langchain, community, core, etc. is being modified. Use "docs: ..." for purely docs changes, "templates: ..." for template changes, "infra: ..." for CI changes. - Example: "community: add foobar LLM" Co-authored-by: Erick Friis --- docs/docs/integrations/tools/passio_nutrition_ai.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/integrations/tools/passio_nutrition_ai.ipynb b/docs/docs/integrations/tools/passio_nutrition_ai.ipynb index 5d67b2fc5d7..24899cfea00 100644 --- a/docs/docs/integrations/tools/passio_nutrition_ai.ipynb +++ b/docs/docs/integrations/tools/passio_nutrition_ai.ipynb @@ -176,7 +176,7 @@ "id": "f8014c9d", "metadata": {}, "source": [ - "Now, we can initalize the agent with the LLM, the prompt, and the tools. The agent is responsible for taking in input and deciding what actions to take. Crucially, the Agent does not execute those actions - that is done by the AgentExecutor (next step). For more information about how to think about these components, see our [conceptual guide](/docs/concepts#agents)" + "Now, we can initialize the agent with the LLM, the prompt, and the tools. The agent is responsible for taking in input and deciding what actions to take. Crucially, the Agent does not execute those actions - that is done by the AgentExecutor (next step). For more information about how to think about these components, see our [conceptual guide](/docs/concepts#agents)" ] }, { From feb4be82aa1a57c36a3a2d48f98a886143c715dd Mon Sep 17 00:00:00 2001 From: Mathias Colpaert Date: Tue, 8 Oct 2024 20:38:15 +0200 Subject: [PATCH 57/62] docs: in chatbot tutorial, make docs consistent with code sample (#27042) **Docs Chatbot Tutorial** The docs state that you can omit the language parameter, but the code sample to demonstrate, still contains it. Co-authored-by: Erick Friis --- docs/docs/tutorials/chatbot.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/tutorials/chatbot.ipynb b/docs/docs/tutorials/chatbot.ipynb index a1f983cc486..ec24551903e 100644 --- a/docs/docs/tutorials/chatbot.ipynb +++ b/docs/docs/tutorials/chatbot.ipynb @@ -686,7 +686,7 @@ "\n", "input_messages = [HumanMessage(query)]\n", "output = app.invoke(\n", - " {\"messages\": input_messages, \"language\": language},\n", + " {\"messages\": input_messages},\n", " config,\n", ")\n", "output[\"messages\"][-1].pretty_print()" From b716d808ba0e9edcd85c398b5a2e02c96f5caf74 Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Tue, 8 Oct 2024 12:04:40 -0700 Subject: [PATCH 58/62] docs: `integrations/providers/microsoft` update (#27055) Added reference to the AzureCognitiveServicesToolkit. Fixed titles. --------- Co-authored-by: Erick Friis --- .../docs/integrations/platforms/microsoft.mdx | 65 ++++++++++++++----- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/docs/docs/integrations/platforms/microsoft.mdx b/docs/docs/integrations/platforms/microsoft.mdx index e54c8cb24c7..a63c2fe898f 100644 --- a/docs/docs/integrations/platforms/microsoft.mdx +++ b/docs/docs/integrations/platforms/microsoft.mdx @@ -264,22 +264,20 @@ See a [usage example](/docs/integrations/document_loaders/url/#playwright-url-lo from langchain_community.document_loaders.onenote import OneNoteLoader ``` -## AI Agent Memory System - -[AI agent](https://learn.microsoft.com/en-us/azure/cosmos-db/ai-agents) needs robust memory systems that support multi-modality, offer strong operational performance, and enable agent memory sharing as well as separation. +## Vector Stores ### Azure Cosmos DB AI agents can rely on Azure Cosmos DB as a unified [memory system](https://learn.microsoft.com/en-us/azure/cosmos-db/ai-agents#memory-can-make-or-break-agents) solution, enjoying speed, scale, and simplicity. This service successfully [enabled OpenAI's ChatGPT service](https://www.youtube.com/watch?v=6IIUtEFKJec&t) to scale dynamically with high reliability and low maintenance. Powered by an atom-record-sequence engine, it is the world's first globally distributed [NoSQL](https://learn.microsoft.com/en-us/azure/cosmos-db/distributed-nosql), [relational](https://learn.microsoft.com/en-us/azure/cosmos-db/distributed-relational), and [vector database](https://learn.microsoft.com/en-us/azure/cosmos-db/vector-database) service that offers a serverless mode. Below are two available Azure Cosmos DB APIs that can provide vector store functionalities. -### Azure Cosmos DB for MongoDB (vCore) +#### Azure Cosmos DB for MongoDB (vCore) >[Azure Cosmos DB for MongoDB vCore](https://learn.microsoft.com/en-us/azure/cosmos-db/mongodb/vcore/) makes it easy to create a database with full native MongoDB support. > You can apply your MongoDB experience and continue to use your favorite MongoDB drivers, SDKs, and tools by pointing your application to the API for MongoDB vCore account's connection string. > Use vector search in Azure Cosmos DB for MongoDB vCore to seamlessly integrate your AI-based applications with your data that's stored in Azure Cosmos DB. -#### Installation and Setup +##### Installation and Setup See [detail configuration instructions](/docs/integrations/vectorstores/azure_cosmos_db). @@ -289,7 +287,7 @@ We need to install `pymongo` python package. pip install pymongo ``` -#### Deploy Azure Cosmos DB on Microsoft Azure +##### Deploy Azure Cosmos DB on Microsoft Azure Azure Cosmos DB for MongoDB vCore provides developers with a fully managed MongoDB-compatible database service for building modern applications with a familiar architecture. @@ -303,7 +301,7 @@ See a [usage example](/docs/integrations/vectorstores/azure_cosmos_db). from langchain_community.vectorstores import AzureCosmosDBVectorSearch ``` -### Azure Cosmos DB NoSQL +#### Azure Cosmos DB NoSQL >[Azure Cosmos DB for NoSQL](https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/vector-search) now offers vector indexing and search in preview. This feature is designed to handle high-dimensional vectors, enabling efficient and accurate vector search at any scale. You can now store vectors @@ -312,7 +310,7 @@ but also high-dimensional vectors as other properties of the documents. This col as the vectors are stored in the same logical unit as the data they represent. This simplifies data management, AI application architectures, and the efficiency of vector-based operations. -#### Installation and Setup +##### Installation and Setup See [detail configuration instructions](/docs/integrations/vectorstores/azure_cosmos_db_no_sql). @@ -322,7 +320,7 @@ We need to install `azure-cosmos` python package. pip install azure-cosmos ``` -#### Deploy Azure Cosmos DB on Microsoft Azure +##### Deploy Azure Cosmos DB on Microsoft Azure Azure Cosmos DB offers a solution for modern apps and intelligent workloads by being very responsive with dynamic and elastic autoscale. It is available in every Azure region and can automatically replicate data closer to users. It has SLA guaranteed low-latency and high availability. @@ -336,6 +334,7 @@ from langchain_community.vectorstores import AzureCosmosDBNoSQLVectorSearch ``` ### Azure Database for PostgreSQL + >[Azure Database for PostgreSQL - Flexible Server](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/service-overview) is a relational database service based on the open-source Postgres database engine. It's a fully managed database-as-a-service that can handle mission-critical workloads with predictable performance, security, high availability, and dynamic scalability. See [set up instructions](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/quickstart-create-server-portal) for Azure Database for PostgreSQL. @@ -446,6 +445,38 @@ The `azure_ai_services` toolkit includes the following tools: - Text to Speech: [AzureAiServicesTextToSpeechTool](https://python.langchain.com/api_reference/community/tools/langchain_community.tools.azure_ai_services.text_to_speech.AzureAiServicesTextToSpeechTool.html) - Text Analytics for Health: [AzureAiServicesTextAnalyticsForHealthTool](https://python.langchain.com/api_reference/community/tools/langchain_community.tools.azure_ai_services.text_analytics_for_health.AzureAiServicesTextAnalyticsForHealthTool.html) +### Azure Cognitive Services + +We need to install several python packages. + +```bash +pip install azure-ai-formrecognizer azure-cognitiveservices-speech azure-ai-vision-imageanalysis +``` + +See a [usage example](/docs/integrations/tools/azure_cognitive_services). + +```python +from langchain_community.agent_toolkits import AzureCognitiveServicesToolkit +``` + +#### Azure AI Services individual tools + +The `azure_ai_services` toolkit includes the tools that queries the `Azure Cognitive Services`: +- `AzureCogsFormRecognizerTool`: Form Recognizer API +- `AzureCogsImageAnalysisTool`: Image Analysis API +- `AzureCogsSpeech2TextTool`: Speech2Text API +- `AzureCogsText2SpeechTool`: Text2Speech API +- `AzureCogsTextAnalyticsHealthTool`: Text Analytics for Health API + +```python +from langchain_community.tools.azure_cognitive_services import ( + AzureCogsFormRecognizerTool, + AzureCogsImageAnalysisTool, + AzureCogsSpeech2TextTool, + AzureCogsText2SpeechTool, + AzureCogsTextAnalyticsHealthTool, +) +``` ### Microsoft Office 365 email and calendar @@ -465,11 +496,11 @@ from langchain_community.agent_toolkits import O365Toolkit #### Office 365 individual tools You can use individual tools from the Office 365 Toolkit: -- `O365CreateDraftMessage`: tool for creating a draft email in Office 365 -- `O365SearchEmails`: tool for searching email messages in Office 365 -- `O365SearchEvents`: tool for searching calendar events in Office 365 -- `O365SendEvent`: tool for sending calendar events in Office 365 -- `O365SendMessage`: tool for sending an email in Office 365 +- `O365CreateDraftMessage`: creating a draft email in Office 365 +- `O365SearchEmails`: searching email messages in Office 365 +- `O365SearchEvents`: searching calendar events in Office 365 +- `O365SendEvent`: sending calendar events in Office 365 +- `O365SendMessage`: sending an email in Office 365 ```python from langchain_community.tools.office365 import O365CreateDraftMessage @@ -497,9 +528,9 @@ from langchain_community.utilities.powerbi import PowerBIDataset #### PowerBI individual tools You can use individual tools from the Azure PowerBI Toolkit: -- `InfoPowerBITool`: tool for getting metadata about a PowerBI Dataset -- `ListPowerBITool`: tool for getting tables names -- `QueryPowerBITool`: tool for querying a PowerBI Dataset +- `InfoPowerBITool`: getting metadata about a PowerBI Dataset +- `ListPowerBITool`: getting tables names +- `QueryPowerBITool`: querying a PowerBI Dataset ```python from langchain_community.tools.powerbi.tool import InfoPowerBITool From c3cb56a9e8c21f32c687d30d15055456e5ed89b1 Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Tue, 8 Oct 2024 12:05:07 -0700 Subject: [PATCH 59/62] docs: `integrations` updates 18 (#27054) Added missed provider pages. Added descriptions and links. Fixed inconsistency in text formatting. Co-authored-by: Erick Friis --- docs/docs/integrations/providers/koboldai.mdx | 20 +++++ docs/docs/integrations/tools/jira.ipynb | 89 ++++++++++++++++++- docs/docs/integrations/tools/json.ipynb | 62 ++++++++++++- 3 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 docs/docs/integrations/providers/koboldai.mdx diff --git a/docs/docs/integrations/providers/koboldai.mdx b/docs/docs/integrations/providers/koboldai.mdx new file mode 100644 index 00000000000..66db8d9df42 --- /dev/null +++ b/docs/docs/integrations/providers/koboldai.mdx @@ -0,0 +1,20 @@ +# KoboldAI + +>[KoboldAI](https://koboldai.com/) is a free, open-source project that allows users to run AI models locally +> on their own computer. +> It's a browser-based front-end that can be used for writing or role playing with an AI. +>[KoboldAI](https://github.com/KoboldAI/KoboldAI-Client) is a "a browser-based front-end for +> AI-assisted writing with multiple local & remote AI models...". +> It has a public and local API that can be used in LangChain. + +## Installation and Setup + +Check out the [installation guide](https://github.com/KoboldAI/KoboldAI-Client). + +## LLMs + +See a [usage example](/docs/integrations/llms/koboldai). + +```python +from langchain_community.llms import KoboldApiLLM +``` diff --git a/docs/docs/integrations/tools/jira.ipynb b/docs/docs/integrations/tools/jira.ipynb index feb4331a4e7..045cd5d2d13 100644 --- a/docs/docs/integrations/tools/jira.ipynb +++ b/docs/docs/integrations/tools/jira.ipynb @@ -11,6 +11,8 @@ "\n", "The `Jira` toolkit allows agents to interact with a given Jira instance, performing actions such as searching for issues and creating issues, the tool wraps the atlassian-python-api library, for more see: https://atlassian-python-api.readthedocs.io/jira.html\n", "\n", + "## Installation and setup\n", + "\n", "To use this tool, you must first set as environment variables:\n", " JIRA_API_TOKEN\n", " JIRA_USERNAME\n", @@ -58,6 +60,13 @@ "ExecuteTime": { "end_time": "2023-04-17T10:21:23.730922Z", "start_time": "2023-04-17T10:21:22.911233Z" + }, + "execution": { + "iopub.execute_input": "2024-10-02T17:40:07.356954Z", + "iopub.status.busy": "2024-10-02T17:40:07.356792Z", + "iopub.status.idle": "2024-10-02T17:40:07.359943Z", + "shell.execute_reply": "2024-10-02T17:40:07.359476Z", + "shell.execute_reply.started": "2024-10-02T17:40:07.356942Z" } }, "outputs": [], @@ -72,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "b3050b55", "metadata": { "ExecuteTime": { @@ -80,6 +89,13 @@ "start_time": "2023-04-17T10:22:42.499447Z" }, "collapsed": false, + "execution": { + "iopub.execute_input": "2024-10-02T17:40:16.201684Z", + "iopub.status.busy": "2024-10-02T17:40:16.200922Z", + "iopub.status.idle": "2024-10-02T17:40:16.208035Z", + "shell.execute_reply": "2024-10-02T17:40:16.207564Z", + "shell.execute_reply.started": "2024-10-02T17:40:16.201634Z" + }, "jupyter": { "outputs_hidden": false } @@ -93,6 +109,74 @@ "os.environ[\"JIRA_CLOUD\"] = \"True\"" ] }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c0768000-227b-4aa1-a838-4befbdefadb1", + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-02T17:42:00.792867Z", + "iopub.status.busy": "2024-10-02T17:42:00.792365Z", + "iopub.status.idle": "2024-10-02T17:42:00.816979Z", + "shell.execute_reply": "2024-10-02T17:42:00.816419Z", + "shell.execute_reply.started": "2024-10-02T17:42:00.792827Z" + } + }, + "outputs": [], + "source": [ + "llm = OpenAI(temperature=0)\n", + "jira = JiraAPIWrapper()\n", + "toolkit = JiraToolkit.from_jira_api_wrapper(jira)" + ] + }, + { + "cell_type": "markdown", + "id": "961b3187-daf0-4907-9cc0-a69796fba4aa", + "metadata": {}, + "source": [ + "## Tool usage\n", + "\n", + "Let's see what individual tools are in the Jira toolkit:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "eb5cf521-9a91-44bc-b68e-bc4067d05a76", + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-02T17:42:27.232022Z", + "iopub.status.busy": "2024-10-02T17:42:27.231140Z", + "iopub.status.idle": "2024-10-02T17:42:27.240169Z", + "shell.execute_reply": "2024-10-02T17:42:27.239693Z", + "shell.execute_reply.started": "2024-10-02T17:42:27.231949Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[('JQL Query',\n", + " '\\n This tool is a wrapper around atlassian-python-api\\'s Jira jql API, useful when you need to search for Jira issues.\\n The input to this tool is a JQL query string, and will be passed into atlassian-python-api\\'s Jira `jql` function,\\n For example, to find all the issues in project \"Test\" assigned to the me, you would pass in the following string:\\n project = Test AND assignee = currentUser()\\n or to find issues with summaries that contain the word \"test\", you would pass in the following string:\\n summary ~ \\'test\\'\\n '),\n", + " ('Get Projects',\n", + " \"\\n This tool is a wrapper around atlassian-python-api's Jira project API, \\n useful when you need to fetch all the projects the user has access to, find out how many projects there are, or as an intermediary step that involv searching by projects. \\n there is no input to this tool.\\n \"),\n", + " ('Create Issue',\n", + " '\\n This tool is a wrapper around atlassian-python-api\\'s Jira issue_create API, useful when you need to create a Jira issue. \\n The input to this tool is a dictionary specifying the fields of the Jira issue, and will be passed into atlassian-python-api\\'s Jira `issue_create` function.\\n For example, to create a low priority task called \"test issue\" with description \"test description\", you would pass in the following dictionary: \\n {{\"summary\": \"test issue\", \"description\": \"test description\", \"issuetype\": {{\"name\": \"Task\"}}, \"priority\": {{\"name\": \"Low\"}}}}\\n '),\n", + " ('Catch all Jira API call',\n", + " '\\n This tool is a wrapper around atlassian-python-api\\'s Jira API.\\n There are other dedicated tools for fetching all projects, and creating and searching for issues, \\n use this tool if you need to perform any other actions allowed by the atlassian-python-api Jira API.\\n The input to this tool is a dictionary specifying a function from atlassian-python-api\\'s Jira API, \\n as well as a list of arguments and dictionary of keyword arguments to pass into the function.\\n For example, to get all the users in a group, while increasing the max number of results to 100, you would\\n pass in the following dictionary: {{\"function\": \"get_all_users_from_group\", \"args\": [\"group\"], \"kwargs\": {{\"limit\":100}} }}\\n or to find out how many projects are in the Jira instance, you would pass in the following string:\\n {{\"function\": \"projects\"}}\\n For more information on the Jira API, refer to https://atlassian-python-api.readthedocs.io/jira.html\\n '),\n", + " ('Create confluence page',\n", + " 'This tool is a wrapper around atlassian-python-api\\'s Confluence \\natlassian-python-api API, useful when you need to create a Confluence page. The input to this tool is a dictionary \\nspecifying the fields of the Confluence page, and will be passed into atlassian-python-api\\'s Confluence `create_page` \\nfunction. For example, to create a page in the DEMO space titled \"This is the title\" with body \"This is the body. You can use \\nHTML tags!\", you would pass in the following dictionary: {{\"space\": \"DEMO\", \"title\":\"This is the \\ntitle\",\"body\":\"This is the body. You can use HTML tags!\"}} ')]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(tool.name, tool.description) for tool in toolkit.get_tools()]" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -105,9 +189,6 @@ }, "outputs": [], "source": [ - "llm = OpenAI(temperature=0)\n", - "jira = JiraAPIWrapper()\n", - "toolkit = JiraToolkit.from_jira_api_wrapper(jira)\n", "agent = initialize_agent(\n", " toolkit.get_tools(), llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True\n", ")" diff --git a/docs/docs/integrations/tools/json.ipynb b/docs/docs/integrations/tools/json.ipynb index b2643080ab2..58d6c77e20a 100644 --- a/docs/docs/integrations/tools/json.ipynb +++ b/docs/docs/integrations/tools/json.ipynb @@ -35,9 +35,16 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "ff988466-c389-4ec6-b6ac-14364a537fd5", "metadata": { + "execution": { + "iopub.execute_input": "2024-10-02T17:52:40.107644Z", + "iopub.status.busy": "2024-10-02T17:52:40.107485Z", + "iopub.status.idle": "2024-10-02T17:52:40.110169Z", + "shell.execute_reply": "2024-10-02T17:52:40.109841Z", + "shell.execute_reply.started": "2024-10-02T17:52:40.107633Z" + }, "tags": [] }, "outputs": [], @@ -50,16 +57,23 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "9ecd1ba0-3937-4359-a41e-68605f0596a1", "metadata": { + "execution": { + "iopub.execute_input": "2024-10-02T17:59:54.134295Z", + "iopub.status.busy": "2024-10-02T17:59:54.134138Z", + "iopub.status.idle": "2024-10-02T17:59:54.137250Z", + "shell.execute_reply": "2024-10-02T17:59:54.136636Z", + "shell.execute_reply.started": "2024-10-02T17:59:54.134283Z" + }, "tags": [] }, "outputs": [], "source": [ "with open(\"openai_openapi.yml\") as f:\n", " data = yaml.load(f, Loader=yaml.FullLoader)\n", - "json_spec = JsonSpec(dict_=data, max_value_length=4000)\n", + "json_spec = JsonSpec(dict_={}, max_value_length=4000)\n", "json_toolkit = JsonToolkit(spec=json_spec)\n", "\n", "json_agent_executor = create_json_agent(\n", @@ -67,6 +81,48 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "910eccbc-9d42-49b6-a4ca-1fbc418fcee7", + "metadata": {}, + "source": [ + "## Individual tools\n", + "\n", + "Let's see what individual tools are inside the Jira toolkit." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b16a3ee5-ca16-452e-993f-c27228b945ac", + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-02T18:00:30.527665Z", + "iopub.status.busy": "2024-10-02T18:00:30.527053Z", + "iopub.status.idle": "2024-10-02T18:00:30.538483Z", + "shell.execute_reply": "2024-10-02T18:00:30.537672Z", + "shell.execute_reply.started": "2024-10-02T18:00:30.527626Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[('json_spec_list_keys',\n", + " '\\n Can be used to list all keys at a given path. \\n Before calling this you should be SURE that the path to this exists.\\n The input is a text representation of the path to the dict in Python syntax (e.g. data[\"key1\"][0][\"key2\"]).\\n '),\n", + " ('json_spec_get_value',\n", + " '\\n Can be used to see value in string format at a given path.\\n Before calling this you should be SURE that the path to this exists.\\n The input is a text representation of the path to the dict in Python syntax (e.g. data[\"key1\"][0][\"key2\"]).\\n ')]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(el.name, el.description) for el in json_toolkit.get_tools()]" + ] + }, { "cell_type": "markdown", "id": "05cfcb24-4389-4b8f-ad9e-466e3fca8db0", From e3920f23205384536180d7004179434c41a19360 Mon Sep 17 00:00:00 2001 From: ccurme Date: Tue, 8 Oct 2024 15:16:59 -0400 Subject: [PATCH 60/62] community[patch]: fix structured_output in llamacpp integration (#27202) Resolves https://github.com/langchain-ai/langchain/issues/25318. --- .../chat_models/llamacpp.py | 5 +++-- .../chat_models/test_llamacpp.py | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 libs/community/tests/integration_tests/chat_models/test_llamacpp.py diff --git a/libs/community/langchain_community/chat_models/llamacpp.py b/libs/community/langchain_community/chat_models/llamacpp.py index 65055e7fa7b..ea9b5975d11 100644 --- a/libs/community/langchain_community/chat_models/llamacpp.py +++ b/libs/community/langchain_community/chat_models/llamacpp.py @@ -342,7 +342,7 @@ class ChatLlamaCpp(BaseChatModel): self, tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]], *, - tool_choice: Optional[Union[Dict[str, Dict], bool, str]] = None, + tool_choice: Optional[Union[dict, bool, str]] = None, **kwargs: Any, ) -> Runnable[LanguageModelInput, BaseMessage]: """Bind tool-like objects to this chat model @@ -538,7 +538,8 @@ class ChatLlamaCpp(BaseChatModel): "Received None." ) tool_name = convert_to_openai_tool(schema)["function"]["name"] - llm = self.bind_tools([schema], tool_choice=tool_name) + tool_choice = {"type": "function", "function": {"name": tool_name}} + llm = self.bind_tools([schema], tool_choice=tool_choice) if is_pydantic_schema: output_parser: OutputParserLike = PydanticToolsParser( tools=[cast(Type, schema)], first_tool_only=True diff --git a/libs/community/tests/integration_tests/chat_models/test_llamacpp.py b/libs/community/tests/integration_tests/chat_models/test_llamacpp.py new file mode 100644 index 00000000000..589f6e3063d --- /dev/null +++ b/libs/community/tests/integration_tests/chat_models/test_llamacpp.py @@ -0,0 +1,19 @@ +from pydantic import BaseModel, Field + +from langchain_community.chat_models import ChatLlamaCpp + + +class Joke(BaseModel): + """Joke to tell user.""" + + setup: str = Field(description="question to set up a joke") + punchline: str = Field(description="answer to resolve the joke") + + +# TODO: replace with standard integration tests +# See example in tests/integration_tests/chat_models/test_litellm.py +def test_structured_output() -> None: + llm = ChatLlamaCpp(model_path="/path/to/Meta-Llama-3.1-8B-Instruct.Q4_K_M.gguf") + structured_llm = llm.with_structured_output(Joke) + result = structured_llm.invoke("Tell me a short joke about cats.") + assert isinstance(result, Joke) From e3e9ee8398cb4517f611a64a666c028585b701dc Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:15:33 -0700 Subject: [PATCH 61/62] core[patch]: utils for adding/subtracting usage metadata (#27203) --- libs/core/langchain_core/messages/ai.py | 128 ++++++++++++++++-- libs/core/langchain_core/utils/usage.py | 37 +++++ .../core/tests/unit_tests/messages/test_ai.py | 104 ++++++++++++++ .../core/tests/unit_tests/utils/test_usage.py | 38 ++++++ 4 files changed, 296 insertions(+), 11 deletions(-) create mode 100644 libs/core/langchain_core/utils/usage.py create mode 100644 libs/core/tests/unit_tests/utils/test_usage.py diff --git a/libs/core/langchain_core/messages/ai.py b/libs/core/langchain_core/messages/ai.py index 63036baf048..727a0045ffb 100644 --- a/libs/core/langchain_core/messages/ai.py +++ b/libs/core/langchain_core/messages/ai.py @@ -1,5 +1,6 @@ import json -from typing import Any, Literal, Optional, Union +import operator +from typing import Any, Literal, Optional, Union, cast from pydantic import model_validator from typing_extensions import NotRequired, Self, TypedDict @@ -27,6 +28,7 @@ from langchain_core.messages.tool import ( ) from langchain_core.utils._merge import merge_dicts, merge_lists from langchain_core.utils.json import parse_partial_json +from langchain_core.utils.usage import _dict_int_op class InputTokenDetails(TypedDict, total=False): @@ -432,17 +434,9 @@ def add_ai_message_chunks( # Token usage if left.usage_metadata or any(o.usage_metadata is not None for o in others): - usage_metadata_: UsageMetadata = left.usage_metadata or UsageMetadata( - input_tokens=0, output_tokens=0, total_tokens=0 - ) + usage_metadata: Optional[UsageMetadata] = left.usage_metadata for other in others: - if other.usage_metadata is not None: - usage_metadata_["input_tokens"] += other.usage_metadata["input_tokens"] - usage_metadata_["output_tokens"] += other.usage_metadata[ - "output_tokens" - ] - usage_metadata_["total_tokens"] += other.usage_metadata["total_tokens"] - usage_metadata: Optional[UsageMetadata] = usage_metadata_ + usage_metadata = add_usage(usage_metadata, other.usage_metadata) else: usage_metadata = None @@ -455,3 +449,115 @@ def add_ai_message_chunks( usage_metadata=usage_metadata, id=left.id, ) + + +def add_usage( + left: Optional[UsageMetadata], right: Optional[UsageMetadata] +) -> UsageMetadata: + """Recursively add two UsageMetadata objects. + + Example: + .. code-block:: python + + from langchain_core.messages.ai import add_usage + + left = UsageMetadata( + input_tokens=5, + output_tokens=0, + total_tokens=5, + input_token_details=InputTokenDetails(cache_read=3) + ) + right = UsageMetadata( + input_tokens=0, + output_tokens=10, + total_tokens=10, + output_token_details=OutputTokenDetails(reasoning=4) + ) + + add_usage(left, right) + + results in + + .. code-block:: python + + UsageMetadata( + input_tokens=5, + output_tokens=10, + total_tokens=15, + input_token_details=InputTokenDetails(cache_read=3), + output_token_details=OutputTokenDetails(reasoning=4) + ) + + """ + if not (left or right): + return UsageMetadata(input_tokens=0, output_tokens=0, total_tokens=0) + if not (left and right): + return cast(UsageMetadata, left or right) + + return UsageMetadata( + **cast( + UsageMetadata, + _dict_int_op( + cast(dict, left), + cast(dict, right), + operator.add, + ), + ) + ) + + +def subtract_usage( + left: Optional[UsageMetadata], right: Optional[UsageMetadata] +) -> UsageMetadata: + """Recursively subtract two UsageMetadata objects. + + Token counts cannot be negative so the actual operation is max(left - right, 0). + + Example: + .. code-block:: python + + from langchain_core.messages.ai import subtract_usage + + left = UsageMetadata( + input_tokens=5, + output_tokens=10, + total_tokens=15, + input_token_details=InputTokenDetails(cache_read=4) + ) + right = UsageMetadata( + input_tokens=3, + output_tokens=8, + total_tokens=11, + output_token_details=OutputTokenDetails(reasoning=4) + ) + + subtract_usage(left, right) + + results in + + .. code-block:: python + + UsageMetadata( + input_tokens=2, + output_tokens=2, + total_tokens=4, + input_token_details=InputTokenDetails(cache_read=4), + output_token_details=OutputTokenDetails(reasoning=0) + ) + + """ + if not (left or right): + return UsageMetadata(input_tokens=0, output_tokens=0, total_tokens=0) + if not (left and right): + return cast(UsageMetadata, left or right) + + return UsageMetadata( + **cast( + UsageMetadata, + _dict_int_op( + cast(dict, left), + cast(dict, right), + (lambda le, ri: max(le - ri, 0)), + ), + ) + ) diff --git a/libs/core/langchain_core/utils/usage.py b/libs/core/langchain_core/utils/usage.py new file mode 100644 index 00000000000..ce198e268ba --- /dev/null +++ b/libs/core/langchain_core/utils/usage.py @@ -0,0 +1,37 @@ +from typing import Callable + + +def _dict_int_op( + left: dict, + right: dict, + op: Callable[[int, int], int], + *, + default: int = 0, + depth: int = 0, + max_depth: int = 100, +) -> dict: + if depth >= max_depth: + msg = f"{max_depth=} exceeded, unable to combine dicts." + raise ValueError(msg) + combined: dict = {} + for k in set(left).union(right): + if isinstance(left.get(k, default), int) and isinstance( + right.get(k, default), int + ): + combined[k] = op(left.get(k, default), right.get(k, default)) + elif isinstance(left.get(k, {}), dict) and isinstance(right.get(k, {}), dict): + combined[k] = _dict_int_op( + left.get(k, {}), + right.get(k, {}), + op, + default=default, + depth=depth + 1, + max_depth=max_depth, + ) + else: + types = [type(d[k]) for d in (left, right) if k in d] + msg = ( + f"Unknown value types: {types}. Only dict and int values are supported." + ) + raise ValueError(msg) + return combined diff --git a/libs/core/tests/unit_tests/messages/test_ai.py b/libs/core/tests/unit_tests/messages/test_ai.py index 1de40acf94c..d36d0347128 100644 --- a/libs/core/tests/unit_tests/messages/test_ai.py +++ b/libs/core/tests/unit_tests/messages/test_ai.py @@ -1,5 +1,13 @@ from langchain_core.load import dumpd, load from langchain_core.messages import AIMessage, AIMessageChunk +from langchain_core.messages.ai import ( + InputTokenDetails, + OutputTokenDetails, + UsageMetadata, + add_ai_message_chunks, + add_usage, + subtract_usage, +) from langchain_core.messages.tool import invalid_tool_call as create_invalid_tool_call from langchain_core.messages.tool import tool_call as create_tool_call from langchain_core.messages.tool import tool_call_chunk as create_tool_call_chunk @@ -92,3 +100,99 @@ def test_serdes_message_chunk() -> None: actual = dumpd(chunk) assert actual == expected assert load(actual) == chunk + + +def test_add_usage_both_none() -> None: + result = add_usage(None, None) + assert result == UsageMetadata(input_tokens=0, output_tokens=0, total_tokens=0) + + +def test_add_usage_one_none() -> None: + usage = UsageMetadata(input_tokens=10, output_tokens=20, total_tokens=30) + result = add_usage(usage, None) + assert result == usage + + +def test_add_usage_both_present() -> None: + usage1 = UsageMetadata(input_tokens=10, output_tokens=20, total_tokens=30) + usage2 = UsageMetadata(input_tokens=5, output_tokens=10, total_tokens=15) + result = add_usage(usage1, usage2) + assert result == UsageMetadata(input_tokens=15, output_tokens=30, total_tokens=45) + + +def test_add_usage_with_details() -> None: + usage1 = UsageMetadata( + input_tokens=10, + output_tokens=20, + total_tokens=30, + input_token_details=InputTokenDetails(audio=5), + output_token_details=OutputTokenDetails(reasoning=10), + ) + usage2 = UsageMetadata( + input_tokens=5, + output_tokens=10, + total_tokens=15, + input_token_details=InputTokenDetails(audio=3), + output_token_details=OutputTokenDetails(reasoning=5), + ) + result = add_usage(usage1, usage2) + assert result["input_token_details"]["audio"] == 8 + assert result["output_token_details"]["reasoning"] == 15 + + +def test_subtract_usage_both_none() -> None: + result = subtract_usage(None, None) + assert result == UsageMetadata(input_tokens=0, output_tokens=0, total_tokens=0) + + +def test_subtract_usage_one_none() -> None: + usage = UsageMetadata(input_tokens=10, output_tokens=20, total_tokens=30) + result = subtract_usage(usage, None) + assert result == usage + + +def test_subtract_usage_both_present() -> None: + usage1 = UsageMetadata(input_tokens=10, output_tokens=20, total_tokens=30) + usage2 = UsageMetadata(input_tokens=5, output_tokens=10, total_tokens=15) + result = subtract_usage(usage1, usage2) + assert result == UsageMetadata(input_tokens=5, output_tokens=10, total_tokens=15) + + +def test_subtract_usage_with_negative_result() -> None: + usage1 = UsageMetadata(input_tokens=5, output_tokens=10, total_tokens=15) + usage2 = UsageMetadata(input_tokens=10, output_tokens=20, total_tokens=30) + result = subtract_usage(usage1, usage2) + assert result == UsageMetadata(input_tokens=0, output_tokens=0, total_tokens=0) + + +def test_add_ai_message_chunks_usage() -> None: + chunks = [ + AIMessageChunk(content="", usage_metadata=None), + AIMessageChunk( + content="", + usage_metadata=UsageMetadata( + input_tokens=2, output_tokens=3, total_tokens=5 + ), + ), + AIMessageChunk( + content="", + usage_metadata=UsageMetadata( + input_tokens=2, + output_tokens=3, + total_tokens=5, + input_token_details=InputTokenDetails(audio=1, cache_read=1), + output_token_details=OutputTokenDetails(audio=1, reasoning=2), + ), + ), + ] + combined = add_ai_message_chunks(*chunks) + assert combined == AIMessageChunk( + content="", + usage_metadata=UsageMetadata( + input_tokens=4, + output_tokens=6, + total_tokens=10, + input_token_details=InputTokenDetails(audio=1, cache_read=1), + output_token_details=OutputTokenDetails(audio=1, reasoning=2), + ), + ) diff --git a/libs/core/tests/unit_tests/utils/test_usage.py b/libs/core/tests/unit_tests/utils/test_usage.py new file mode 100644 index 00000000000..0d845d00789 --- /dev/null +++ b/libs/core/tests/unit_tests/utils/test_usage.py @@ -0,0 +1,38 @@ +import pytest + +from langchain_core.utils.usage import _dict_int_op + + +def test_dict_int_op_add() -> None: + left = {"a": 1, "b": 2} + right = {"b": 3, "c": 4} + result = _dict_int_op(left, right, lambda x, y: x + y) + assert result == {"a": 1, "b": 5, "c": 4} + + +def test_dict_int_op_subtract() -> None: + left = {"a": 5, "b": 10} + right = {"a": 2, "b": 3, "c": 1} + result = _dict_int_op(left, right, lambda x, y: max(x - y, 0)) + assert result == {"a": 3, "b": 7, "c": 0} + + +def test_dict_int_op_nested() -> None: + left = {"a": 1, "b": {"c": 2, "d": 3}} + right = {"a": 2, "b": {"c": 1, "e": 4}} + result = _dict_int_op(left, right, lambda x, y: x + y) + assert result == {"a": 3, "b": {"c": 3, "d": 3, "e": 4}} + + +def test_dict_int_op_max_depth_exceeded() -> None: + left = {"a": {"b": {"c": 1}}} + right = {"a": {"b": {"c": 2}}} + with pytest.raises(ValueError): + _dict_int_op(left, right, lambda x, y: x + y, max_depth=2) + + +def test_dict_int_op_invalid_types() -> None: + left = {"a": 1, "b": "string"} + right = {"a": 2, "b": 3} + with pytest.raises(ValueError): + _dict_int_op(left, right, lambda x, y: x + y) From 73ad7f2e7afd28b62c3416d0bf10e20a2d26e41a Mon Sep 17 00:00:00 2001 From: RIdham Golakiya <109126257+RidhamGolakiya@users.noreply.github.com> Date: Wed, 9 Oct 2024 01:51:58 +0530 Subject: [PATCH 62/62] langchain_chroma[patch]: updated example for get documents with where clause (#26767) Example updated for vectorstore ChromaDB. If we want to apply multiple filters then ChromaDB supports filters like this: Reference: [ChromaDB filters](https://cookbook.chromadb.dev/core/filters/) Thank you. --- libs/partners/chroma/langchain_chroma/vectorstores.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/partners/chroma/langchain_chroma/vectorstores.py b/libs/partners/chroma/langchain_chroma/vectorstores.py index 90c59ef2beb..945057f4adb 100644 --- a/libs/partners/chroma/langchain_chroma/vectorstores.py +++ b/libs/partners/chroma/langchain_chroma/vectorstores.py @@ -941,7 +941,7 @@ class Chroma(VectorStore): Args: ids: The ids of the embeddings to get. Optional. where: A Where type dict used to filter results by. - E.g. `{"color" : "red", "price": 4.20}`. Optional. + E.g. `{"$and": [{"color": "red"}, {"price": 4.20}]}` Optional. limit: The number of documents to return. Optional. offset: The offset to start returning results from. Useful for paging results with limit. Optional.