diff --git a/libs/packages.yml b/libs/packages.yml index 8f9a16d2f48..e04572dbd17 100644 --- a/libs/packages.yml +++ b/libs/packages.yml @@ -141,5 +141,5 @@ packages: repo: langchain-ai/langchain path: libs/partners/ollama - name: langchain-box - repo: langchain-ai/langchain - path: libs/partners/box + repo: langchain-ai/langchain-box + path: libs/box diff --git a/libs/partners/box/.gitignore b/libs/partners/box/.gitignore deleted file mode 100644 index bee8a64b79a..00000000000 --- a/libs/partners/box/.gitignore +++ /dev/null @@ -1 +0,0 @@ -__pycache__ diff --git a/libs/partners/box/LICENSE b/libs/partners/box/LICENSE deleted file mode 100644 index fc0602feecd..00000000000 --- a/libs/partners/box/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 LangChain, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/libs/partners/box/Makefile b/libs/partners/box/Makefile deleted file mode 100644 index 5b66a13edfe..00000000000 --- a/libs/partners/box/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -.PHONY: all format lint test tests integration_tests docker_tests help extended_tests - -# Default target executed when no arguments are given to make. -all: help - -# Define a variable for the test file path. -TEST_FILE ?= tests/unit_tests/ -integration_test integration_tests: TEST_FILE = tests/integration_tests/ - - -# unit tests are run with the --disable-socket flag to prevent network calls -test tests: - poetry run pytest --disable-socket --allow-unix-socket $(TEST_FILE) - -test_watch: - poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE) - -# integration tests are run without the --disable-socket flag to allow network calls -integration_test integration_tests: - poetry run pytest $(TEST_FILE) - -###################### -# LINTING AND FORMATTING -###################### - -# Define a variable for Python and notebook files. -PYTHON_FILES=. -MYPY_CACHE=.mypy_cache -lint format: PYTHON_FILES=. -lint_diff format_diff: PYTHON_FILES=$(shell git diff --relative=libs/partners/box --name-only --diff-filter=d master | grep -E '\.py$$|\.ipynb$$') -lint_package: PYTHON_FILES=langchain_box -lint_tests: PYTHON_FILES=tests -lint_tests: MYPY_CACHE=.mypy_cache_test - -lint lint_diff lint_package lint_tests: - poetry run ruff . - poetry run ruff format $(PYTHON_FILES) --diff - poetry run ruff --select I $(PYTHON_FILES) - mkdir -p $(MYPY_CACHE); poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) - -format format_diff: - poetry run ruff format $(PYTHON_FILES) - poetry run ruff --select I --fix $(PYTHON_FILES) - -spell_check: - poetry run codespell --toml pyproject.toml - -spell_fix: - poetry run codespell --toml pyproject.toml -w - -check_imports: $(shell find langchain_box -name '*.py') - poetry run python ./scripts/check_imports.py $^ - -###################### -# HELP -###################### - -help: - @echo '----' - @echo 'check_imports - check imports' - @echo 'format - run code formatters' - @echo 'lint - run linters' - @echo 'test - run unit tests' - @echo 'tests - run unit tests' - @echo 'test TEST_FILE= - run all tests in file' diff --git a/libs/partners/box/README.md b/libs/partners/box/README.md index 9c091725733..d2a21ac8ce9 100644 --- a/libs/partners/box/README.md +++ b/libs/partners/box/README.md @@ -1,195 +1,3 @@ -# langchain-box +This package has moved! -This package contains the LangChain integration with Box. For more information about -Box, check out our [developer documentation](https://developer.box.com). - -## Pre-requisites - -In order to integrate with Box, you need a few things: - -* A Box instance — if you are not a current Box customer, sign up for a -[free dev account](https://account.box.com/signup/n/developer#ty9l3). -* A Box app — more on how to -[create an app](https://developer.box.com/guides/getting-started/first-application/) -* Your app approved in your Box instance — This is done by your admin. -The good news is if you are using a free developer account, you are the admin. -[Authorize your app](https://developer.box.com/guides/authorization/custom-app-approval/#manual-approval) - -## Installation - -```bash -pip install -U langchain-box -``` - -## Authentication - -The `box-langchain` package offers some flexibility to authentication. The -most basic authentication method is by using a developer token. This can be -found in the [Box developer console](https://account.box.com/developers/console) -on the configuration screen. This token is purposely short-lived (1 hour) and is -intended for development. With this token, you can add it to your environment as -`BOX_DEVELOPER_TOKEN`, you can pass it directly to the loader, or you can use the -`BoxAuth` authentication helper class. - -We will cover passing it directly to the loader in the section below. - -### BoxAuth helper class - -`BoxAuth` supports the following authentication methods: - -* Token — either a developer token or any token generated through the Box SDK -* JWT with a service account -* JWT with a specified user -* CCG with a service account -* CCG with a specified user - -> [!NOTE] -> If using JWT authentication, you will need to download the configuration from the Box -> developer console after generating your public/private key pair. Place this file in your -> application directory structure somewhere. You will use the path to this file when using -> the `BoxAuth` helper class. - -For more information, learn about how to -[set up a Box application](https://developer.box.com/guides/getting-started/first-application/), -and check out the -[Box authentication guide](https://developer.box.com/guides/authentication/select/) -for more about our different authentication options. - -Examples: - -**Token** - -```python -from langchain_box.document_loaders import BoxLoader -from langchain_box.utilities import BoxAuth, BoxAuthType - -auth = BoxAuth( - auth_type=BoxAuthType.TOKEN, - box_developer_token=box_developer_token -) - -loader = BoxLoader( - box_auth=auth, - ... -) -``` - -**JWT with a service account** - -```python -from langchain_box.document_loaders import BoxLoader -from langchain_box.utilities import BoxAuth, BoxAuthType - -auth = BoxAuth( - auth_type=BoxAuthType.JWT, - box_jwt_path=box_jwt_path -) - -loader = BoxLoader( - box_auth=auth, - ... -``` - -**JWT with a specified user** - -```python -from langchain_box.document_loaders import BoxLoader -from langchain_box.utilities import BoxAuth, BoxAuthType - -auth = BoxAuth( - auth_type=BoxAuthType.JWT, - box_jwt_path=box_jwt_path, - box_user_id=box_user_id -) - -loader = BoxLoader( - box_auth=auth, - ... -``` - -**CCG with a service account** - -```python -from langchain_box.document_loaders import BoxLoader -from langchain_box.utilities import BoxAuth, BoxAuthType - -auth = BoxAuth( - auth_type=BoxAuthType.CCG, - box_client_id=box_client_id, - box_client_secret=box_client_secret, - box_enterprise_id=box_enterprise_id -) - -loader = BoxLoader( - box_auth=auth, - ... -``` - -**CCG with a specified user** - -```python -from langchain_box.document_loaders import BoxLoader -from langchain_box.utilities import BoxAuth, BoxAuthType - -auth = BoxAuth( - auth_type=BoxAuthType.CCG, - box_client_id=box_client_id, - box_client_secret=box_client_secret, - box_user_id=box_user_id -) - -loader = BoxLoader( - box_auth=auth, - ... -``` - -## Document Loaders - -The `BoxLoader` class helps you get your unstructured content from Box -in Langchain's `Document` format. You can do this with either a `List[str]` -containing Box file IDs, or with a `str` containing a Box folder ID. - -If getting files from a folder with folder ID, you can also set a `Bool` to -tell the loader to get all sub-folders in that folder, as well. - -:::info -A Box instance can contain Petabytes of files, and folders can contain millions -of files. Be intentional when choosing what folders you choose to index. And we -recommend never getting all files from folder 0 recursively. Folder ID 0 is your -root folder. -::: - -### Load files - -```python -import os - -from langchain_box.document_loaders import BoxLoader - -os.environ["BOX_DEVELOPER_TOKEN"] = "df21df2df21df2d1f21df2df1" - -loader = BoxLoader( - box_file_ids=["12345", "67890"], - character_limit=10000 # Optional. Defaults to no limit -) - -docs = loader.lazy_load() -``` - -### Load from folder - -```python -import os - -from langchain_box.document_loaders import BoxLoader - -os.environ["BOX_DEVELOPER_TOKEN"] = "df21df2df21df2d1f21df2df1" - -loader = BoxLoader( - box_folder_id="12345", - recursive=False, # Optional. return entire tree, defaults to False - character_limit=10000 # Optional. Defaults to no limit -) - -docs = loader.lazy_load() -``` \ No newline at end of file +https://github.com/langchain-ai/langchain-box/tree/main/libs/box diff --git a/libs/partners/box/langchain_box/__init__.py b/libs/partners/box/langchain_box/__init__.py deleted file mode 100644 index 830436908ec..00000000000 --- a/libs/partners/box/langchain_box/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -from importlib import metadata - -from langchain_box.document_loaders import BoxLoader -from langchain_box.retrievers import BoxRetriever -from langchain_box.utilities.box import ( - BoxAuth, - BoxAuthType, - BoxSearchOptions, - DocumentFiles, - SearchTypeFilter, - _BoxAPIWrapper, -) - -try: - __version__ = metadata.version(__package__) -except metadata.PackageNotFoundError: - # Case where package metadata is not available. - __version__ = "" -del metadata # optional, avoids polluting the results of dir(__package__) - -__all__ = [ - "BoxLoader", - "BoxRetriever", - "BoxAuth", - "BoxAuthType", - "BoxSearchOptions", - "DocumentFiles", - "SearchTypeFilter", - "_BoxAPIWrapper", - "__version__", -] diff --git a/libs/partners/box/langchain_box/document_loaders/__init__.py b/libs/partners/box/langchain_box/document_loaders/__init__.py deleted file mode 100644 index 91a4ca3b885..00000000000 --- a/libs/partners/box/langchain_box/document_loaders/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Box Document Loaders.""" - -from langchain_box.document_loaders.box import BoxLoader - -__all__ = ["BoxLoader"] diff --git a/libs/partners/box/langchain_box/document_loaders/box.py b/libs/partners/box/langchain_box/document_loaders/box.py deleted file mode 100644 index f19e4ca3785..00000000000 --- a/libs/partners/box/langchain_box/document_loaders/box.py +++ /dev/null @@ -1,260 +0,0 @@ -from typing import Iterator, List, Optional - -from box_sdk_gen import FileBaseTypeField # type: ignore -from langchain_core.document_loaders.base import BaseLoader -from langchain_core.documents import Document -from langchain_core.utils import from_env -from pydantic import BaseModel, ConfigDict, Field, model_validator -from typing_extensions import Self - -from langchain_box.utilities import BoxAuth, _BoxAPIWrapper - - -class BoxLoader(BaseLoader, BaseModel): - """BoxLoader. - - This class will help you load files from your Box instance. You must have a - Box account. If you need one, you can sign up for a free developer account. - You will also need a Box application created in the developer portal, where - you can select your authorization type. - - If you wish to use either of the Box AI options, you must be on an Enterprise - Plus plan or above. The free developer account does not have access to Box AI. - - In addition, using the Box AI API requires a few prerequisite steps: - - * Your administrator must enable the Box AI API - * You must enable the ``Manage AI`` scope in your app in the developer console. - * Your administrator must install and enable your application. - - **Setup**: - Install ``langchain-box`` and set environment variable ``BOX_DEVELOPER_TOKEN``. - - .. code-block:: bash - - pip install -U langchain-box - export BOX_DEVELOPER_TOKEN="your-api-key" - - - This loader returns ``Document`` objects built from text representations of files - in Box. It will skip any document without a text representation available. You can - provide either a ``List[str]`` containing Box file IDS, or you can provide a - ``str`` contining a Box folder ID. If providing a folder ID, you can also enable - recursive mode to get the full tree under that folder. - - .. note:: - A Box instance can contain Petabytes of files, and folders can contain millions - of files. Be intentional when choosing what folders you choose to index. And we - recommend never getting all files from folder 0 recursively. Folder ID 0 is your - root folder. - - **Instantiate**: - - .. list-table:: Initialization variables - :widths: 25 50 15 10 - :header-rows: 1 - - * - Variable - - Description - - Type - - Default - * - box_developer_token - - Token to use for auth. - - ``str`` - - ``None`` - * - box_auth - - client id for you app. Used for CCG - - ``langchain_box.utilities.BoxAuth`` - - ``None`` - * - box_file_ids - - client id for you app. Used for CCG - - ``List[str]`` - - ``None`` - * - box_folder_id - - client id for you app. Used for CCG - - ``str`` - - ``None`` - * - recursive - - client id for you app. Used for CCG - - ``Bool`` - - ``False`` - * - character_limit - - client id for you app. Used for CCG - - ``int`` - - ``-1`` - - - **Get files** — this method requires you pass the ``box_file_ids`` parameter. - This is a ``List[str]`` containing the file IDs you wish to index. - - .. code-block:: python - - from langchain_box.document_loaders import BoxLoader - - box_file_ids = ["1514555423624", "1514553902288"] - - loader = BoxLoader( - box_file_ids=box_file_ids, - character_limit=10000 # Optional. Defaults to no limit - ) - - **Get files in a folder** — this method requires you pass the ``box_folder_id`` - parameter. This is a ``str`` containing the folder ID you wish to index. - - .. code-block:: python - - from langchain_box.document_loaders import BoxLoader - - box_folder_id = "260932470532" - - loader = BoxLoader( - box_folder_id=box_folder_id, - recursive=False # Optional. return entire tree, defaults to False - ) - - **Load**: - .. code-block:: python - - docs = loader.load() - docs[0] - - .. code-block:: python - - 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') - - **Lazy load**: - .. code-block:: python - - docs = [] - docs_lazy = loader.lazy_load() - - for doc in docs_lazy: - docs.append(doc) - print(docs[0].page_content[:100]) - print(docs[0].metadata) - - .. code-block:: python - - 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') - - """ - - box_developer_token: Optional[str] = Field( - default_factory=from_env("BOX_DEVELOPER_TOKEN", default=None) - ) - """String containing the Box Developer Token generated in the developer console""" - - box_auth: Optional[BoxAuth] = None - """Configured - `BoxAuth `_ - object""" - - box_file_ids: Optional[List[str]] = None - """List[str] containing Box file ids""" - - box_folder_id: Optional[str] = None - """String containing box folder id to load files from""" - - recursive: Optional[bool] = False - """If getting files by folder id, recursive is a bool to determine if you wish - to traverse subfolders to return child documents. Default is False""" - - character_limit: Optional[int] = -1 - """character_limit is an int that caps the number of characters to - return per document.""" - - _box: Optional[_BoxAPIWrapper] = None - - model_config = ConfigDict( - arbitrary_types_allowed=True, - extra="allow", - use_enum_values=True, - ) - - @model_validator(mode="after") - def validate_box_loader_inputs(self) -> Self: - _box = None - - """Validate that has either box_file_ids or box_folder_id.""" - if not self.box_file_ids and not self.box_folder_id: - raise ValueError("You must provide box_file_ids or box_folder_id.") - - """Validate that we don't have both box_file_ids and box_folder_id.""" - if self.box_file_ids and self.box_folder_id: - raise ValueError( - "You must provide either box_file_ids or box_folder_id, not both." - ) - - """Validate that we have either a box_developer_token or box_auth.""" - if not self.box_auth: - if not self.box_developer_token: - raise ValueError( - "you must provide box_developer_token or a box_auth " - "generated with langchain_box.utilities.BoxAuth" - ) - else: - _box = _BoxAPIWrapper( # type: ignore[call-arg] - box_developer_token=self.box_developer_token, - character_limit=self.character_limit, - ) - else: - _box = _BoxAPIWrapper( # type: ignore[call-arg] - box_auth=self.box_auth, - character_limit=self.character_limit, - ) - - self._box = _box - - return self - - def _get_files_from_folder(self, folder_id): # type: ignore[no-untyped-def] - folder_content = self.box.get_folder_items(folder_id) - - for file in folder_content: - try: - if file.type == FileBaseTypeField.FILE: - doc = self._box.get_document_by_file_id(file.id) - - if doc is not None: - yield doc - - elif file.type == "folder" and self.recursive: - try: - yield from self._get_files_from_folder(file.id) - except TypeError: - pass - except TypeError: - pass - - def lazy_load(self) -> Iterator[Document]: - """Load documents. Accepts no arguments. Returns `Iterator[Document]`""" - if self.box_file_ids: - for file_id in self.box_file_ids: - try: - file = self._box.get_document_by_file_id(file_id) # type: ignore[union-attr] - - if file is not None: - yield file - except TypeError: - pass - elif self.box_folder_id: - try: - yield from self._get_files_from_folder(self.box_folder_id) - except TypeError: - pass - except Exception as e: - print(f"Exception {e}") # noqa: T201 - else: - raise ValueError( - "You must provide either `box_file_ids` or `box_folder_id`" - ) diff --git a/libs/partners/box/langchain_box/py.typed b/libs/partners/box/langchain_box/py.typed deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/langchain_box/retrievers/__init__.py b/libs/partners/box/langchain_box/retrievers/__init__.py deleted file mode 100644 index 8a8ac5dc4c2..00000000000 --- a/libs/partners/box/langchain_box/retrievers/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Box Document Loaders.""" - -from langchain_box.retrievers.box import BoxRetriever - -__all__ = ["BoxRetriever"] diff --git a/libs/partners/box/langchain_box/retrievers/box.py b/libs/partners/box/langchain_box/retrievers/box.py deleted file mode 100644 index 1c8dc550665..00000000000 --- a/libs/partners/box/langchain_box/retrievers/box.py +++ /dev/null @@ -1,185 +0,0 @@ -from typing import List, Optional - -from langchain_core.callbacks import CallbackManagerForRetrieverRun -from langchain_core.documents import Document -from langchain_core.retrievers import BaseRetriever -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 - - -class BoxRetriever(BaseRetriever): - """Box retriever. - - `BoxRetriever` provides the ability to retrieve content from - your Box instance in a couple of ways. - - 1. You can use the Box full-text search to retrieve the - complete document(s) that match your search query, as - `List[Document]` - 2. You can use the Box AI Platform API to retrieve the results - from a Box AI prompt. This can be a `Document` containing - the result of the prompt, or you can retrieve the citations - used to generate the prompt to include in your vectorstore. - - Setup: - Install ``langchain-box``: - - .. code-block:: bash - - pip install -U langchain-box - - Instantiate: - - To use search: - - .. code-block:: python - - from langchain_box.retrievers import BoxRetriever - - retriever = BoxRetriever() - - To use Box AI: - - .. code-block:: python - - from langchain_box.retrievers import BoxRetriever - - file_ids=["12345","67890"] - - retriever = BoxRetriever(file_ids) - - - Usage: - .. code-block:: python - - retriever = BoxRetriever() - retriever.invoke("victor") - print(docs[0].page_content[:100]) - - .. code-block:: none - - [ - Document( - metadata={ - 'source': 'url', - 'title': 'FIVE_FEET_AND_RISING_by_Peter_Sollett_pdf' - }, - page_content='\\n3/20/23, 5:31 PM F...' - ) - ] - - Use within a chain: - .. code-block:: python - - from langchain_core.output_parsers import StrOutputParser - from langchain_core.prompts import ChatPromptTemplate - from langchain_core.runnables import RunnablePassthrough - from langchain_openai import ChatOpenAI - - retriever = BoxRetriever(box_developer_token=box_developer_token, character_limit=10000) - - context="You are an actor reading scripts to learn about your role in an upcoming movie." - question="describe the character Victor" - - prompt = ChatPromptTemplate.from_template( - \"""Answer the question based only on the context provided. - - Context: {context} - - Question: {question}\""" - ) - - def format_docs(docs): - return "\\n\\n".join(doc.page_content for doc in docs) - - chain = ( - {"context": retriever | format_docs, "question": RunnablePassthrough()} - | prompt - | llm - | StrOutputParser() - ) - - chain.invoke("Victor") # search query to find files in Box - ) - - .. code-block:: none - - 'Victor is a skinny 12-year-old with sloppy hair who is seen - sleeping on his fire escape in the sun. He is hesitant to go to - the pool with his friend Carlos because he is afraid of getting - in trouble for not letting his mother cut his hair. Ultimately, - he decides to go to the pool with Carlos.' - """ # noqa: E501 - - box_developer_token: Optional[str] = Field( - default_factory=from_env("BOX_DEVELOPER_TOKEN", default=None) - ) - - box_auth: Optional[BoxAuth] = None - """Configured - `BoxAuth `_ - object""" - - box_file_ids: Optional[List[str]] = None - """List[str] containing Box file ids""" - - character_limit: Optional[int] = -1 - """character_limit is an int that caps the number of characters to - return per document.""" - - 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( - arbitrary_types_allowed=True, - extra="allow", - ) - - @model_validator(mode="after") - def validate_box_loader_inputs(self) -> Self: - _box = None - - """Validate that we have either a box_developer_token or box_auth.""" - if not self.box_auth and not self.box_developer_token: - raise ValueError( - "you must provide box_developer_token or a box_auth " - "generated with langchain_box.utilities.BoxAuth" - ) - - _box = _BoxAPIWrapper( # type: ignore[call-arg] - box_developer_token=self.box_developer_token, - box_auth=self.box_auth, - character_limit=self.character_limit, - box_search_options=self.box_search_options, - ) - - self._box = _box - - return self - - def _get_relevant_documents( - self, query: str, *, run_manager: CallbackManagerForRetrieverRun - ) -> List[Document]: - if self.box_file_ids: # If using Box AI - 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/__init__.py b/libs/partners/box/langchain_box/utilities/__init__.py deleted file mode 100644 index f95d17b753d..00000000000 --- a/libs/partners/box/langchain_box/utilities/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Box API Utilities.""" - -from langchain_box.utilities.box import ( - BoxAuth, - BoxAuthType, - BoxSearchOptions, - DocumentFiles, - SearchTypeFilter, - _BoxAPIWrapper, -) - -__all__ = [ - "BoxAuth", - "BoxAuthType", - "BoxSearchOptions", - "DocumentFiles", - "SearchTypeFilter", - "_BoxAPIWrapper", -] diff --git a/libs/partners/box/langchain_box/utilities/box.py b/libs/partners/box/langchain_box/utilities/box.py deleted file mode 100644 index 8c87a8dc4cd..00000000000 --- a/libs/partners/box/langchain_box/utilities/box.py +++ /dev/null @@ -1,875 +0,0 @@ -"""Util that calls Box APIs.""" - -from enum import Enum -from typing import Any, Dict, List, Optional - -import box_sdk_gen # type: ignore -import requests -from langchain_core.documents import Document -from langchain_core.utils import from_env -from pydantic import BaseModel, ConfigDict, Field, model_validator -from typing_extensions import Self - - -class DocumentFiles(Enum): - """DocumentFiles(Enum). - - An enum containing all of the supported extensions for files - Box considers Documents. These files should have text - representations. - """ - - DOC = "doc" - DOCX = "docx" - GDOC = "gdoc" - GSHEET = "gsheet" - NUMBERS = "numbers" - ODS = "ods" - ODT = "odt" - PAGES = "pages" - PDF = "pdf" - RTF = "rtf" - WPD = "wpd" - XLS = "xls" - XLSM = "xlsm" - XLSX = "xlsx" - AS = "as" - AS3 = "as3" - ASM = "asm" - BAT = "bat" - C = "c" - CC = "cc" - CMAKE = "cmake" - CPP = "cpp" - CS = "cs" - CSS = "css" - CSV = "csv" - CXX = "cxx" - DIFF = "diff" - ERB = "erb" - GROOVY = "groovy" - H = "h" - HAML = "haml" - HH = "hh" - HTM = "htm" - HTML = "html" - JAVA = "java" - JS = "js" - JSON = "json" - LESS = "less" - LOG = "log" - M = "m" - MAKE = "make" - MD = "md" - ML = "ml" - MM = "mm" - MSG = "msg" - PHP = "php" - PL = "pl" - PROPERTIES = "properties" - PY = "py" - RB = "rb" - RST = "rst" - SASS = "sass" - SCALA = "scala" - SCM = "scm" - SCRIPT = "script" - SH = "sh" - SML = "sml" - SQL = "sql" - TXT = "txt" - VI = "vi" - VIM = "vim" - WEBDOC = "webdoc" - XHTML = "xhtml" - XLSB = "xlsb" - XML = "xml" - XSD = "xsd" - XSL = "xsl" - YAML = "yaml" - GSLLIDE = "gslide" - GSLIDES = "gslides" - KEY = "key" - ODP = "odp" - PPT = "ppt" - PPTX = "pptx" - BOXNOTE = "boxnote" - - -class ImageFiles(Enum): - """ImageFiles(Enum). - - An enum containing all of the supported extensions for files - Box considers images. - """ - - ARW = "arw" - BMP = "bmp" - CR2 = "cr2" - DCM = "dcm" - DICM = "dicm" - DICOM = "dicom" - DNG = "dng" - EPS = "eps" - EXR = "exr" - GIF = "gif" - HEIC = "heic" - INDD = "indd" - INDML = "indml" - INDT = "indt" - INX = "inx" - JPEG = "jpeg" - JPG = "jpg" - NEF = "nef" - PNG = "png" - SVG = "svg" - TIF = "tif" - TIFF = "tiff" - TGA = "tga" - SVS = "svs" - - -class BoxAuthType(Enum): - """BoxAuthType(Enum). - - an enum to tell BoxLoader how you wish to autheticate your Box connection. - - Options are: - - TOKEN - Use a developer token generated from the Box Deevloper Token. - Only recommended for development. - Provide ``box_developer_token``. - CCG - Client Credentials Grant. - provide ``box_client_id`, ``box_client_secret`, - and ``box_enterprise_id`` or optionally `box_user_id`. - JWT - Use JWT for authentication. Config should be stored on the file - system accessible to your app. - provide ``box_jwt_path``. Optionally, provide ``box_user_id`` to - act as a specific user - """ - - TOKEN = "token" - """Use a developer token or a token retrieved from ``box-sdk-gen``""" - - CCG = "ccg" - """Use ``client_credentials`` type grant""" - - JWT = "jwt" - """Use JWT bearer token auth""" - - -class BoxAuth(BaseModel): - """**BoxAuth.** - - The ``box-langchain`` package offers some flexibility to authentication. The - most basic authentication method is by using a developer token. This can be - found in the `Box developer console `_ - on the configuration screen. This token is purposely short-lived (1 hour) and is - intended for development. With this token, you can add it to your environment as - ``BOX_DEVELOPER_TOKEN``, you can pass it directly to the loader, or you can use the - ``BoxAuth`` authentication helper class. - - `BoxAuth` supports the following authentication methods: - - * **Token** — either a developer token or any token generated through the Box SDK - * **JWT** with a service account - * **JWT** with a specified user - * **CCG** with a service account - * **CCG** with a specified user - - .. note:: - If using JWT authentication, you will need to download the configuration from - the Box developer console after generating your public/private key pair. Place - this file in your application directory structure somewhere. You will use the - path to this file when using the ``BoxAuth`` helper class. If you wish to use - OAuth2 with the authorization_code flow, please use ``BoxAuthType.TOKEN`` with - the token you have acquired. - - For more information, learn about how to - `set up a Box application `_, - and check out the - `Box authentication guide `_ - for more about our different authentication options. - - Simple implementation: - - To instantiate, you must provide a ``langchain_box.utilities.BoxAuthType``. - - BoxAuthType is an enum to tell BoxLoader how you wish to autheticate your - Box connection. - - Options are: - - TOKEN - Use a developer token generated from the Box Deevloper Token. - Only recommended for development. - Provide ``box_developer_token``. - CCG - Client Credentials Grant. - provide ``box_client_id``, ``box_client_secret``, - and ``box_enterprise_id`` or optionally ``box_user_id``. - JWT - Use JWT for authentication. Config should be stored on the file - system accessible to your app. - provide ``box_jwt_path``. Optionally, provide ``box_user_id`` to - act as a specific user - - **Examples**: - - **Token** - - .. code-block:: python - - from langchain_box.document_loaders import BoxLoader - from langchain_box.utilities import BoxAuth, BoxAuthType - - auth = BoxAuth( - auth_type=BoxAuthType.TOKEN, - box_developer_token=box_developer_token - ) - - loader = BoxLoader( - box_auth=auth, - ... - ) - - - **JWT with a service account** - - .. code-block:: python - - from langchain_box.document_loaders import BoxLoader - from langchain_box.utilities import BoxAuth, BoxAuthType - - auth = BoxAuth( - auth_type=BoxAuthType.JWT, - box_jwt_path=box_jwt_path - ) - - loader = BoxLoader( - box_auth=auth, - ... - ) - - - **JWT with a specified user** - - .. code-block:: python - - from langchain_box.document_loaders import BoxLoader - from langchain_box.utilities import BoxAuth, BoxAuthType - - auth = BoxAuth( - auth_type=BoxAuthType.JWT, - box_jwt_path=box_jwt_path, - box_user_id=box_user_id - ) - - loader = BoxLoader( - box_auth=auth, - ... - ) - - - **CCG with a service account** - - .. code-block:: python - - from langchain_box.document_loaders import BoxLoader - from langchain_box.utilities import BoxAuth, BoxAuthType - - auth = BoxAuth( - auth_type=BoxAuthType.CCG, - box_client_id=box_client_id, - box_client_secret=box_client_secret, - box_enterprise_id=box_enterprise_id - ) - - loader = BoxLoader( - box_auth=auth, - ... - ) - - - **CCG with a specified user** - - .. code-block:: python - - from langchain_box.document_loaders import BoxLoader - from langchain_box.utilities import BoxAuth, BoxAuthType - - auth = BoxAuth( - auth_type=BoxAuthType.CCG, - box_client_id=box_client_id, - box_client_secret=box_client_secret, - box_user_id=box_user_id - ) - - loader = BoxLoader( - box_auth=auth, - ... - ) - - """ - - auth_type: BoxAuthType - """``langchain_box.utilities.BoxAuthType``. Enum describing how to - authenticate against Box""" - - box_developer_token: Optional[str] = Field( - default_factory=from_env("BOX_DEVELOPER_TOKEN", default=None) - ) - """ If using ``BoxAuthType.TOKEN``, provide your token here""" - - box_jwt_path: Optional[str] = Field( - default_factory=from_env("BOX_JWT_PATH", default=None) - ) - """If using ``BoxAuthType.JWT``, provide local path to your - JWT configuration file""" - - box_client_id: Optional[str] = Field( - default_factory=from_env("BOX_CLIENT_ID", default=None) - ) - """If using ``BoxAuthType.CCG``, provide your app's client ID""" - - box_client_secret: Optional[str] = Field( - default_factory=from_env("BOX_CLIENT_SECRET", default=None) - ) - """If using ``BoxAuthType.CCG``, provide your app's client secret""" - - box_enterprise_id: Optional[str] = None - """If using ``BoxAuthType.CCG``, provide your enterprise ID. - Only required if you are not sending ``box_user_id``""" - - box_user_id: Optional[str] = None - """If using ``BoxAuthType.CCG`` or ``BoxAuthType.JWT``, providing - ``box_user_id`` will act on behalf of a specific user""" - - _box_client: Optional[box_sdk_gen.BoxClient] = None - _custom_header: Dict = dict({"x-box-ai-library": "langchain"}) - - model_config = ConfigDict( - arbitrary_types_allowed=True, - use_enum_values=True, - extra="allow", - ) - - @model_validator(mode="after") - def validate_box_auth_inputs(self) -> Self: - """Validate auth_type is set""" - if not self.auth_type: - raise ValueError("Auth type must be set.") - - """Validate that TOKEN auth type provides box_developer_token.""" - if self.auth_type == "token" and not self.box_developer_token: - raise ValueError(f"{self.auth_type} requires box_developer_token to be set") - - """Validate that JWT auth type provides box_jwt_path.""" - if self.auth_type == "jwt" and not self.box_jwt_path: - raise ValueError(f"{self.auth_type} requires box_jwt_path to be set") - - """Validate that CCG auth type provides box_client_id and - box_client_secret and either box_enterprise_id or box_user_id.""" - if self.auth_type == "ccg": - if ( - not self.box_client_id - or not self.box_client_secret - or (not self.box_enterprise_id and not self.box_user_id) - ): - raise ValueError( - f"{self.auth_type} requires box_client_id, \ - box_client_secret, and box_enterprise_id/box_user_id." - ) - - return self - - def _authorize(self) -> None: - if self.auth_type == "token": - try: - auth = box_sdk_gen.BoxDeveloperTokenAuth(token=self.box_developer_token) - self._box_client = box_sdk_gen.BoxClient(auth=auth).with_extra_headers( - extra_headers=self._custom_header - ) - - except box_sdk_gen.BoxSDKError as bse: - raise RuntimeError( - f"Error getting client from developer token: {bse.message}" - ) - except Exception as ex: - raise ValueError( - f"Invalid Box developer token. Please verify your \ - token and try again.\n{ex}" - ) from ex - - elif self.auth_type == "jwt": - try: - jwt_config = box_sdk_gen.JWTConfig.from_config_file( - config_file_path=self.box_jwt_path - ) - auth = box_sdk_gen.BoxJWTAuth(config=jwt_config) - - self._box_client = box_sdk_gen.BoxClient(auth=auth).with_extra_headers( - extra_headers=self._custom_header - ) - - if self.box_user_id is not None: - user_auth = auth.with_user_subject(self.box_user_id) - self._box_client = box_sdk_gen.BoxClient( - auth=user_auth - ).with_extra_headers(extra_headers=self._custom_header) - - except box_sdk_gen.BoxSDKError as bse: - raise RuntimeError( - f"Error getting client from jwt token: {bse.message}" - ) - except Exception as ex: - raise ValueError( - "Error authenticating. Please verify your JWT config \ - and try again." - ) from ex - - elif self.auth_type == "ccg": - try: - if self.box_user_id is not None: - ccg_config = box_sdk_gen.CCGConfig( - client_id=self.box_client_id, - client_secret=self.box_client_secret, - user_id=self.box_user_id, - ) - else: - ccg_config = box_sdk_gen.CCGConfig( - client_id=self.box_client_id, - client_secret=self.box_client_secret, - enterprise_id=self.box_enterprise_id, - ) - auth = box_sdk_gen.BoxCCGAuth(config=ccg_config) - - self._box_client = box_sdk_gen.BoxClient(auth=auth).with_extra_headers( - extra_headers=self._custom_header - ) - - except box_sdk_gen.BoxSDKError as bse: - raise RuntimeError( - f"Error getting client from ccg token: {bse.message}" - ) - except Exception as ex: - raise ValueError( - "Error authenticating. Please verify you are providing a \ - valid client id, secret and either a valid user ID or \ - enterprise ID." - ) from ex - - else: - raise ValueError( - f"{self.auth_type} is not a valid auth_type. Value must be \ - TOKEN, CCG, or JWT." - ) - - def get_client(self) -> box_sdk_gen.BoxClient: - """Instantiate the Box SDK.""" - if self._box_client is None: - self._authorize() - - return self._box_client - - -class SearchTypeFilter(Enum): - """SearchTypeFilter. - - Enum to limit the what we search. - """ - - NAME = "name" - """The name of the item, as defined by its ``name`` field.""" - - DESCRIPTION = "description" - """The description of the item, as defined by its ``description`` field.""" - - FILE_CONTENT = "file_content" - """The actual content of the file.""" - - COMMENTS = "comments" - """The content of any of the comments on a file or folder.""" - - TAGS = "tags" - """Any tags that are applied to an item, as defined by its ``tags`` field.""" - - -class BoxSearchOptions(BaseModel): - ancestor_folder_ids: Optional[List[str]] = None - """Limits the search results to items within the given list of folders, - defined as a comma separated lists of folder IDs.""" - - search_type_filter: Optional[List[SearchTypeFilter]] = None - """Limits the search results to any items that match the search query for a - specific part of the file, for example the file description. - - Content types are defined as a comma separated lists of Box recognized - content types. The allowed content types are as follows. Default is all.""" - - created_date_range: Optional[List[str]] = None - """Limits the search results to any items created within a given date range. - - Date ranges are defined as comma separated RFC3339 timestamps. - - If the the start date is omitted (,2014-05-17T13:35:01-07:00) anything - created before the end date will be returned. - - If the end date is omitted (2014-05-15T13:35:01-07:00,) the current - date will be used as the end date instead.""" - - file_extensions: Optional[List[DocumentFiles]] = None - """Limits the search results to any files that match any of the provided - file extensions. This list is a comma-separated list of - ``langchain_box.utilities.DocumentFiles`` entries""" - - k: Optional[int] = 100 - """Defines the maximum number of items to return. Defaults to 100, maximum - is 200.""" - - size_range: Optional[List[int]] = None - """Limits the search results to any items with a size within a given file - size range. This applied to files and folders. - - Size ranges are defined as comma separated list of a lower and upper - byte size limit (inclusive). - - The upper and lower bound can be omitted to create open ranges.""" - - updated_date_range: Optional[List[str]] = None - """Limits the search results to any items updated within a given date range. - - Date ranges are defined as comma separated RFC3339 timestamps. - - If the start date is omitted (,2014-05-17T13:35:01-07:00) anything - updated before the end date will be returned. - - If the end date is omitted (2014-05-15T13:35:01-07:00,) the current - date will be used as the end date instead.""" - - class Config: - arbitrary_types_allowed = True - use_enum_values = True - extra = "allow" - - @model_validator(mode="after") - def validate_search_options(self) -> Self: - """Validate k is between 1 and 200""" - if self.k > 200 or self.k < 1: # type: ignore[operator] - raise ValueError( - f"Invalid setting of k {self.k}. " "Value must be between 1 and 200." - ) - - """Validate created_date_range start date is before end date""" - if self.created_date_range: - if ( - self.created_date_range[0] is None # type: ignore[index] - or self.created_date_range[0] == "" # type: ignore[index] - or self.created_date_range[1] is None # type: ignore[index] - or self.created_date_range[1] == "" # type: ignore[index] - ): - pass - else: - if ( - self.created_date_range[0] # type: ignore[index] - > self.created_date_range[1] # type: ignore[index] - ): - raise ValueError("Start date must be before end date.") - - """Validate updated_date_range start date is before end date""" - if self.updated_date_range: - if ( - self.updated_date_range[0] is None # type: ignore[index] - or self.updated_date_range[0] == "" # type: ignore[index] - or self.updated_date_range[1] is None # type: ignore[index] - or self.updated_date_range[1] == "" # type: ignore[index] - ): - pass - else: - if ( - self.updated_date_range[0] # type: ignore[index] - > self.updated_date_range[1] # type: ignore[index] - ): - raise ValueError("Start date must be before end date.") - - return self - - -class _BoxAPIWrapper(BaseModel): - """Wrapper for Box API.""" - - box_developer_token: Optional[str] = Field( - default_factory=from_env("BOX_DEVELOPER_TOKEN", default=None) - ) - """String containing the Box Developer Token generated in the developer console""" - - box_auth: Optional[BoxAuth] = None - """Configured langchain_box.utilities.BoxAuth object""" - - character_limit: Optional[int] = -1 - """character_limit is an int that caps the number of characters to - return per document.""" - - box_search_options: Optional[BoxSearchOptions] = None - """Search options to configure BoxRetriever to narrow search results.""" - - _box: Optional[box_sdk_gen.BoxClient] - - model_config = ConfigDict( - arbitrary_types_allowed=True, - use_enum_values=True, - extra="allow", - ) - - @model_validator(mode="after") - def validate_box_api_inputs(self) -> Self: - self._box = None - - """Validate that TOKEN auth type provides box_developer_token.""" - if not self.box_auth: - if not self.box_developer_token: - raise ValueError( - "You must configure either box_developer_token of box_auth" - ) - else: - box_auth = self.box_auth - self._box = box_auth.get_client() # type: ignore[union-attr] - - return self - - def get_box_client(self) -> box_sdk_gen.BoxClient: - box_auth = BoxAuth( - auth_type=BoxAuthType.TOKEN, box_developer_token=self.box_developer_token - ) - - self._box = box_auth.get_client() - - def _do_request(self, url: str) -> Any: - try: - access_token = self._box.auth.retrieve_token().access_token # type: ignore[union-attr] - except box_sdk_gen.BoxSDKError as bse: - raise RuntimeError(f"Error getting client from jwt token: {bse.message}") - - resp = requests.get(url, headers={"Authorization": f"Bearer {access_token}"}) - resp.raise_for_status() - return resp.content - - def _get_text_representation(self, file_id: str = "") -> tuple[str, str, str]: - try: - from box_sdk_gen import BoxAPIError, BoxSDKError - except ImportError: - raise ImportError("You must run `pip install box-sdk-gen`") - - if self._box is None: - self.get_box_client() - - try: - file = self._box.files.get_file_by_id( # type: ignore[union-attr] - file_id, - x_rep_hints="[extracted_text]", - fields=["name", "representations", "type"], - ) - except BoxAPIError as bae: - raise RuntimeError(f"BoxAPIError: Error getting text rep: {bae.message}") - except BoxSDKError as bse: - raise RuntimeError(f"BoxSDKError: Error getting text rep: {bse.message}") - except Exception: - return None, None, None # type: ignore[return-value] - - file_repr = file.representations.entries - - if len(file_repr) <= 0: - return None, None, None # type: ignore[return-value] - - for entry in file_repr: - if entry.representation == "extracted_text": - # If the file representation doesn't exist, calling - # info.url will generate text if possible - if entry.status.state == "none": - self._do_request(entry.info.url) - - url = entry.content.url_template.replace("{+asset_path}", "") - file_name = file.name.replace(".", "_").replace(" ", "_") - - try: - raw_content = self._do_request(url) - except requests.exceptions.HTTPError: - return None, None, None # type: ignore[return-value] - - if ( - self.character_limit is not None and self.character_limit > 0 # type: ignore[operator] - ): - content = raw_content[0 : (self.character_limit - 1)] - else: - content = raw_content - - return file_name, content, url - - return None, None, None # type: ignore[return-value] - - def get_document_by_file_id(self, file_id: str) -> Optional[Document]: - """Load a file from a Box id. Accepts file_id as str. - Returns `Document`""" - - if self._box is None: - self.get_box_client() - - file = self._box.files.get_file_by_id( # type: ignore[union-attr] - file_id, fields=["name", "type", "extension"] - ) - - if file.type == "file": - if hasattr(DocumentFiles, file.extension.upper()): - file_name, content, url = self._get_text_representation(file_id=file_id) - - if file_name is None or content is None or url is None: - return None - - metadata = { - "source": f"{url}", - "title": f"{file_name}", - } - - return Document(page_content=content, metadata=metadata) - - return None - - return None - - def get_folder_items(self, folder_id: str) -> box_sdk_gen.Items: - """Get all the items in a folder. Accepts folder_id as str. - returns box_sdk_gen.Items""" - if self._box is None: - self.get_box_client() - - try: - folder_contents = self._box.folders.get_folder_items( # type: ignore[union-attr] - folder_id, fields=["id", "type", "name"] - ) - except box_sdk_gen.BoxAPIError as bae: - raise RuntimeError( - f"BoxAPIError: Error getting folder content: {bae.message}" - ) - except box_sdk_gen.BoxSDKError as bse: - raise RuntimeError( - f"BoxSDKError: Error getting folder content: {bse.message}" - ) - - return folder_contents.entries - - def search_box(self, query: str) -> List[Document]: - if self._box is None: - self.get_box_client() - - files = [] - - try: - results = None - - if self.box_search_options is None: - results = self._box.search.search_for_content( # type: ignore[union-attr] - query=query, fields=["id", "type", "extension"], type="file" - ) - else: - results = self._box.search.search_for_content( # type: ignore[union-attr] - query=query, - fields=["id", "type", "extension"], - type="file", - ancestor_folder_ids=self.box_search_options.ancestor_folder_ids, # type: ignore[union-attr] - content_types=self.box_search_options.search_type_filter, # type: ignore[union-attr] - created_at_range=self.box_search_options.created_date_range, # type: ignore[union-attr] - file_extensions=self.box_search_options.file_extensions, # type: ignore[union-attr] - limit=self.box_search_options.k, # type: ignore[union-attr] - size_range=self.box_search_options.size_range, # type: ignore[union-attr] - updated_at_range=self.box_search_options.updated_date_range, # type: ignore[union-attr] - ) - - if results.entries is None or len(results.entries) <= 0: - return None # type: ignore[return-value] - - for file in results.entries: - if ( - file is not None - and file.type == "file" - and hasattr(DocumentFiles, file.extension.upper()) - ): - doc = self.get_document_by_file_id(file.id) - - if doc is not None: - files.append(doc) - - return files - except box_sdk_gen.BoxAPIError as bae: - raise RuntimeError( - f"BoxAPIError: Error getting search results: {bae.message}" - ) - except box_sdk_gen.BoxSDKError as bse: - raise RuntimeError( - f"BoxSDKError: Error getting search results: {bse.message}" - ) - - 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() - - ai_mode = box_sdk_gen.CreateAiAskMode.SINGLE_ITEM_QA.value - - if len(box_file_ids) > 1: - ai_mode = box_sdk_gen.CreateAiAskMode.MULTIPLE_ITEM_QA.value - elif len(box_file_ids) <= 0: - raise ValueError("BOX_AI_ASK requires at least one file ID") - - items = [] - - for file_id in box_file_ids: - 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( # 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}" - ) - except box_sdk_gen.BoxSDKError as bse: - raise RuntimeError( - f"BoxSDKError: Error getting Box AI result: {bse.message}" - ) - - docs = [] - - if answer: - content = response.answer - metadata = {"source": "Box AI", "title": f"Box AI {query}"} - - 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 deleted file mode 100644 index 8589034ae40..00000000000 --- a/libs/partners/box/poetry.lock +++ /dev/null @@ -1,1102 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "anyio" -version = "4.6.2.post1" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -files = [ - {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, - {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -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", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] -trio = ["trio (>=0.26.1)"] - -[[package]] -name = "box-sdk-gen" -version = "1.5.1" -description = "Official Box Python Generated SDK" -optional = false -python-versions = "*" -files = [ - {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] -cryptography = {version = ">=3", optional = true, markers = "extra == \"jwt\""} -pyjwt = {version = ">=1.7.0", optional = true, markers = "extra == \"jwt\""} -requests = "*" -requests-toolbelt = "*" - -[package.extras] -dev = ["tox"] -jwt = ["cryptography (>=3)", "pyjwt (>=1.7.0)"] -test = ["cryptography (>=3)", "pyjwt (>=1.7.0)", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "certifi" -version = "2024.8.30" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, -] - -[[package]] -name = "cffi" -version = "1.17.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.4.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, -] - -[[package]] -name = "codespell" -version = "2.3.0" -description = "Codespell" -optional = false -python-versions = ">=3.8" -files = [ - {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, - {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, -] - -[package.extras] -dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] -hard-encoding-detection = ["chardet"] -toml = ["tomli"] -types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "cryptography" -version = "43.0.3" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, - {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, - {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, - {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, - {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, - {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, - {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] -test-randomorder = ["pytest-randomly"] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.6" -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"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.27.2" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "idna" -version = "3.10" -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"}, -] - -[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" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - -[[package]] -name = "langchain-core" -version = "0.3.15" -description = "Building applications with LLMs through composability" -optional = false -python-versions = ">=3.9,<4.0" -files = [] -develop = true - -[package.dependencies] -jsonpatch = "^1.33" -langsmith = "^0.1.125" -packaging = ">=23.2,<25" -pydantic = [ - {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -PyYAML = ">=5.3" -tenacity = ">=8.1.0,!=8.4.0,<10.0.0" -typing-extensions = ">=4.7" - -[package.source] -type = "directory" -url = "../../core" - -[[package]] -name = "langsmith" -version = "0.1.137" -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.137-py3-none-any.whl", hash = "sha256:4256d5c61133749890f7b5c88321dbb133ce0f440c621ea28e76513285859b81"}, - {file = "langsmith-0.1.137.tar.gz", hash = "sha256:56cdfcc6c74cb20a3f437d5bd144feb5bf93f54c5a2918d1e568cbd084a372d4"}, -] - -[package.dependencies] -httpx = ">=0.23.0,<1" -orjson = ">=3.9.14,<4.0.0" -pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, - {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" -version = "1.13.0" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -faster-cache = ["orjson"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "orjson" -version = "3.10.10" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "orjson-3.10.10-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b788a579b113acf1c57e0a68e558be71d5d09aa67f62ca1f68e01117e550a998"}, - {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:804b18e2b88022c8905bb79bd2cbe59c0cd014b9328f43da8d3b28441995cda4"}, - {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9972572a1d042ec9ee421b6da69f7cc823da5962237563fa548ab17f152f0b9b"}, - {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc6993ab1c2ae7dd0711161e303f1db69062955ac2668181bfdf2dd410e65258"}, - {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d78e4cacced5781b01d9bc0f0cd8b70b906a0e109825cb41c1b03f9c41e4ce86"}, - {file = "orjson-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6eb2598df518281ba0cbc30d24c5b06124ccf7e19169e883c14e0831217a0bc"}, - {file = "orjson-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23776265c5215ec532de6238a52707048401a568f0fa0d938008e92a147fe2c7"}, - {file = "orjson-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8cc2a654c08755cef90b468ff17c102e2def0edd62898b2486767204a7f5cc9c"}, - {file = "orjson-3.10.10-cp310-none-win32.whl", hash = "sha256:081b3fc6a86d72efeb67c13d0ea7c030017bd95f9868b1e329a376edc456153b"}, - {file = "orjson-3.10.10-cp310-none-win_amd64.whl", hash = "sha256:ff38c5fb749347768a603be1fb8a31856458af839f31f064c5aa74aca5be9efe"}, - {file = "orjson-3.10.10-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:879e99486c0fbb256266c7c6a67ff84f46035e4f8749ac6317cc83dacd7f993a"}, - {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019481fa9ea5ff13b5d5d95e6fd5ab25ded0810c80b150c2c7b1cc8660b662a7"}, - {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0dd57eff09894938b4c86d4b871a479260f9e156fa7f12f8cad4b39ea8028bb5"}, - {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbde6d70cd95ab4d11ea8ac5e738e30764e510fc54d777336eec09bb93b8576c"}, - {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2625cb37b8fb42e2147404e5ff7ef08712099197a9cd38895006d7053e69d6"}, - {file = "orjson-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbf3c20c6a7db69df58672a0d5815647ecf78c8e62a4d9bd284e8621c1fe5ccb"}, - {file = "orjson-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:75c38f5647e02d423807d252ce4528bf6a95bd776af999cb1fb48867ed01d1f6"}, - {file = "orjson-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:23458d31fa50ec18e0ec4b0b4343730928296b11111df5f547c75913714116b2"}, - {file = "orjson-3.10.10-cp311-none-win32.whl", hash = "sha256:2787cd9dedc591c989f3facd7e3e86508eafdc9536a26ec277699c0aa63c685b"}, - {file = "orjson-3.10.10-cp311-none-win_amd64.whl", hash = "sha256:6514449d2c202a75183f807bc755167713297c69f1db57a89a1ef4a0170ee269"}, - {file = "orjson-3.10.10-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8564f48f3620861f5ef1e080ce7cd122ee89d7d6dacf25fcae675ff63b4d6e05"}, - {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bf161a32b479034098c5b81f2608f09167ad2fa1c06abd4e527ea6bf4837a9"}, - {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b65c93617bcafa7f04b74ae8bc2cc214bd5cb45168a953256ff83015c6747d"}, - {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8e28406f97fc2ea0c6150f4c1b6e8261453318930b334abc419214c82314f85"}, - {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4d0d9fe174cc7a5bdce2e6c378bcdb4c49b2bf522a8f996aa586020e1b96cee"}, - {file = "orjson-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3be81c42f1242cbed03cbb3973501fcaa2675a0af638f8be494eaf37143d999"}, - {file = "orjson-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65f9886d3bae65be026219c0a5f32dbbe91a9e6272f56d092ab22561ad0ea33b"}, - {file = "orjson-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:730ed5350147db7beb23ddaf072f490329e90a1d059711d364b49fe352ec987b"}, - {file = "orjson-3.10.10-cp312-none-win32.whl", hash = "sha256:a8f4bf5f1c85bea2170800020d53a8877812892697f9c2de73d576c9307a8a5f"}, - {file = "orjson-3.10.10-cp312-none-win_amd64.whl", hash = "sha256:384cd13579a1b4cd689d218e329f459eb9ddc504fa48c5a83ef4889db7fd7a4f"}, - {file = "orjson-3.10.10-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44bffae68c291f94ff5a9b4149fe9d1bdd4cd0ff0fb575bcea8351d48db629a1"}, - {file = "orjson-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e27b4c6437315df3024f0835887127dac2a0a3ff643500ec27088d2588fa5ae1"}, - {file = "orjson-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca84df16d6b49325a4084fd8b2fe2229cb415e15c46c529f868c3387bb1339d"}, - {file = "orjson-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c14ce70e8f39bd71f9f80423801b5d10bf93d1dceffdecd04df0f64d2c69bc01"}, - {file = "orjson-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:24ac62336da9bda1bd93c0491eff0613003b48d3cb5d01470842e7b52a40d5b4"}, - {file = "orjson-3.10.10-cp313-none-win32.whl", hash = "sha256:eb0a42831372ec2b05acc9ee45af77bcaccbd91257345f93780a8e654efc75db"}, - {file = "orjson-3.10.10-cp313-none-win_amd64.whl", hash = "sha256:f0c4f37f8bf3f1075c6cc8dd8a9f843689a4b618628f8812d0a71e6968b95ffd"}, - {file = "orjson-3.10.10-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:829700cc18503efc0cf502d630f612884258020d98a317679cd2054af0259568"}, - {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0ceb5e0e8c4f010ac787d29ae6299846935044686509e2f0f06ed441c1ca949"}, - {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c25908eb86968613216f3db4d3003f1c45d78eb9046b71056ca327ff92bdbd4"}, - {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:218cb0bc03340144b6328a9ff78f0932e642199ac184dd74b01ad691f42f93ff"}, - {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2277ec2cea3775640dc81ab5195bb5b2ada2fe0ea6eee4677474edc75ea6785"}, - {file = "orjson-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:848ea3b55ab5ccc9d7bbd420d69432628b691fba3ca8ae3148c35156cbd282aa"}, - {file = "orjson-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e3e67b537ac0c835b25b5f7d40d83816abd2d3f4c0b0866ee981a045287a54f3"}, - {file = "orjson-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7948cfb909353fce2135dcdbe4521a5e7e1159484e0bb024c1722f272488f2b8"}, - {file = "orjson-3.10.10-cp38-none-win32.whl", hash = "sha256:78bee66a988f1a333dc0b6257503d63553b1957889c17b2c4ed72385cd1b96ae"}, - {file = "orjson-3.10.10-cp38-none-win_amd64.whl", hash = "sha256:f1d647ca8d62afeb774340a343c7fc023efacfd3a39f70c798991063f0c681dd"}, - {file = "orjson-3.10.10-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5a059afddbaa6dd733b5a2d76a90dbc8af790b993b1b5cb97a1176ca713b5df8"}, - {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f9b5c59f7e2a1a410f971c5ebc68f1995822837cd10905ee255f96074537ee6"}, - {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d5ef198bafdef4aa9d49a4165ba53ffdc0a9e1c7b6f76178572ab33118afea25"}, - {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf29ce0bb5d3320824ec3d1508652421000ba466abd63bdd52c64bcce9eb1fa"}, - {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dddd5516bcc93e723d029c1633ae79c4417477b4f57dad9bfeeb6bc0315e654a"}, - {file = "orjson-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12f2003695b10817f0fa8b8fca982ed7f5761dcb0d93cff4f2f9f6709903fd7"}, - {file = "orjson-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:672f9874a8a8fb9bb1b771331d31ba27f57702c8106cdbadad8bda5d10bc1019"}, - {file = "orjson-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dcbb0ca5fafb2b378b2c74419480ab2486326974826bbf6588f4dc62137570a"}, - {file = "orjson-3.10.10-cp39-none-win32.whl", hash = "sha256:d9bbd3a4b92256875cb058c3381b782649b9a3c68a4aa9a2fff020c2f9cfc1be"}, - {file = "orjson-3.10.10-cp39-none-win_amd64.whl", hash = "sha256:766f21487a53aee8524b97ca9582d5c6541b03ab6210fbaf10142ae2f3ced2aa"}, - {file = "orjson-3.10.10.tar.gz", hash = "sha256:37949383c4df7b4337ce82ee35b6d7471e55195efa7dcb45ab8226ceadb0fe3b"}, -] - -[[package]] -name = "packaging" -version = "24.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] - -[[package]] -name = "pydantic" -version = "2.9.2" -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"}, -] - -[package.dependencies] -annotated-types = ">=0.6.0" -pydantic-core = "2.23.4" -typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} - -[package.extras] -email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] - -[[package]] -name = "pydantic-core" -version = "2.23.4" -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"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pyjwt" -version = "2.9.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pytest" -version = "7.4.4" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.23.8" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, - {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, -] - -[package.dependencies] -pytest = ">=7.0.0,<9" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] - -[[package]] -name = "pytest-mock" -version = "3.14.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, - {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "pytest-socket" -version = "0.7.0" -description = "Pytest Plugin to disable socket calls during tests" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "pytest_socket-0.7.0-py3-none-any.whl", hash = "sha256:7e0f4642177d55d317bbd58fc68c6bd9048d6eadb2d46a89307fa9221336ce45"}, - {file = "pytest_socket-0.7.0.tar.gz", hash = "sha256:71ab048cbbcb085c15a4423b73b619a8b35d6a307f46f78ea46be51b1b7e11b3"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[[package]] -name = "python-dotenv" -version = "1.0.1" -description = "Read key-value pairs from a .env file and set them as environment variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -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.1.15" -description = "An extremely fast Python linter and code formatter, written in Rust." -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "tenacity" -version = "9.0.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, - {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - -[[package]] -name = "tomli" -version = "2.0.2" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, -] - -[[package]] -name = "types-requests" -version = "2.32.0.20241016" -description = "Typing stubs for requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, - {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, -] - -[package.dependencies] -urllib3 = ">=2" - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "urllib3" -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.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9.0,<3.13" -content-hash = "c85860d3c2b38a4aeb9f1fe93aa25ee61d9a7cb7e5cda8006004d3f27ce8bdb5" diff --git a/libs/partners/box/pyproject.toml b/libs/partners/box/pyproject.toml deleted file mode 100644 index 8f454f4ee01..00000000000 --- a/libs/partners/box/pyproject.toml +++ /dev/null @@ -1,84 +0,0 @@ -[build-system] -requires = [ "poetry-core>=1.0.0",] -build-backend = "poetry.core.masonry.api" - -[tool.poetry] -name = "langchain-box" -version = "0.2.3" -description = "An integration package connecting Box and LangChain" -authors = [] -readme = "README.md" -repository = "https://github.com/langchain-ai/langchain" -license = "MIT" - -[tool.mypy] -disallow_untyped_defs = "True" - -[tool.poetry.urls] -"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/box" -"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-box%3D%3D0%22&expanded=true" - -[tool.poetry.dependencies] -python = ">=3.9.0,<3.13" -langchain-core = "^0.3.15" -pydantic = "^2" - -[tool.ruff.lint] -select = [ "E", "F", "I", "T201",] - -[tool.coverage.run] -omit = [ "tests/*",] - -[tool.pytest.ini_options] -markers = [ "compile: mark placeholder test used to compile integration tests without running them",] -asyncio_mode = "auto" - -[tool.poetry.dependencies.box-sdk-gen] -extras = [ "jwt",] -version = "^1.5.0" - -[tool.poetry.group.test] -optional = true - -[tool.poetry.group.codespell] -optional = true - -[tool.poetry.group.test_integration] -optional = true - -[tool.poetry.group.lint] -optional = true - -[tool.poetry.group.dev] -optional = true - -[tool.poetry.group.test.dependencies] -pytest = "^7.4.3" -pytest_mock = "^3.14.0" -pytest-asyncio = "^0.23.2" -pytest-socket = "^0.7.0" - -[tool.poetry.group.codespell.dependencies] -codespell = "^2.2.6" - -[tool.poetry.group.test_integration.dependencies] -python-dotenv = "^1.0.1" - -[tool.poetry.group.lint.dependencies] -ruff = "^0.1.8" - -[tool.poetry.group.typing.dependencies] -mypy = "^1.7.1" -types-requests = "^2.32.0.20240712" - -[tool.poetry.group.test.dependencies.langchain-core] -path = "../../core" -develop = true - -[tool.poetry.group.dev.dependencies.langchain-core] -path = "../../core" -develop = true - -[tool.poetry.group.typing.dependencies.langchain-core] -path = "../../core" -develop = true diff --git a/libs/partners/box/scripts/check_imports.py b/libs/partners/box/scripts/check_imports.py deleted file mode 100644 index 365f5fa118d..00000000000 --- a/libs/partners/box/scripts/check_imports.py +++ /dev/null @@ -1,17 +0,0 @@ -import sys -import traceback -from importlib.machinery import SourceFileLoader - -if __name__ == "__main__": - files = sys.argv[1:] - has_failure = False - for file in files: - try: - SourceFileLoader("x", file).load_module() - except Exception: - has_faillure = True - print(file) # noqa: T201 - traceback.print_exc() - print() # noqa: T201 - - sys.exit(1 if has_failure else 0) diff --git a/libs/partners/box/scripts/lint_imports.sh b/libs/partners/box/scripts/lint_imports.sh deleted file mode 100755 index 19ccec1480c..00000000000 --- a/libs/partners/box/scripts/lint_imports.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -set -eu - -# Initialize a variable to keep track of errors -errors=0 - -# make sure not importing from langchain, langchain_experimental, or langchain_community -git --no-pager grep '^from langchain\.' . && errors=$((errors+1)) -git --no-pager grep '^from langchain_experimental\.' . && errors=$((errors+1)) -git --no-pager grep '^from langchain_community\.' . && errors=$((errors+1)) - -# Decide on an exit status based on the errors -if [ "$errors" -gt 0 ]; then - exit 1 -else - exit 0 -fi diff --git a/libs/partners/box/tests/__init__.py b/libs/partners/box/tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/integration_tests/__init__.py b/libs/partners/box/tests/integration_tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/integration_tests/document_loaders/__init__.py b/libs/partners/box/tests/integration_tests/document_loaders/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/integration_tests/document_loaders/test_box_file_loader.py b/libs/partners/box/tests/integration_tests/document_loaders/test_box_file_loader.py deleted file mode 100644 index 4adbe775740..00000000000 --- a/libs/partners/box/tests/integration_tests/document_loaders/test_box_file_loader.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -TODO: build live integration tests -""" diff --git a/libs/partners/box/tests/integration_tests/retrievers/__init__.py b/libs/partners/box/tests/integration_tests/retrievers/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/integration_tests/retrievers/test_box_retriever.py b/libs/partners/box/tests/integration_tests/retrievers/test_box_retriever.py deleted file mode 100644 index 4adbe775740..00000000000 --- a/libs/partners/box/tests/integration_tests/retrievers/test_box_retriever.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -TODO: build live integration tests -""" diff --git a/libs/partners/box/tests/integration_tests/test_compile.py b/libs/partners/box/tests/integration_tests/test_compile.py deleted file mode 100644 index 5196f4c0f8c..00000000000 --- a/libs/partners/box/tests/integration_tests/test_compile.py +++ /dev/null @@ -1,7 +0,0 @@ -import pytest # type: ignore[import-not-found] - - -@pytest.mark.compile -def test_placeholder() -> None: - """Used for compiling integration tests without running any real tests.""" - pass diff --git a/libs/partners/box/tests/integration_tests/utilities/__init__.py b/libs/partners/box/tests/integration_tests/utilities/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/integration_tests/utilities/test_box_util.py b/libs/partners/box/tests/integration_tests/utilities/test_box_util.py deleted file mode 100644 index 4adbe775740..00000000000 --- a/libs/partners/box/tests/integration_tests/utilities/test_box_util.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -TODO: build live integration tests -""" diff --git a/libs/partners/box/tests/unit_tests/__init__.py b/libs/partners/box/tests/unit_tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/unit_tests/document_loaders/__init__.py b/libs/partners/box/tests/unit_tests/document_loaders/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/unit_tests/document_loaders/test_box_loader.py b/libs/partners/box/tests/unit_tests/document_loaders/test_box_loader.py deleted file mode 100644 index 101913bcea0..00000000000 --- a/libs/partners/box/tests/unit_tests/document_loaders/test_box_loader.py +++ /dev/null @@ -1,99 +0,0 @@ -import pytest -from langchain_core.documents import Document -from pytest_mock import MockerFixture - -from langchain_box.document_loaders import BoxLoader -from langchain_box.utilities import BoxAuth, BoxAuthType - - -# Test auth types -def test_direct_token_initialization() -> None: - loader = BoxLoader( # type: ignore[call-arg] - box_developer_token="box_developer_token", - box_file_ids=["box_file_ids"], - ) - - assert loader.box_developer_token == "box_developer_token" - assert loader.box_file_ids == ["box_file_ids"] - - -def test_failed_direct_token_initialization() -> None: - with pytest.raises(ValueError): - loader = BoxLoader(box_file_ids=["box_file_ids"]) # type: ignore[call-arg] # noqa: F841 - - -def test_auth_initialization() -> None: - auth = BoxAuth( - auth_type=BoxAuthType.TOKEN, box_developer_token="box_developer_token" - ) - - loader = BoxLoader( # type: ignore[call-arg] - box_auth=auth, - box_file_ids=["box_file_ids"], - ) - - assert loader.box_file_ids == ["box_file_ids"] - - -# test loaders -def test_failed_file_initialization() -> None: - with pytest.raises(ValueError): - loader = BoxLoader(box_developer_token="box_developer_token") # type: ignore[call-arg] # noqa: F841 - - -def test_folder_initialization() -> None: - loader = BoxLoader( # type: ignore[call-arg] - box_developer_token="box_developer_token", - box_folder_id="box_folder_id", - ) - - assert loader.box_developer_token == "box_developer_token" - assert loader.box_folder_id == "box_folder_id" - - -def test_failed_initialization_files_and_folders() -> None: - with pytest.raises(ValueError): - loader = BoxLoader( # type: ignore[call-arg] # noqa: F841 - box_developer_token="box_developer_token", - box_folder_id="box_folder_id", - box_file_ids=["box_file_ids"], - ) - - -# test Document retrieval -def test_file_load(mocker: MockerFixture) -> None: - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.get_document_by_file_id", - return_value=[], - ) - - loader = BoxLoader( # type: ignore[call-arg] - box_developer_token="box_developer_token", - box_file_ids=["box_file_ids"], - ) - - documents = loader.load() - assert documents - - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.get_document_by_file_id", - return_value=( - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ), - ) - - loader = BoxLoader( # type: ignore[call-arg] - box_developer_token="box_developer_token", - box_file_ids=["box_file_ids"], - ) - - documents = loader.load() - assert documents == [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] diff --git a/libs/partners/box/tests/unit_tests/retrievers/__init__.py b/libs/partners/box/tests/unit_tests/retrievers/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 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 deleted file mode 100644 index 054f7ed205c..00000000000 --- a/libs/partners/box/tests/unit_tests/retrievers/test_box_retriever.py +++ /dev/null @@ -1,203 +0,0 @@ -import pytest -from langchain_core.documents import Document -from pytest_mock import MockerFixture - -from langchain_box.retrievers import BoxRetriever -from langchain_box.utilities import ( - BoxAuth, - BoxAuthType, - BoxSearchOptions, - DocumentFiles, - SearchTypeFilter, -) - - -# Test auth types -def test_direct_token_initialization() -> None: - retriever = BoxRetriever( # type: ignore[call-arg] - box_developer_token="box_developer_token", - box_file_ids=["box_file_ids"], - ) - - assert retriever.box_developer_token == "box_developer_token" - assert retriever.box_file_ids == ["box_file_ids"] - - -def test_failed_direct_token_initialization() -> None: - with pytest.raises(ValueError): - retriever = BoxRetriever(box_file_ids=["box_file_ids"]) # type: ignore[call-arg] # noqa: F841 - - -def test_auth_initialization() -> None: - auth = BoxAuth( - auth_type=BoxAuthType.TOKEN, box_developer_token="box_developer_token" - ) - - retriever = BoxRetriever( # type: ignore[call-arg] - box_auth=auth, - box_file_ids=["box_file_ids"], - ) - - assert retriever.box_file_ids == ["box_file_ids"] - - -# test search retrieval -def test_search(mocker: MockerFixture) -> None: - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.search_box", - return_value=( - [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - ), - ) - - retriever = BoxRetriever( # type: ignore[call-arg] - box_developer_token="box_developer_token" - ) - - documents = retriever.invoke("query") - assert documents == [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - - -# test search options -def test_search_options(mocker: MockerFixture) -> None: - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.search_box", - return_value=( - [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - ), - ) - - box_search_options = BoxSearchOptions( - ancestor_folder_ids=["box_folder_id"], - search_type_filter=[SearchTypeFilter.FILE_CONTENT], - created_date_range=["2023-01-01T00:00:00-07:00", "2024-08-01T00:00:00-07:00,"], - file_extensions=[DocumentFiles.DOCX, DocumentFiles.PDF], - k=200, - size_range=[1, 1000000], - updated_date_range=None, - ) - - retriever = BoxRetriever( # type: ignore[call-arg] - box_developer_token="box_developer_token", box_search_options=box_search_options - ) - - documents = retriever.invoke("query") - - assert documents == [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - - -# test ai retrieval -def test_ai(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"}, - ) - ] - ), - ) - - retriever = BoxRetriever( # type: ignore[call-arg] - box_developer_token="box_developer_token", box_file_ids=["box_file_ids"] - ) - - documents = retriever.invoke("query") - assert documents == [ - Document( - page_content="Test file mode\ndocument contents", - 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"}), - ] diff --git a/libs/partners/box/tests/unit_tests/test_imports.py b/libs/partners/box/tests/unit_tests/test_imports.py deleted file mode 100644 index 38aacf7210f..00000000000 --- a/libs/partners/box/tests/unit_tests/test_imports.py +++ /dev/null @@ -1,17 +0,0 @@ -from langchain_box import __all__ - -EXPECTED_ALL = [ - "BoxLoader", - "BoxRetriever", - "BoxAuth", - "BoxAuthType", - "BoxSearchOptions", - "DocumentFiles", - "SearchTypeFilter", - "_BoxAPIWrapper", - "__version__", -] - - -def test_all_imports() -> None: - assert sorted(EXPECTED_ALL) == sorted(__all__) diff --git a/libs/partners/box/tests/unit_tests/utilities/__init__.py b/libs/partners/box/tests/unit_tests/utilities/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/partners/box/tests/unit_tests/utilities/test_box_util.py b/libs/partners/box/tests/unit_tests/utilities/test_box_util.py deleted file mode 100644 index 6f6ef907f9a..00000000000 --- a/libs/partners/box/tests/unit_tests/utilities/test_box_util.py +++ /dev/null @@ -1,230 +0,0 @@ -from unittest.mock import Mock - -import pytest -from langchain_core.documents import Document -from pydantic.error_wrappers import ValidationError -from pytest_mock import MockerFixture - -from langchain_box.utilities import BoxAuth, BoxAuthType, _BoxAPIWrapper - - -@pytest.fixture() -def mock_worker(mocker: MockerFixture) -> None: - mocker.patch("langchain_box.utilities.BoxAuth._authorize", return_value=Mock()) - mocker.patch("langchain_box.utilities.BoxAuth.get_client", return_value=Mock()) - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper._get_text_representation", - return_value=("filename", "content", "url"), - ) - - -# Test auth types -def test_token_initialization() -> None: - auth = BoxAuth( - auth_type=BoxAuthType.TOKEN, box_developer_token="box_developer_token" - ) - - assert auth.auth_type == "token" - assert auth.box_developer_token == "box_developer_token" - - -def test_failed_token_initialization() -> None: - with pytest.raises(ValidationError): - auth = BoxAuth(auth_type=BoxAuthType.TOKEN) # noqa: F841 - - -def test_jwt_eid_initialization() -> None: - auth = BoxAuth(auth_type=BoxAuthType.JWT, box_jwt_path="box_jwt_path") - - assert auth.auth_type == "jwt" - assert auth.box_jwt_path == "box_jwt_path" - - -def test_jwt_user_initialization() -> None: - auth = BoxAuth( - auth_type=BoxAuthType.JWT, - box_jwt_path="box_jwt_path", - box_user_id="box_user_id", - ) - - assert auth.auth_type == "jwt" - assert auth.box_jwt_path == "box_jwt_path" - assert auth.box_user_id == "box_user_id" - - -def test_failed_jwt_initialization() -> None: - with pytest.raises(ValidationError): - auth = BoxAuth(auth_type=BoxAuthType.JWT, box_user_id="box_user_id") # noqa: F841 - - -def test_ccg_eid_initialization() -> None: - auth = BoxAuth( - auth_type=BoxAuthType.CCG, - box_client_id="box_client_id", - box_client_secret="box_client_secret", - box_enterprise_id="box_enterprise_id", - ) - - assert auth.auth_type == "ccg" - assert auth.box_client_id == "box_client_id" - assert auth.box_client_secret == "box_client_secret" - assert auth.box_enterprise_id == "box_enterprise_id" - - -def test_ccg_user_initialization() -> None: - auth = BoxAuth( - auth_type=BoxAuthType.CCG, - box_client_id="box_client_id", - box_client_secret="box_client_secret", - box_enterprise_id="box_enterprise_id", - box_user_id="box_user_id", - ) - - assert auth.auth_type == "ccg" - assert auth.box_client_id == "box_client_id" - assert auth.box_client_secret == "box_client_secret" - assert auth.box_enterprise_id == "box_enterprise_id" - assert auth.box_user_id == "box_user_id" - - -def test_failed_ccg_initialization() -> None: - with pytest.raises(ValidationError): - auth = BoxAuth(auth_type=BoxAuthType.CCG) # noqa: F841 - - -def test_direct_token_initialization() -> None: - box = _BoxAPIWrapper( # type: ignore[call-arg] - box_developer_token="box_developer_token" - ) - - assert box.box_developer_token == "box_developer_token" - - -def test_auth_initialization() -> None: - auth = BoxAuth( - auth_type=BoxAuthType.TOKEN, box_developer_token="box_developer_token" - ) - - box = _BoxAPIWrapper(box_auth=auth) # type: ignore[call-arg] # noqa: F841 - - assert auth.box_developer_token == "box_developer_token" - - -def test_failed_initialization_no_auth() -> None: - with pytest.raises(ValidationError): - box = _BoxAPIWrapper() # type: ignore[call-arg] # noqa: F841 - - -def test_get_documents_by_file_ids(mock_worker, mocker: MockerFixture) -> None: # type: ignore[no-untyped-def] - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.get_document_by_file_id", - return_value=( - Document( - page_content="content", metadata={"source": "url", "title": "filename"} - ) - ), - ) - - box = _BoxAPIWrapper(box_developer_token="box_developer_token") # type: ignore[call-arg] - - documents = box.get_document_by_file_id("box_file_id") - assert documents == Document( - page_content="content", metadata={"source": "url", "title": "filename"} - ) - - -def test_get_documents_by_folder_id(mock_worker, mocker: MockerFixture) -> None: # type: ignore[no-untyped-def] - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.get_folder_items", - return_value=([{"id": "file_id", "type": "file"}]), - ) - - box = _BoxAPIWrapper(box_developer_token="box_developer_token") # type: ignore[call-arg] - - folder_contents = box.get_folder_items("box_folder_id") - assert folder_contents == [{"id": "file_id", "type": "file"}] - - -def test_box_search(mock_worker, mocker: MockerFixture) -> None: # type: ignore[no-untyped-def] - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.search_box", - return_value=( - [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - ), - ) - - box = _BoxAPIWrapper(box_developer_token="box_developer_token") # type: ignore[call-arg] - - documents = box.search_box("query") - assert documents == [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - - -def test_ask_box_ai_single_file(mock_worker, mocker: MockerFixture) -> None: # type: ignore[no-untyped-def] - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.ask_box_ai", - return_value=( - [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - ), - ) - - box = _BoxAPIWrapper( # type: ignore[call-arg] - box_developer_token="box_developer_token", box_file_ids=["box_file_ids"] - ) - - documents = box.ask_box_ai("query") # type: ignore[call-arg] - assert documents == [ - Document( - page_content="Test file mode\ndocument contents", - metadata={"title": "Testing Files"}, - ) - ] - - -def test_ask_box_ai_multiple_files(mock_worker, mocker: MockerFixture) -> None: # type: ignore[no-untyped-def] - mocker.patch( - "langchain_box.utilities._BoxAPIWrapper.ask_box_ai", - return_value=( - [ - Document( - page_content="Test file 1 mode\ndocument contents", - metadata={"title": "Test File 1"}, - ), - Document( - page_content="Test file 2 mode\ndocument contents", - metadata={"title": "Test File 2"}, - ), - ] - ), - ) - - box = _BoxAPIWrapper( # type: ignore[call-arg] - box_developer_token="box_developer_token", - box_file_ids=["box_file_id 1", "box_file_id 2"], - ) - - documents = box.ask_box_ai("query") # type: ignore[call-arg] - assert documents == [ - Document( - page_content="Test file 1 mode\ndocument contents", - metadata={"title": "Test File 1"}, - ), - Document( - page_content="Test file 2 mode\ndocument contents", - metadata={"title": "Test File 2"}, - ), - ]