diff --git a/Makefile b/Makefile index 11de700f0..ddc5ee54c 100644 --- a/Makefile +++ b/Makefile @@ -34,22 +34,18 @@ rebuild: stop prune ## Rebuild all images .PHONY: test-core-api test-core-api: ## Test core-api - cp .env.test core-api/.env - cd core-api && poetry install --with dev && poetry run python -m pytest -m "not ai" --cov=core_api -v --cov-report=term-missing --cov-fail-under=75 + cd core-api && poetry install --with dev && poetry run python -m pytest --cov=core_api -v --cov-report=term-missing --cov-fail-under=75 .PHONY: test-ai test-ai: ## Test code with live LLM - cp .env.test core-api/.env - cd core-api && poetry install --with dev && poetry run python -m pytest -m "ai" --cov=core_api -v --cov-report=term-missing --cov-fail-under=80 + cd redbox-core && poetry install --with dev && poetry run python -m pytest -m "ai" --cov=redbox -v --cov-report=term-missing --cov-fail-under=80 .PHONY: test-redbox test-redbox: ## Test redbox - cp .env.test redbox-core/.env - cd redbox-core && poetry install && poetry run pytest --cov=redbox -v --cov-report=term-missing --cov-fail-under=60 + cd redbox-core && poetry install && poetry run pytest -m "not ai" --cov=redbox -v --cov-report=term-missing --cov-fail-under=60 .PHONY: test-worker test-worker: ## Test worker - cp .env.test worker/.env cd worker && poetry install && poetry run pytest --cov=worker -v --cov-report=term-missing --cov-fail-under=80 .PHONY: test-django diff --git a/core-api/core_api/build_chains.py b/core-api/core_api/build_chains.py deleted file mode 100644 index f12b19af3..000000000 --- a/core-api/core_api/build_chains.py +++ /dev/null @@ -1,281 +0,0 @@ -import logging -import sys -from operator import itemgetter -from typing import Annotated - -from core_api import dependencies -from fastapi import Depends -from langchain.prompts import PromptTemplate -from langchain.schema import StrOutputParser -from langchain_community.chat_models import ChatLiteLLM -from langchain_core.prompts import ChatPromptTemplate -from langchain_core.retrievers import BaseRetriever -from langchain_core.runnables import Runnable, RunnableLambda, RunnablePassthrough, chain -from langchain_core.runnables.config import RunnableConfig -from langchain_core.vectorstores import VectorStoreRetriever -from tiktoken import Encoding - -from redbox.api.format import format_documents -from redbox.api.runnables import filter_by_elbow, make_chat_prompt_from_messages_runnable, resize_documents -from redbox.models import ChatRoute, Settings -from redbox.models.errors import NoDocumentSelected - -# === Logging === - -logging.basicConfig(stream=sys.stdout, level=logging.INFO) -log = logging.getLogger() - - -def build_chat_chain( - llm: Annotated[ChatLiteLLM, Depends(dependencies.get_llm)], - tokeniser: Annotated[Encoding, Depends(dependencies.get_tokeniser)], - env: Annotated[Settings, Depends(dependencies.get_env)], -) -> Runnable: - return ( - make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.chat_system_prompt, - question_prompt=env.ai.chat_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | { - "response": StrOutputParser(), - "route_name": RunnableLambda(lambda _: ChatRoute.chat.value), - } - ) - - -def build_chat_with_docs_chain( - llm: Annotated[ChatLiteLLM, Depends(dependencies.get_llm)], - all_chunks_retriever: Annotated[BaseRetriever, Depends(dependencies.get_all_chunks_retriever)], - tokeniser: Annotated[Encoding, Depends(dependencies.get_tokeniser)], - env: Annotated[Settings, Depends(dependencies.get_env)], -) -> Runnable: - def make_document_context(): - return all_chunks_retriever | resize_documents(env.ai.stuff_chunk_max_tokens) - - @chain - def map_operation(input_dict): - system_map_prompt = env.ai.map_system_prompt - prompt_template = PromptTemplate.from_template(env.ai.map_question_prompt) - - formatted_map_question_prompt = prompt_template.format(question=input_dict["question"]) - - map_prompt = ChatPromptTemplate.from_messages( - [ - ("system", system_map_prompt), - ("human", formatted_map_question_prompt + env.ai.map_document_prompt), - ] - ) - - documents = input_dict["documents"] - - map_summaries = (map_prompt | llm | StrOutputParser()).batch( - documents, - config=RunnableConfig(max_concurrency=env.ai.map_max_concurrency), - ) - - summaries = " ; ".join(map_summaries) - input_dict["summaries"] = summaries - return input_dict - - @chain - def chat_with_docs_route(input_dict: dict): - log.info("Length documents: %s", len(input_dict["documents"])) - if len(input_dict["documents"]) == 1: - return RunnablePassthrough.assign( - formatted_documents=(RunnablePassthrough() | itemgetter("documents") | format_documents) - ) | { - "response": make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.chat_with_docs_system_prompt, - question_prompt=env.ai.chat_with_docs_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | StrOutputParser(), - "route_name": RunnableLambda(lambda _: ChatRoute.chat_with_docs.value), - } - - elif len(input_dict["documents"]) > 1: - return ( - map_operation - | RunnablePassthrough.assign( - formatted_documents=(RunnablePassthrough() | itemgetter("documents") | format_documents) - ) - | { - "response": make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.chat_with_docs_reduce_system_prompt, - question_prompt=env.ai.chat_with_docs_reduce_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | StrOutputParser(), - "route_name": RunnableLambda(lambda _: ChatRoute.chat_with_docs.value), - } - ) - - else: - raise NoDocumentSelected - - return RunnablePassthrough.assign(documents=make_document_context()) | chat_with_docs_route - - -def build_retrieval_chain( - llm: Annotated[ChatLiteLLM, Depends(dependencies.get_llm)], - retriever: Annotated[VectorStoreRetriever, Depends(dependencies.get_parameterised_retriever)], - tokeniser: Annotated[Encoding, Depends(dependencies.get_tokeniser)], - env: Annotated[Settings, Depends(dependencies.get_env)], -) -> Runnable: - return ( - RunnablePassthrough.assign(documents=retriever) - | RunnablePassthrough.assign( - formatted_documents=(RunnablePassthrough() | itemgetter("documents") | format_documents) - ) - | { - "response": make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.retrieval_system_prompt, - question_prompt=env.ai.retrieval_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | StrOutputParser(), - "source_documents": itemgetter("documents"), - "route_name": RunnableLambda(lambda _: ChatRoute.search.value), - } - ) - - -def build_condense_retrieval_chain( - llm: Annotated[ChatLiteLLM, Depends(dependencies.get_llm)], - retriever: Annotated[VectorStoreRetriever, Depends(dependencies.get_parameterised_retriever)], - tokeniser: Annotated[Encoding, Depends(dependencies.get_tokeniser)], - env: Annotated[Settings, Depends(dependencies.get_env)], -) -> Runnable: - def route(input_dict: dict): - if len(input_dict["chat_history"]) > 0: - return RunnablePassthrough.assign( - question=make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.condense_system_prompt, - question_prompt=env.ai.condense_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | StrOutputParser() - ) - else: - return RunnablePassthrough() - - return ( - RunnableLambda(route) - | RunnablePassthrough.assign(documents=retriever | filter_by_elbow(enabled=env.ai.elbow_filter_enabled)) - | RunnablePassthrough.assign( - formatted_documents=(RunnablePassthrough() | itemgetter("documents") | format_documents) - ) - | { - "response": make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.retrieval_system_prompt, - question_prompt=env.ai.retrieval_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | StrOutputParser(), - "source_documents": itemgetter("documents"), - "route_name": RunnableLambda(lambda _: ChatRoute.search.value), - } - ) - - -def build_summary_chain( - llm: Annotated[ChatLiteLLM, Depends(dependencies.get_llm)], - all_chunks_retriever: Annotated[BaseRetriever, Depends(dependencies.get_all_chunks_retriever)], - tokeniser: Annotated[Encoding, Depends(dependencies.get_tokeniser)], - env: Annotated[Settings, Depends(dependencies.get_env)], -) -> Runnable: - def make_document_context(): - return ( - all_chunks_retriever - | resize_documents(env.ai.stuff_chunk_max_tokens) - | RunnableLambda(lambda docs: [d.page_content for d in docs]) - ) - - # Stuff chain now missing the RunnabeLambda to format the chunks - stuff_chain = ( - make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.summarisation_system_prompt, - question_prompt=env.ai.summarisation_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | { - "response": StrOutputParser(), - "route_name": RunnableLambda(lambda _: ChatRoute.summarise.value), - } - ) - - @chain - def map_operation(input_dict): - system_map_prompt = env.ai.map_system_prompt - prompt_template = PromptTemplate.from_template(env.ai.map_question_prompt) - - formatted_map_question_prompt = prompt_template.format(question=input_dict["question"]) - - map_prompt = ChatPromptTemplate.from_messages( - [ - ("system", system_map_prompt), - ("human", formatted_map_question_prompt + env.ai.map_document_prompt), - ] - ) - - documents = input_dict["documents"] - - map_summaries = (map_prompt | llm | StrOutputParser()).batch( - documents, - config=RunnableConfig(max_concurrency=env.ai.map_max_concurrency), - ) - - summaries = " ; ".join(map_summaries) - input_dict["summaries"] = summaries - return input_dict - - map_reduce_chain = ( - map_operation - | make_chat_prompt_from_messages_runnable( - system_prompt=env.ai.reduce_system_prompt, - question_prompt=env.ai.reduce_question_prompt, - input_token_budget=env.ai.context_window_size - env.llm_max_tokens, - tokeniser=tokeniser, - ) - | llm - | { - "response": StrOutputParser(), - "route_name": RunnableLambda(lambda _: ChatRoute.map_reduce_summarise.value), - } - ) - - @chain - def summarisation_route(input_dict): - if len(input_dict["documents"]) == 1: - return stuff_chain - - elif len(input_dict["documents"]) > 1: - return map_reduce_chain - - else: - raise NoDocumentSelected - - return RunnablePassthrough.assign(documents=make_document_context()) | summarisation_route - - -def build_static_response_chain(prompt_template, route_name) -> Runnable: - return RunnablePassthrough.assign( - response=(ChatPromptTemplate.from_template(prompt_template) | RunnableLambda(lambda p: p.messages[0].content)), - source_documents=RunnableLambda(lambda _: []), - route_name=RunnableLambda(lambda _: route_name.value), - ) diff --git a/core-api/core_api/dependencies.py b/core-api/core_api/dependencies.py index cebbb05cc..745c355e9 100644 --- a/core-api/core_api/dependencies.py +++ b/core-api/core_api/dependencies.py @@ -3,6 +3,7 @@ from functools import lru_cache from typing import Annotated +from redbox import Redbox import tiktoken from fastapi import Depends from langchain_community.chat_models import ChatLiteLLM @@ -24,14 +25,12 @@ def get_env() -> Settings: return Settings() -@lru_cache(1) def get_embedding_model(env: Annotated[Settings, Depends(get_env)]) -> Embeddings: return get_embeddings(env) -@lru_cache(1) def get_parameterised_retriever( - env: Annotated[Settings, Depends(get_env)], + env: Annotated[Settings, Depends(get_env)], embeddings: Annotated[Embeddings, Depends(get_embedding_model)] ) -> BaseRetriever: """Creates an Elasticsearch retriever runnable. @@ -50,7 +49,7 @@ def get_parameterised_retriever( es_client=env.elasticsearch_client(), index_name=f"{env.elastic_root_index}-chunk", params=default_params, - embedding_model=get_embedding_model(env), + embedding_model=embeddings, embedding_field_name=env.embedding_document_field_name, ).configurable_fields( params=ConfigurableField( @@ -109,3 +108,13 @@ def get_llm(env: Annotated[Settings, Depends(get_env)]) -> ChatLiteLLM: @lru_cache(1) def get_tokeniser() -> tiktoken.Encoding: return tiktoken.get_encoding("cl100k_base") + + +def get_redbox( + llm: Annotated[ChatLiteLLM, Depends(get_llm)], + all_chunks_retriever: Annotated[AllElasticsearchRetriever, Depends(get_all_chunks_retriever)], + parameterised_retriever: Annotated[ParameterisedElasticsearchRetriever, Depends(get_parameterised_retriever)], + tokeniser: Annotated[tiktoken.Encoding, Depends(get_tokeniser)], + env: Annotated[Settings, Depends(get_env)], +) -> Redbox: + return Redbox(llm, all_chunks_retriever, parameterised_retriever, tokeniser, env) diff --git a/core-api/core_api/routes/chat.py b/core-api/core_api/routes/chat.py index 426c9c7d2..42e8b67c1 100644 --- a/core-api/core_api/routes/chat.py +++ b/core-api/core_api/routes/chat.py @@ -1,29 +1,27 @@ import logging -import re from typing import Annotated from uuid import UUID +from redbox import Redbox + from core_api.auth import get_user_uuid, get_ws_user_uuid -from core_api.semantic_routes import get_routable_chains from fastapi import Depends, FastAPI, WebSocket from fastapi.encoders import jsonable_encoder -from langchain_core.runnables import Runnable -from langchain_core.tools import Tool from openai import APIError +from langchain_core.documents import Document -from redbox.api.runnables import map_to_chat_response -from redbox.models.chain import ChainInput, ChainChatMessage -from redbox.models.chat import ChatRequest, ChatResponse, SourceDocument, ClientResponse, ErrorDetail -from redbox.models.errors import NoDocumentSelected, QuestionLengthError +from redbox.models.chain import ChainInput, ChainChatMessage, ChainState +from redbox.models.chat import ChatRequest, ChatResponse, ClientResponse, ErrorDetail from redbox.transform import map_document_to_source_document +from core_api.dependencies import get_redbox +from core_api.runnables import map_to_chat_response + # === Logging === logging.basicConfig(level=logging.INFO) log = logging.getLogger() -re_keyword_pattern = re.compile(r"@(\w+)") - chat_app = FastAPI( title="Core Chat API", @@ -39,62 +37,38 @@ ) -async def route_chat( - chat_request: ChatRequest, user_uuid: UUID, routable_chains: dict[str, Tool] -) -> tuple[Runnable, ChainInput]: - question = chat_request.message_history[-1].text - - selected_chain = None - - def select_chat_chain(chat_request: ChatRequest, routable_chains: dict[str, Runnable]) -> Runnable: - if chat_request.selected_files: - return routable_chains.get("chat/documents") - else: - return routable_chains.get("chat") - - # Match keyword - route_match = re_keyword_pattern.search(question) - route_name = route_match.group()[1:] if route_match else None - selected_chain, description = routable_chains.get(route_name, select_chat_chain(chat_request, routable_chains)) - - params = ChainInput( - question=chat_request.message_history[-1].text, - file_uuids=[str(f.uuid) for f in chat_request.selected_files], - user_uuid=str(user_uuid), - chat_history=[ - ChainChatMessage(role=message.role, text=message.text) for message in chat_request.message_history[:-1] - ], - ) - - log.info("Routed to %s", route_name) - log.info("Selected files: %s", chat_request.selected_files) - - return selected_chain, params - - @chat_app.post("/rag", tags=["chat"]) async def rag_chat( chat_request: ChatRequest, user_uuid: Annotated[UUID, Depends(get_user_uuid)], - routable_chains: Annotated[dict[str, Tool], Depends(get_routable_chains)], + redbox: Annotated[Redbox, Depends(get_redbox)], ) -> ChatResponse: """REST endpoint. Get a LLM response to a question history and file.""" - selected_chain, params = await route_chat(chat_request, user_uuid, routable_chains) - return (selected_chain | map_to_chat_response).invoke(params.dict()) + state = ChainState( + query=ChainInput( + question=chat_request.message_history[-1].text, + file_uuids=[f.uuid for f in chat_request.selected_files], + user_uuid=user_uuid, + chat_history=[ + ChainChatMessage(role=message.role, text=message.text) for message in chat_request.message_history[:-1] + ], + ), + ) + return await (redbox.graph | map_to_chat_response).ainvoke(state) @chat_app.get("/tools", tags=["chat"]) async def available_tools( - routable_chains: Annotated[dict[str, tuple[Runnable, str]], Depends(get_routable_chains)], + redbox: Annotated[Redbox, Depends(get_redbox)], ): """REST endpoint. Get a mapping of all tools available via chat.""" - return [{"name": name, "description": tool[1]} for (name, tool) in routable_chains.items()] + return [{"name": name, "description": description} for name, description in redbox.get_available_keywords().items()] @chat_app.websocket("/rag") async def rag_chat_streamed( websocket: WebSocket, - routable_chains: Annotated[dict[str, Tool], Depends(get_routable_chains)], + redbox: Annotated[Redbox, Depends(get_redbox)], ): """Websocket. Get a LLM response to a question history and file.""" await websocket.accept() @@ -104,34 +78,35 @@ async def rag_chat_streamed( request = await websocket.receive_text() chat_request = ChatRequest.model_validate_json(request) - selected_chain, params = await route_chat(chat_request, user_uuid, routable_chains) + state = ChainState( + query=ChainInput( + question=chat_request.message_history[-1].text, + file_uuids=[f.uuid for f in chat_request.selected_files], + user_uuid=user_uuid, + chat_history=[ + ChainChatMessage(role=message.role, text=message.text) for message in chat_request.message_history[:-1] + ], + ), + ) - try: - async for event in selected_chain.astream(params.dict()): - response: str = event.get("response", "") - source_documents: list[SourceDocument] = [ - map_document_to_source_document(doc) for doc in event.get("source_documents", []) - ] - route_name: str = event.get("route_name", "") - if response: - await send_to_client(ClientResponse(resource_type="text", data=response), websocket) - if source_documents: - await send_to_client(ClientResponse(resource_type="documents", data=source_documents), websocket) - if route_name: - await send_to_client(ClientResponse(resource_type="route_name", data=route_name), websocket) - except NoDocumentSelected as e: - log.info("No documents have been selected to summarise", exc_info=e) + async def on_llm_response(tokens: str): + await send_to_client(ClientResponse(resource_type="text", data=tokens), websocket) + + async def on_route_choice(route_name: str): + await send_to_client(ClientResponse(resource_type="route_name", data=route_name), websocket) + + async def on_documents_available(docs: list[Document]): await send_to_client( - ClientResponse( - resource_type="error", data=ErrorDetail(code="no-document-selected", message=type(e).__name__) - ), + ClientResponse(resource_type="documents", data=[map_document_to_source_document(d) for d in docs]), websocket, ) - except QuestionLengthError as e: - log.info("Question is too long", exc_info=e) - await send_to_client( - ClientResponse(resource_type="error", data=ErrorDetail(code="question-too-long", message=type(e).__name__)), - websocket, + + try: + await redbox.run( + state, + response_tokens_callback=on_llm_response, + route_name_callback=on_route_choice, + documents_callback=on_documents_available, ) except APIError as e: log.exception("Unhandled exception.", exc_info=e) diff --git a/core-api/core_api/runnables.py b/core-api/core_api/runnables.py new file mode 100644 index 000000000..e37736f23 --- /dev/null +++ b/core-api/core_api/runnables.py @@ -0,0 +1,19 @@ +from langchain_core.runnables import chain + +from redbox.models.chain import ChainState +from redbox.models.chat import ChatResponse +from redbox.transform import map_document_to_source_document + + +@chain +def map_to_chat_response(state: ChainState): + """ + Create a ChatResponse at the end of a chain from a dict containing + 'response' a string to use as output_text + 'source_documents' a list of documents to map to source_documents + """ + return ChatResponse( + output_text=state["response"], + source_documents=[map_document_to_source_document(d) for d in state.get("documents") or []], + route_name=state["route_name"], + ) diff --git a/core-api/core_api/semantic_routes.py b/core-api/core_api/semantic_routes.py deleted file mode 100644 index b41601a07..000000000 --- a/core-api/core_api/semantic_routes.py +++ /dev/null @@ -1,63 +0,0 @@ -from typing import Annotated - -from core_api.build_chains import ( - build_chat_chain, - build_chat_with_docs_chain, - build_condense_retrieval_chain, - build_static_response_chain, -) -from fastapi import Depends -from langchain_core.runnables import Runnable - -from redbox.models.chat import ChatRoute -from redbox.models.chain import ChainInput - -# === Pre-canned responses for non-LLM routes === -INFO_RESPONSE = """ -I am Redbox, an AI focused on helping UK Civil Servants, Political Advisors and -Ministers triage and summarise information from a wide variety of sources. -""" - - -def as_chat_tool( - name: str, - runnable: Runnable, - description: str, -): - return runnable.as_tool(name=name, description=description, args_schema=ChainInput) - - -__routable_chains = None - - -def get_routable_chains( - condense_chain: Annotated[Runnable, Depends(build_condense_retrieval_chain)], - chat_chain: Annotated[Runnable, Depends(build_chat_chain)], - chat_with_docs_chain: Annotated[Runnable, Depends(build_chat_with_docs_chain)], -) -> dict[str, tuple[Runnable, str]]: - global __routable_chains # noqa: PLW0603 - if not __routable_chains: - chat_tools = ( - ( - ChatRoute.info, - build_static_response_chain(INFO_RESPONSE, ChatRoute.info), - "Give helpful information about Redbox", - ), - ( - ChatRoute.chat, - chat_chain, - "Answer questions as a helpful assistant", - ), - ( - ChatRoute.chat_with_docs, - chat_with_docs_chain, - "Answer questions as a helpful assistant using the documents provided", - ), - ( - ChatRoute.search, - condense_chain, - "Search for an answer to a question in provided documents", - ), - ) - __routable_chains = {name: (runnable, description) for (name, runnable, description) in chat_tools} - return __routable_chains diff --git a/core-api/poetry.lock b/core-api/poetry.lock index fcb6e13d8..6c080cf0e 100644 --- a/core-api/poetry.lock +++ b/core-api/poetry.lock @@ -140,17 +140,6 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - [[package]] name = "attrs" version = "23.2.0" @@ -535,118 +524,6 @@ files = [ marshmallow = ">=3.18.0,<4.0.0" typing-inspect = ">=0.4.0,<1" -[[package]] -name = "datasets" -version = "2.14.4" -description = "HuggingFace community-driven open-source library of datasets" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "datasets-2.14.4-py3-none-any.whl", hash = "sha256:29336bd316a7d827ccd4da2236596279b20ca2ac78f64c04c9483da7cbc2459b"}, - {file = "datasets-2.14.4.tar.gz", hash = "sha256:ef29c2b5841de488cd343cfc26ab979bff77efa4d2285af51f1ad7db5c46a83b"}, -] - -[package.dependencies] -aiohttp = "*" -dill = ">=0.3.0,<0.3.8" -fsspec = {version = ">=2021.11.1", extras = ["http"]} -huggingface-hub = ">=0.14.0,<1.0.0" -multiprocess = "*" -numpy = ">=1.17" -packaging = "*" -pandas = "*" -pyarrow = ">=8.0.0" -pyyaml = ">=5.1" -requests = ">=2.19.0" -tqdm = ">=4.62.1" -xxhash = "*" - -[package.extras] -apache-beam = ["apache-beam (>=2.26.0,<2.44.0)"] -audio = ["librosa", "soundfile (>=0.12.1)"] -benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] -dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "black (>=23.1,<24.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "pyyaml (>=5.3.1)", "rarfile (>=4.0)", "ruff (>=0.0.241)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] -docs = ["s3fs", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos", "torch", "transformers"] -jax = ["jax (>=0.2.8,!=0.3.2,<=0.3.25)", "jaxlib (>=0.1.65,<=0.3.25)"] -metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] -quality = ["black (>=23.1,<24.0)", "pyyaml (>=5.3.1)", "ruff (>=0.0.241)"] -s3 = ["s3fs"] -tensorflow = ["tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos"] -tensorflow-gpu = ["tensorflow-gpu (>=2.2.0,!=2.6.0,!=2.6.1)"] -tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] -torch = ["torch"] -vision = ["Pillow (>=6.2.1)"] - -[[package]] -name = "deepeval" -version = "0.21.73" -description = "The open-source evaluation framework for LLMs." -optional = false -python-versions = "*" -files = [ - {file = "deepeval-0.21.73-py3-none-any.whl", hash = "sha256:e8b52d3a989c9393f77fe1cebb5532df49377badcf2dbfc73d0da2903331ebb0"}, - {file = "deepeval-0.21.73.tar.gz", hash = "sha256:290844565ad7bb36a66b87516f5b1f9820c1e181e4abcff314560a91e5fbe8e9"}, -] - -[package.dependencies] -docx2txt = ">=0.8,<1.0" -grpcio = "1.63.0" -importlib-metadata = ">=6.0.2" -langchain = "*" -langchain-core = "*" -langchain-openai = "*" -opentelemetry-api = "1.24.0" -opentelemetry-exporter-otlp-proto-grpc = "1.24.0" -opentelemetry-sdk = "1.24.0" -portalocker = "*" -protobuf = "4.25.1" -pydantic = "*" -pytest = "*" -pytest-repeat = "*" -pytest-xdist = "*" -ragas = "*" -requests = "*" -rich = "*" -sentry-sdk = "*" -tabulate = "*" -tenacity = ">=8.4.1,<8.5.0" -tqdm = "*" -typer = "*" - -[package.extras] -dev = ["black"] - -[[package]] -name = "deprecated" -version = "1.2.14" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, - {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] - -[[package]] -name = "dill" -version = "0.3.7" -description = "serialize all of Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] - [[package]] name = "distro" version = "1.9.0" @@ -678,16 +555,6 @@ idna = ["idna (>=3.6)"] trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] -[[package]] -name = "docx2txt" -version = "0.8" -description = "A pure python-based utility to extract text and images from docx files." -optional = false -python-versions = "*" -files = [ - {file = "docx2txt-0.8.tar.gz", hash = "sha256:2c06d98d7cfe2d3947e5760a57d924e3ff07745b379c8737723922e7009236e5"}, -] - [[package]] name = "ecdsa" version = "0.19.0" @@ -761,29 +628,15 @@ files = [ dnspython = ">=2.0.0" idna = ">=2.0.0" -[[package]] -name = "execnet" -version = "2.1.1" -description = "execnet: rapid multi-Python deployment" -optional = false -python-versions = ">=3.8" -files = [ - {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, - {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, -] - -[package.extras] -testing = ["hatch", "pre-commit", "pytest", "tox"] - [[package]] name = "fast-depends" -version = "2.4.6" +version = "2.4.7" description = "FastDepends - extracted and cleared from HTTP domain logic FastAPI Dependency Injection System. Async and sync are both supported." optional = false python-versions = ">=3.8" files = [ - {file = "fast_depends-2.4.6-py3-none-any.whl", hash = "sha256:50d0ba61450920173c498c08c01ec22fa22aa62c4e82bf409df9f5b9f677a31c"}, - {file = "fast_depends-2.4.6.tar.gz", hash = "sha256:724a5068c3f955e02121a953428349ef34c8a2fadd65f073e94c94d54cec4554"}, + {file = "fast_depends-2.4.7-py3-none-any.whl", hash = "sha256:ae7c138673639cfe00836b60107395c910cc1595036074c85c2505177f7a24fc"}, + {file = "fast_depends-2.4.7.tar.gz", hash = "sha256:44464a7807131df92aeb12ad511a027ef385e000f4ec15a427ae4ea458a112ce"}, ] [package.dependencies] @@ -976,9 +829,6 @@ files = [ {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, ] -[package.dependencies] -aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} - [package.extras] abfs = ["adlfs"] adl = ["adlfs"] @@ -1007,23 +857,6 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe, test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] -[[package]] -name = "googleapis-common-protos" -version = "1.63.2" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, - {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, -] - -[package.dependencies] -protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] - [[package]] name = "greenlet" version = "3.0.3" @@ -1095,64 +928,6 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] -[[package]] -name = "grpcio" -version = "1.63.0" -description = "HTTP/2-based RPC framework" -optional = false -python-versions = ">=3.8" -files = [ - {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, - {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, - {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, - {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, - {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, - {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, - {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, - {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, - {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, - {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, - {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, - {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, - {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, - {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, - {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, - {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, - {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, - {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, - {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, - {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, - {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, - {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, - {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, - {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, - {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, - {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, - {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, - {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, - {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, - {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, - {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.63.0)"] - [[package]] name = "h11" version = "0.14.0" @@ -1259,13 +1034,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.24.0" +version = "0.24.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.0-py3-none-any.whl", hash = "sha256:7ad92edefb93d8145c061f6df8d99df2ff85f8379ba5fac8a95aca0642afa5d7"}, - {file = "huggingface_hub-0.24.0.tar.gz", hash = "sha256:6c7092736b577d89d57b3cdfea026f1b0dc2234ae783fa0d59caf1bf7d52dfa7"}, + {file = "huggingface_hub-0.24.3-py3-none-any.whl", hash = "sha256:69ecce486dd6cdad69937ba76779e893c224a670a9d947636c1d5cbd049e44d8"}, + {file = "huggingface_hub-0.24.3.tar.gz", hash = "sha256:bfdc05cc9b64a0e24e8614a44222698799183268f6b68be209aa2df70cff2cde"}, ] [package.dependencies] @@ -1304,22 +1079,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.0" +version = "8.2.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, - {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, + {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, + {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -1360,20 +1135,6 @@ files = [ {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] -[[package]] -name = "jsonlines" -version = "4.0.0" -description = "Library with helpers for the jsonlines file format" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55"}, - {file = "jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74"}, -] - -[package.dependencies] -attrs = ">=19.2.0" - [[package]] name = "jsonpatch" version = "1.33" @@ -1566,15 +1327,29 @@ files = [ [package.dependencies] langchain-core = ">=0.2.10,<0.3.0" +[[package]] +name = "langgraph" +version = "0.1.16" +description = "Building stateful, multi-actor applications with LLMs" +optional = false +python-versions = "<4.0,>=3.9.0" +files = [ + {file = "langgraph-0.1.16-py3-none-any.whl", hash = "sha256:ad7fcba28ce81dde7c43b54e7ba098093c3827b84de5183d2e450c1789bb6e60"}, + {file = "langgraph-0.1.16.tar.gz", hash = "sha256:cd90f5691a8e7f4e523fd73e74b2ddd73051cb452ff17195f9cd5141ce1c2095"}, +] + +[package.dependencies] +langchain-core = ">=0.2.22,<0.3" + [[package]] name = "langsmith" -version = "0.1.93" +version = "0.1.94" 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.93-py3-none-any.whl", hash = "sha256:811210b9d5f108f36431bd7b997eb9476a9ecf5a2abd7ddbb606c1cdcf0f43ce"}, - {file = "langsmith-0.1.93.tar.gz", hash = "sha256:285b6ad3a54f50fa8eb97b5f600acc57d0e37e139dd8cf2111a117d0435ba9b4"}, + {file = "langsmith-0.1.94-py3-none-any.whl", hash = "sha256:0d01212086d58699f75814117b026784218042f7859877ce08a248a98d84aa8d"}, + {file = "langsmith-0.1.94.tar.gz", hash = "sha256:e44afcdc9eee6f238f6a87a02bba83111bd5fad376d881ae299834e06d39d712"}, ] [package.dependencies] @@ -1881,34 +1656,6 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] -[[package]] -name = "multiprocess" -version = "0.70.15" -description = "better multiprocessing and multithreading in Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multiprocess-0.70.15-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:aa36c7ed16f508091438687fe9baa393a7a8e206731d321e443745e743a0d4e5"}, - {file = "multiprocess-0.70.15-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:20e024018c46d0d1602024c613007ac948f9754659e3853b0aa705e83f6931d8"}, - {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_i686.whl", hash = "sha256:e576062981c91f0fe8a463c3d52506e598dfc51320a8dd8d78b987dfca91c5db"}, - {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e73f497e6696a0f5433ada2b3d599ae733b87a6e8b008e387c62ac9127add177"}, - {file = "multiprocess-0.70.15-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73db2e7b32dcc7f9b0f075c2ffa45c90b6729d3f1805f27e88534c8d321a1be5"}, - {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_i686.whl", hash = "sha256:4271647bd8a49c28ecd6eb56a7fdbd3c212c45529ad5303b40b3c65fc6928e5f"}, - {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:cf981fb998d6ec3208cb14f0cf2e9e80216e834f5d51fd09ebc937c32b960902"}, - {file = "multiprocess-0.70.15-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:18f9f2c7063346d1617bd1684fdcae8d33380ae96b99427260f562e1a1228b67"}, - {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_i686.whl", hash = "sha256:0eac53214d664c49a34695e5824872db4006b1a465edd7459a251809c3773370"}, - {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1a51dd34096db47fb21fa2b839e615b051d51b97af9a67afbcdaa67186b44883"}, - {file = "multiprocess-0.70.15-py310-none-any.whl", hash = "sha256:7dd58e33235e83cf09d625e55cffd7b0f0eede7ee9223cdd666a87624f60c21a"}, - {file = "multiprocess-0.70.15-py311-none-any.whl", hash = "sha256:134f89053d82c9ed3b73edd3a2531eb791e602d4f4156fc92a79259590bd9670"}, - {file = "multiprocess-0.70.15-py37-none-any.whl", hash = "sha256:f7d4a1629bccb433114c3b4885f69eccc200994323c80f6feee73b0edc9199c5"}, - {file = "multiprocess-0.70.15-py38-none-any.whl", hash = "sha256:bee9afba476c91f9ebee7beeee0601face9eff67d822e893f9a893725fbd6316"}, - {file = "multiprocess-0.70.15-py39-none-any.whl", hash = "sha256:3e0953f5d52b4c76f1c973eaf8214554d146f2be5decb48e928e55c7a2d19338"}, - {file = "multiprocess-0.70.15.tar.gz", hash = "sha256:f20eed3036c0ef477b07a4177cf7c1ba520d9a2677870a4f47fe026f0cd6787e"}, -] - -[package.dependencies] -dill = ">=0.3.7" - [[package]] name = "mypy-extensions" version = "1.0.0" @@ -1920,17 +1667,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "nest-asyncio" -version = "1.6.0" -description = "Patch asyncio to allow nested event loops" -optional = false -python-versions = ">=3.5" -files = [ - {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, - {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, -] - [[package]] name = "numpy" version = "1.26.4" @@ -1978,13 +1714,13 @@ files = [ [[package]] name = "openai" -version = "1.36.1" +version = "1.37.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.36.1-py3-none-any.whl", hash = "sha256:d399b9d476dbbc167aceaac6bc6ed0b2e2bb6c9e189c7f7047f822743ae62e64"}, - {file = "openai-1.36.1.tar.gz", hash = "sha256:41be9e0302e95dba8a9374b885c5cb1cec2202816a70b98736fee25a2cadd1f2"}, + {file = "openai-1.37.1-py3-none-any.whl", hash = "sha256:9a6adda0d6ae8fce02d235c5671c399cfa40d6a281b3628914c7ebf244888ee3"}, + {file = "openai-1.37.1.tar.gz", hash = "sha256:faf87206785a6b5d9e34555d6a3242482a6852bc802e453e2a891f68ee04ce55"}, ] [package.dependencies] @@ -1999,99 +1735,6 @@ typing-extensions = ">=4.7,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -[[package]] -name = "opentelemetry-api" -version = "1.24.0" -description = "OpenTelemetry Python API" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_api-1.24.0-py3-none-any.whl", hash = "sha256:0f2c363d98d10d1ce93330015ca7fd3a65f60be64e05e30f557c61de52c80ca2"}, - {file = "opentelemetry_api-1.24.0.tar.gz", hash = "sha256:42719f10ce7b5a9a73b10a4baf620574fb8ad495a9cbe5c18d76b75d8689c67e"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=7.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-common" -version = "1.24.0" -description = "OpenTelemetry Protobuf encoding" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.24.0-py3-none-any.whl", hash = "sha256:e51f2c9735054d598ad2df5d3eca830fecfb5b0bda0a2fa742c9c7718e12f641"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.24.0.tar.gz", hash = "sha256:5d31fa1ff976cacc38be1ec4e3279a3f88435c75b38b1f7a099a1faffc302461"}, -] - -[package.dependencies] -opentelemetry-proto = "1.24.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.24.0" -description = "OpenTelemetry Collector Protobuf over gRPC Exporter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0-py3-none-any.whl", hash = "sha256:f40d62aa30a0a43cc1657428e59fcf82ad5f7ea8fff75de0f9d9cb6f739e0a3b"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0.tar.gz", hash = "sha256:217c6e30634f2c9797999ea9da29f7300479a94a610139b9df17433f915e7baa"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -googleapis-common-protos = ">=1.52,<2.0" -grpcio = ">=1.0.0,<2.0.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.24.0" -opentelemetry-proto = "1.24.0" -opentelemetry-sdk = ">=1.24.0,<1.25.0" - -[package.extras] -test = ["pytest-grpc"] - -[[package]] -name = "opentelemetry-proto" -version = "1.24.0" -description = "OpenTelemetry Python Proto" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_proto-1.24.0-py3-none-any.whl", hash = "sha256:bcb80e1e78a003040db71ccf83f2ad2019273d1e0828089d183b18a1476527ce"}, - {file = "opentelemetry_proto-1.24.0.tar.gz", hash = "sha256:ff551b8ad63c6cabb1845ce217a6709358dfaba0f75ea1fa21a61ceddc78cab8"}, -] - -[package.dependencies] -protobuf = ">=3.19,<5.0" - -[[package]] -name = "opentelemetry-sdk" -version = "1.24.0" -description = "OpenTelemetry Python SDK" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_sdk-1.24.0-py3-none-any.whl", hash = "sha256:fa731e24efe832e98bcd90902085b359dcfef7d9c9c00eb5b9a18587dae3eb59"}, - {file = "opentelemetry_sdk-1.24.0.tar.gz", hash = "sha256:75bc0563affffa827700e0f4f4a68e1e257db0df13372344aebc6f8a64cde2e5"}, -] - -[package.dependencies] -opentelemetry-api = "1.24.0" -opentelemetry-semantic-conventions = "0.45b0" -typing-extensions = ">=3.7.4" - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.45b0" -description = "OpenTelemetry Semantic Conventions" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_semantic_conventions-0.45b0-py3-none-any.whl", hash = "sha256:a4a6fb9a7bacd9167c082aa4681009e9acdbfa28ffb2387af50c2fef3d30c864"}, - {file = "opentelemetry_semantic_conventions-0.45b0.tar.gz", hash = "sha256:7c84215a44ac846bc4b8e32d5e78935c5c43482e491812a0bb8aaf87e4d92118"}, -] - [[package]] name = "orjson" version = "3.10.6" @@ -2163,75 +1806,6 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[[package]] -name = "pandas" -version = "2.2.2" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, -] - -[package.dependencies] -numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.7" - -[package.extras] -all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] -aws = ["s3fs (>=2022.11.0)"] -clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] -compression = ["zstandard (>=0.19.0)"] -computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] -feather = ["pyarrow (>=10.0.1)"] -fss = ["fsspec (>=2022.11.0)"] -gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] -hdf5 = ["tables (>=3.8.0)"] -html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] -mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] -parquet = ["pyarrow (>=10.0.1)"] -performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] -plot = ["matplotlib (>=3.6.3)"] -postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] -pyarrow = ["pyarrow (>=10.0.1)"] -spss = ["pyreadstat (>=1.2.0)"] -sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.9.2)"] - [[package]] name = "pillow" version = "10.4.0" @@ -2414,45 +1988,6 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "portalocker" -version = "2.10.1" -description = "Wraps the portalocker recipe for easy usage" -optional = false -python-versions = ">=3.8" -files = [ - {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, - {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, -] - -[package.dependencies] -pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} - -[package.extras] -docs = ["sphinx (>=1.7.1)"] -redis = ["redis"] -tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] - -[[package]] -name = "protobuf" -version = "4.25.1" -description = "" -optional = false -python-versions = ">=3.8" -files = [ - {file = "protobuf-4.25.1-cp310-abi3-win32.whl", hash = "sha256:193f50a6ab78a970c9b4f148e7c750cfde64f59815e86f686c22e26b4fe01ce7"}, - {file = "protobuf-4.25.1-cp310-abi3-win_amd64.whl", hash = "sha256:3497c1af9f2526962f09329fd61a36566305e6c72da2590ae0d7d1322818843b"}, - {file = "protobuf-4.25.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:0bf384e75b92c42830c0a679b0cd4d6e2b36ae0cf3dbb1e1dfdda48a244f4bcd"}, - {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:0f881b589ff449bf0b931a711926e9ddaad3b35089cc039ce1af50b21a4ae8cb"}, - {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ca37bf6a6d0046272c152eea90d2e4ef34593aaa32e8873fc14c16440f22d4b7"}, - {file = "protobuf-4.25.1-cp38-cp38-win32.whl", hash = "sha256:abc0525ae2689a8000837729eef7883b9391cd6aa7950249dcf5a4ede230d5dd"}, - {file = "protobuf-4.25.1-cp38-cp38-win_amd64.whl", hash = "sha256:1484f9e692091450e7edf418c939e15bfc8fc68856e36ce399aed6889dae8bb0"}, - {file = "protobuf-4.25.1-cp39-cp39-win32.whl", hash = "sha256:8bdbeaddaac52d15c6dce38c71b03038ef7772b977847eb6d374fc86636fa510"}, - {file = "protobuf-4.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:becc576b7e6b553d22cbdf418686ee4daa443d7217999125c045ad56322dda10"}, - {file = "protobuf-4.25.1-py3-none-any.whl", hash = "sha256:a19731d5e83ae4737bb2a089605e636077ac001d18781b3cf489b9546c7c80d6"}, - {file = "protobuf-4.25.1.tar.gz", hash = "sha256:57d65074b4f5baa4ab5da1605c02be90ac20c8b40fb137d6a8df9f416b0d0ce2"}, -] - [[package]] name = "py-partiql-parser" version = "0.5.5" @@ -2467,57 +2002,6 @@ files = [ [package.extras] dev = ["black (==22.6.0)", "flake8", "mypy", "pytest"] -[[package]] -name = "pyarrow" -version = "17.0.0" -description = "Python library for Apache Arrow" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, - {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, - {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"}, - {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"}, - {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"}, - {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"}, - {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"}, - {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, - {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, - {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, - {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, - {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, - {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, - {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, - {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, - {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, - {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, - {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, - {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, - {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, - {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, - {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, - {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, - {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, -] - -[package.dependencies] -numpy = ">=1.16.6" - -[package.extras] -test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] - [[package]] name = "pyasn1" version = "0.6.0" @@ -2662,13 +2146,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.3.4" +version = "2.4.0" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.3.4-py3-none-any.whl", hash = "sha256:11ad8bacb68a045f00e4f862c7a718c8a9ec766aa8fd4c32e39a0594b207b53a"}, - {file = "pydantic_settings-2.3.4.tar.gz", hash = "sha256:c5802e3d62b78e82522319bbc9b8f8ffb28ad1c988a99311d04f2a6051fca0a7"}, + {file = "pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315"}, + {file = "pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88"}, ] [package.dependencies] @@ -2676,6 +2160,7 @@ pydantic = ">=2.7.0" python-dotenv = ">=0.21.0" [package.extras] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] @@ -2693,16 +2178,6 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] -[[package]] -name = "pysbd" -version = "0.3.4" -description = "pysbd (Python Sentence Boundary Disambiguation) is a rule-based sentence boundary detection that works out-of-the-box across many languages." -optional = false -python-versions = ">=3" -files = [ - {file = "pysbd-0.3.4-py3-none-any.whl", hash = "sha256:cd838939b7b0b185fcf86b0baf6636667dfb6e474743beeff878e9f42e022953"}, -] - [[package]] name = "pytest" version = "8.3.2" @@ -2791,40 +2266,6 @@ pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] -[[package]] -name = "pytest-repeat" -version = "0.9.3" -description = "pytest plugin for repeating tests" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest_repeat-0.9.3-py3-none-any.whl", hash = "sha256:26ab2df18226af9d5ce441c858f273121e92ff55f5bb311d25755b8d7abdd8ed"}, - {file = "pytest_repeat-0.9.3.tar.gz", hash = "sha256:ffd3836dfcd67bb270bec648b330e20be37d2966448c4148c4092d1e8aba8185"}, -] - -[package.dependencies] -pytest = "*" - -[[package]] -name = "pytest-xdist" -version = "3.6.1" -description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, - {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, -] - -[package.dependencies] -execnet = ">=2.1" -pytest = ">=7.0.0" - -[package.extras] -psutil = ["psutil (>=3.0)"] -setproctitle = ["setproctitle"] -testing = ["filelock"] - [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -2888,40 +2329,6 @@ files = [ [package.extras] dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] -[[package]] -name = "pytz" -version = "2024.1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, -] - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, -] - [[package]] name = "pyyaml" version = "6.0.1" @@ -2982,33 +2389,6 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] -[[package]] -name = "ragas" -version = "0.1.10" -description = "" -optional = false -python-versions = "*" -files = [ - {file = "ragas-0.1.10-py3-none-any.whl", hash = "sha256:9e547f17f10075cccaae0216c7d22000346c5f9dfc66e55abf621d3ee80786f2"}, - {file = "ragas-0.1.10.tar.gz", hash = "sha256:29bfd4844a29ca869950d5ed73461c276afd85d999d3c26acdd10560da6dc5c2"}, -] - -[package.dependencies] -appdirs = "*" -datasets = "*" -langchain = "*" -langchain-community = "*" -langchain-core = "*" -langchain-openai = "*" -nest-asyncio = "*" -numpy = "*" -openai = ">1" -pysbd = ">=0.3.4" -tiktoken = "*" - -[package.extras] -all = ["sentence-transformers"] - [[package]] name = "redbox" version = "0.4.0" @@ -3019,12 +2399,14 @@ files = [] develop = true [package.dependencies] -boto3 = "^1.34.136" +boto3 = "^1.34.150" elasticsearch = "^8.14.0" kneed = "^0.8.5" -langchain = "^0.2.6" +langchain = "^0.2.11" +langchain-community = "^0.2.6" langchain-elasticsearch = "^0.2.2" -langchain_openai = "^0.1.9" +langchain_openai = "^0.1.19" +langgraph = "^0.1.9" pydantic = "^2.7.1" pydantic-settings = "^2.3.4" pytest-dotenv = "^0.5.2" @@ -3036,17 +2418,17 @@ url = "../redbox-core" [[package]] name = "redis" -version = "5.0.7" +version = "5.0.8" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, - {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, + {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, + {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, ] [package.extras] -hiredis = ["hiredis (>=1.0.0)"] +hiredis = ["hiredis (>1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] [[package]] @@ -3066,90 +2448,90 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.5.15" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] @@ -3212,110 +2594,114 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.19.0" +version = "0.19.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.19.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:fb37bd599f031f1a6fb9e58ec62864ccf3ad549cf14bac527dbfa97123edcca4"}, - {file = "rpds_py-0.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3384d278df99ec2c6acf701d067147320b864ef6727405d6470838476e44d9e8"}, - {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54548e0be3ac117595408fd4ca0ac9278fde89829b0b518be92863b17ff67a2"}, - {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8eb488ef928cdbc05a27245e52de73c0d7c72a34240ef4d9893fdf65a8c1a955"}, - {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5da93debdfe27b2bfc69eefb592e1831d957b9535e0943a0ee8b97996de21b5"}, - {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79e205c70afddd41f6ee79a8656aec738492a550247a7af697d5bd1aee14f766"}, - {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:959179efb3e4a27610e8d54d667c02a9feaa86bbabaf63efa7faa4dfa780d4f1"}, - {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a6e605bb9edcf010f54f8b6a590dd23a4b40a8cb141255eec2a03db249bc915b"}, - {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9133d75dc119a61d1a0ded38fb9ba40a00ef41697cc07adb6ae098c875195a3f"}, - {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd36b712d35e757e28bf2f40a71e8f8a2d43c8b026d881aa0c617b450d6865c9"}, - {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354f3a91718489912f2e0fc331c24eaaf6a4565c080e00fbedb6015857c00582"}, - {file = "rpds_py-0.19.0-cp310-none-win32.whl", hash = "sha256:ebcbf356bf5c51afc3290e491d3722b26aaf5b6af3c1c7f6a1b757828a46e336"}, - {file = "rpds_py-0.19.0-cp310-none-win_amd64.whl", hash = "sha256:75a6076289b2df6c8ecb9d13ff79ae0cad1d5fb40af377a5021016d58cd691ec"}, - {file = "rpds_py-0.19.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6d45080095e585f8c5097897313def60caa2046da202cdb17a01f147fb263b81"}, - {file = "rpds_py-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5c9581019c96f865483d031691a5ff1cc455feb4d84fc6920a5ffc48a794d8a"}, - {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1540d807364c84516417115c38f0119dfec5ea5c0dd9a25332dea60b1d26fc4d"}, - {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e65489222b410f79711dc3d2d5003d2757e30874096b2008d50329ea4d0f88c"}, - {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da6f400eeb8c36f72ef6646ea530d6d175a4f77ff2ed8dfd6352842274c1d8b"}, - {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37f46bb11858717e0efa7893c0f7055c43b44c103e40e69442db5061cb26ed34"}, - {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:071d4adc734de562bd11d43bd134330fb6249769b2f66b9310dab7460f4bf714"}, - {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9625367c8955e4319049113ea4f8fee0c6c1145192d57946c6ffcd8fe8bf48dd"}, - {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e19509145275d46bc4d1e16af0b57a12d227c8253655a46bbd5ec317e941279d"}, - {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d438e4c020d8c39961deaf58f6913b1bf8832d9b6f62ec35bd93e97807e9cbc"}, - {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90bf55d9d139e5d127193170f38c584ed3c79e16638890d2e36f23aa1630b952"}, - {file = "rpds_py-0.19.0-cp311-none-win32.whl", hash = "sha256:8d6ad132b1bc13d05ffe5b85e7a01a3998bf3a6302ba594b28d61b8c2cf13aaf"}, - {file = "rpds_py-0.19.0-cp311-none-win_amd64.whl", hash = "sha256:7ec72df7354e6b7f6eb2a17fa6901350018c3a9ad78e48d7b2b54d0412539a67"}, - {file = "rpds_py-0.19.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68"}, - {file = "rpds_py-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b"}, - {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa"}, - {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb"}, - {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d"}, - {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248"}, - {file = "rpds_py-0.19.0-cp312-none-win32.whl", hash = "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600"}, - {file = "rpds_py-0.19.0-cp312-none-win_amd64.whl", hash = "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4"}, - {file = "rpds_py-0.19.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:52e466bea6f8f3a44b1234570244b1cff45150f59a4acae3fcc5fd700c2993ca"}, - {file = "rpds_py-0.19.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e21cc693045fda7f745c790cb687958161ce172ffe3c5719ca1764e752237d16"}, - {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b31f059878eb1f5da8b2fd82480cc18bed8dcd7fb8fe68370e2e6285fa86da6"}, - {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dd46f309e953927dd018567d6a9e2fb84783963650171f6c5fe7e5c41fd5666"}, - {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a01a4490e170376cd79258b7f755fa13b1a6c3667e872c8e35051ae857a92b"}, - {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcf426a8c38eb57f7bf28932e68425ba86def6e756a5b8cb4731d8e62e4e0223"}, - {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68eea5df6347d3f1378ce992d86b2af16ad7ff4dcb4a19ccdc23dea901b87fb"}, - {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dab8d921b55a28287733263c0e4c7db11b3ee22aee158a4de09f13c93283c62d"}, - {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6fe87efd7f47266dfc42fe76dae89060038f1d9cb911f89ae7e5084148d1cc08"}, - {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:535d4b52524a961d220875688159277f0e9eeeda0ac45e766092bfb54437543f"}, - {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8b1a94b8afc154fbe36978a511a1f155f9bd97664e4f1f7a374d72e180ceb0ae"}, - {file = "rpds_py-0.19.0-cp38-none-win32.whl", hash = "sha256:7c98298a15d6b90c8f6e3caa6457f4f022423caa5fa1a1ca7a5e9e512bdb77a4"}, - {file = "rpds_py-0.19.0-cp38-none-win_amd64.whl", hash = "sha256:b0da31853ab6e58a11db3205729133ce0df26e6804e93079dee095be3d681dc1"}, - {file = "rpds_py-0.19.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5039e3cef7b3e7a060de468a4a60a60a1f31786da94c6cb054e7a3c75906111c"}, - {file = "rpds_py-0.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab1932ca6cb8c7499a4d87cb21ccc0d3326f172cfb6a64021a889b591bb3045c"}, - {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2afd2164a1e85226fcb6a1da77a5c8896c18bfe08e82e8ceced5181c42d2179"}, - {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1c30841f5040de47a0046c243fc1b44ddc87d1b12435a43b8edff7e7cb1e0d0"}, - {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f757f359f30ec7dcebca662a6bd46d1098f8b9fb1fcd661a9e13f2e8ce343ba1"}, - {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15e65395a59d2e0e96caf8ee5389ffb4604e980479c32742936ddd7ade914b22"}, - {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb0f6eb3a320f24b94d177e62f4074ff438f2ad9d27e75a46221904ef21a7b05"}, - {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b228e693a2559888790936e20f5f88b6e9f8162c681830eda303bad7517b4d5a"}, - {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2575efaa5d949c9f4e2cdbe7d805d02122c16065bfb8d95c129372d65a291a0b"}, - {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5c872814b77a4e84afa293a1bee08c14daed1068b2bb1cc312edbf020bbbca2b"}, - {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850720e1b383df199b8433a20e02b25b72f0fded28bc03c5bd79e2ce7ef050be"}, - {file = "rpds_py-0.19.0-cp39-none-win32.whl", hash = "sha256:ce84a7efa5af9f54c0aa7692c45861c1667080814286cacb9958c07fc50294fb"}, - {file = "rpds_py-0.19.0-cp39-none-win_amd64.whl", hash = "sha256:1c26da90b8d06227d7769f34915913911222d24ce08c0ab2d60b354e2d9c7aff"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388"}, - {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a"}, - {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a"}, - {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521"}, - {file = "rpds_py-0.19.0.tar.gz", hash = "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9"}, + {file = "rpds_py-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:aaf71f95b21f9dc708123335df22e5a2fef6307e3e6f9ed773b2e0938cc4d491"}, + {file = "rpds_py-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca0dda0c5715efe2ab35bb83f813f681ebcd2840d8b1b92bfc6fe3ab382fae4a"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81db2e7282cc0487f500d4db203edc57da81acde9e35f061d69ed983228ffe3b"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a8dfa125b60ec00c7c9baef945bb04abf8ac772d8ebefd79dae2a5f316d7850"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271accf41b02687cef26367c775ab220372ee0f4925591c6796e7c148c50cab5"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9bc4161bd3b970cd6a6fcda70583ad4afd10f2750609fb1f3ca9505050d4ef3"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0cf2a0dbb5987da4bd92a7ca727eadb225581dd9681365beba9accbe5308f7d"}, + {file = "rpds_py-0.19.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5e28e56143750808c1c79c70a16519e9bc0a68b623197b96292b21b62d6055c"}, + {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c7af6f7b80f687b33a4cdb0a785a5d4de1fb027a44c9a049d8eb67d5bfe8a687"}, + {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e429fc517a1c5e2a70d576077231538a98d59a45dfc552d1ac45a132844e6dfb"}, + {file = "rpds_py-0.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d2dbd8f4990d4788cb122f63bf000357533f34860d269c1a8e90ae362090ff3a"}, + {file = "rpds_py-0.19.1-cp310-none-win32.whl", hash = "sha256:e0f9d268b19e8f61bf42a1da48276bcd05f7ab5560311f541d22557f8227b866"}, + {file = "rpds_py-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:df7c841813f6265e636fe548a49664c77af31ddfa0085515326342a751a6ba51"}, + {file = "rpds_py-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137"}, + {file = "rpds_py-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3d73022990ab0c8b172cce57c69fd9a89c24fd473a5e79cbce92df87e3d9c48"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cdb7eb3cf3deb3dd9e7b8749323b5d970052711f9e1e9f36364163627f96da58"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26ab43b6d65d25b1a333c8d1b1c2f8399385ff683a35ab5e274ba7b8bb7dc61c"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75130df05aae7a7ac171b3b5b24714cffeabd054ad2ebc18870b3aa4526eba23"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b"}, + {file = "rpds_py-0.19.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2671cb47e50a97f419a02cd1e0c339b31de017b033186358db92f4d8e2e17d8"}, + {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c73254c256081704dba0a333457e2fb815364018788f9b501efe7c5e0ada401"}, + {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4383beb4a29935b8fa28aca8fa84c956bf545cb0c46307b091b8d312a9150e6a"}, + {file = "rpds_py-0.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dbceedcf4a9329cc665452db1aaf0845b85c666e4885b92ee0cddb1dbf7e052a"}, + {file = "rpds_py-0.19.1-cp311-none-win32.whl", hash = "sha256:f0a6d4a93d2a05daec7cb885157c97bbb0be4da739d6f9dfb02e101eb40921cd"}, + {file = "rpds_py-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c"}, + {file = "rpds_py-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:56313be667a837ff1ea3508cebb1ef6681d418fa2913a0635386cf29cff35165"}, + {file = "rpds_py-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d1d7539043b2b31307f2c6c72957a97c839a88b2629a348ebabe5aa8b626d6b"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1dc59a5e7bc7f44bd0c048681f5e05356e479c50be4f2c1a7089103f1621d5"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8f78398e67a7227aefa95f876481485403eb974b29e9dc38b307bb6eb2315ea"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef07a0a1d254eeb16455d839cef6e8c2ed127f47f014bbda64a58b5482b6c836"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8124101e92c56827bebef084ff106e8ea11c743256149a95b9fd860d3a4f331f"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505"}, + {file = "rpds_py-0.19.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b02dd77a2de6e49078c8937aadabe933ceac04b41c5dde5eca13a69f3cf144e"}, + {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4dd02e29c8cbed21a1875330b07246b71121a1c08e29f0ee3db5b4cfe16980c4"}, + {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9c7042488165f7251dc7894cd533a875d2875af6d3b0e09eda9c4b334627ad1c"}, + {file = "rpds_py-0.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f809a17cc78bd331e137caa25262b507225854073fd319e987bd216bed911b7c"}, + {file = "rpds_py-0.19.1-cp312-none-win32.whl", hash = "sha256:3ddab996807c6b4227967fe1587febade4e48ac47bb0e2d3e7858bc621b1cace"}, + {file = "rpds_py-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:32e0db3d6e4f45601b58e4ac75c6f24afbf99818c647cc2066f3e4b192dabb1f"}, + {file = "rpds_py-0.19.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:747251e428406b05fc86fee3904ee19550c4d2d19258cef274e2151f31ae9d38"}, + {file = "rpds_py-0.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dc733d35f861f8d78abfaf54035461e10423422999b360966bf1c443cbc42705"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbda75f245caecff8faa7e32ee94dfaa8312a3367397975527f29654cd17a6ed"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd04d8cab16cab5b0a9ffc7d10f0779cf1120ab16c3925404428f74a0a43205a"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2d66eb41ffca6cc3c91d8387509d27ba73ad28371ef90255c50cb51f8953301"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdf4890cda3b59170009d012fca3294c00140e7f2abe1910e6a730809d0f3f9b"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1fa67ef839bad3815124f5f57e48cd50ff392f4911a9f3cf449d66fa3df62a5"}, + {file = "rpds_py-0.19.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b82c9514c6d74b89a370c4060bdb80d2299bc6857e462e4a215b4ef7aa7b090e"}, + {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c7b07959866a6afb019abb9564d8a55046feb7a84506c74a6f197cbcdf8a208e"}, + {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4f580ae79d0b861dfd912494ab9d477bea535bfb4756a2269130b6607a21802e"}, + {file = "rpds_py-0.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c6d20c8896c00775e6f62d8373aba32956aa0b850d02b5ec493f486c88e12859"}, + {file = "rpds_py-0.19.1-cp313-none-win32.whl", hash = "sha256:afedc35fe4b9e30ab240b208bb9dc8938cb4afe9187589e8d8d085e1aacb8309"}, + {file = "rpds_py-0.19.1-cp313-none-win_amd64.whl", hash = "sha256:1d4af2eb520d759f48f1073ad3caef997d1bfd910dc34e41261a595d3f038a94"}, + {file = "rpds_py-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:34bca66e2e3eabc8a19e9afe0d3e77789733c702c7c43cd008e953d5d1463fde"}, + {file = "rpds_py-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:24f8ae92c7fae7c28d0fae9b52829235df83f34847aa8160a47eb229d9666c7b"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71157f9db7f6bc6599a852852f3389343bea34315b4e6f109e5cbc97c1fb2963"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d494887d40dc4dd0d5a71e9d07324e5c09c4383d93942d391727e7a40ff810b"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3661e6d4ba63a094138032c1356d557de5b3ea6fd3cca62a195f623e381c76"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97fbb77eaeb97591efdc654b8b5f3ccc066406ccfb3175b41382f221ecc216e8"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cc4bc73e53af8e7a42c8fd7923bbe35babacfa7394ae9240b3430b5dcf16b2a"}, + {file = "rpds_py-0.19.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:35af5e4d5448fa179fd7fff0bba0fba51f876cd55212f96c8bbcecc5c684ae5c"}, + {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3511f6baf8438326e351097cecd137eb45c5f019944fe0fd0ae2fea2fd26be39"}, + {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:57863d16187995c10fe9cf911b897ed443ac68189179541734502353af33e693"}, + {file = "rpds_py-0.19.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9e318e6786b1e750a62f90c6f7fa8b542102bdcf97c7c4de2a48b50b61bd36ec"}, + {file = "rpds_py-0.19.1-cp38-none-win32.whl", hash = "sha256:53dbc35808c6faa2ce3e48571f8f74ef70802218554884787b86a30947842a14"}, + {file = "rpds_py-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:8df1c283e57c9cb4d271fdc1875f4a58a143a2d1698eb0d6b7c0d7d5f49c53a1"}, + {file = "rpds_py-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e76c902d229a3aa9d5ceb813e1cbcc69bf5bda44c80d574ff1ac1fa3136dea71"}, + {file = "rpds_py-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de1f7cd5b6b351e1afd7568bdab94934d656abe273d66cda0ceea43bbc02a0c2"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fc5a84777cb61692d17988989690d6f34f7f95968ac81398d67c0d0994a897"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:74129d5ffc4cde992d89d345f7f7d6758320e5d44a369d74d83493429dad2de5"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e360188b72f8080fefa3adfdcf3618604cc8173651c9754f189fece068d2a45"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13e6d4840897d4e4e6b2aa1443e3a8eca92b0402182aafc5f4ca1f5e24f9270a"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d"}, + {file = "rpds_py-0.19.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d4b52811dcbc1aba08fd88d475f75b4f6db0984ba12275d9bed1a04b2cae9b5"}, + {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd635c2c4043222d80d80ca1ac4530a633102a9f2ad12252183bcf338c1b9474"}, + {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f35b34a5184d5e0cc360b61664c1c06e866aab077b5a7c538a3e20c8fcdbf90b"}, + {file = "rpds_py-0.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d4ec0046facab83012d821b33cead742a35b54575c4edfb7ed7445f63441835f"}, + {file = "rpds_py-0.19.1-cp39-none-win32.whl", hash = "sha256:f5b8353ea1a4d7dfb59a7f45c04df66ecfd363bb5b35f33b11ea579111d4655f"}, + {file = "rpds_py-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:1fb93d3486f793d54a094e2bfd9cd97031f63fcb5bc18faeb3dd4b49a1c06523"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7d5c7e32f3ee42f77d8ff1a10384b5cdcc2d37035e2e3320ded909aa192d32c3"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:89cc8921a4a5028d6dd388c399fcd2eef232e7040345af3d5b16c04b91cf3c7e"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca34e913d27401bda2a6f390d0614049f5a95b3b11cd8eff80fe4ec340a1208"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5953391af1405f968eb5701ebbb577ebc5ced8d0041406f9052638bafe52209d"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:840e18c38098221ea6201f091fc5d4de6128961d2930fbbc96806fb43f69aec1"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d8b735c4d162dc7d86a9cf3d717f14b6c73637a1f9cd57fe7e61002d9cb1972"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce757c7c90d35719b38fa3d4ca55654a76a40716ee299b0865f2de21c146801c"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9421b23c85f361a133aa7c5e8ec757668f70343f4ed8fdb5a4a14abd5437244"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3b823be829407393d84ee56dc849dbe3b31b6a326f388e171555b262e8456cc1"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:5e58b61dcbb483a442c6239c3836696b79f2cd8e7eec11e12155d3f6f2d886d1"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39d67896f7235b2c886fb1ee77b1491b77049dcef6fbf0f401e7b4cbed86bbd4"}, + {file = "rpds_py-0.19.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8b32cd4ab6db50c875001ba4f5a6b30c0f42151aa1fbf9c2e7e3674893fb1dc4"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c32e41de995f39b6b315d66c27dea3ef7f7c937c06caab4c6a79a5e09e2c415"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a129c02b42d46758c87faeea21a9f574e1c858b9f358b6dd0bbd71d17713175"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:346557f5b1d8fd9966059b7a748fd79ac59f5752cd0e9498d6a40e3ac1c1875f"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31e450840f2f27699d014cfc8865cc747184286b26d945bcea6042bb6aa4d26e"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01227f8b3e6c8961490d869aa65c99653df80d2f0a7fde8c64ebddab2b9b02fd"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69084fd29bfeff14816666c93a466e85414fe6b7d236cfc108a9c11afa6f7301"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d2b88efe65544a7d5121b0c3b003ebba92bfede2ea3577ce548b69c5235185"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ea961a674172ed2235d990d7edf85d15d8dfa23ab8575e48306371c070cda67"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5beffdbe766cfe4fb04f30644d822a1080b5359df7db3a63d30fa928375b2720"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:720f3108fb1bfa32e51db58b832898372eb5891e8472a8093008010911e324c5"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c2087dbb76a87ec2c619253e021e4fb20d1a72580feeaa6892b0b3d955175a71"}, + {file = "rpds_py-0.19.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ddd50f18ebc05ec29a0d9271e9dbe93997536da3546677f8ca00b76d477680c"}, + {file = "rpds_py-0.19.1.tar.gz", hash = "sha256:31dd5794837f00b46f4096aa8ccaa5972f73a938982e32ed817bb520c465e520"}, ] [[package]] @@ -3391,56 +2777,6 @@ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodest doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] -[[package]] -name = "sentry-sdk" -version = "2.11.0" -description = "Python client for Sentry (https://sentry.io)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "sentry_sdk-2.11.0-py2.py3-none-any.whl", hash = "sha256:d964710e2dbe015d9dc4ff0ad16225d68c3b36936b742a6fe0504565b760a3b7"}, - {file = "sentry_sdk-2.11.0.tar.gz", hash = "sha256:4ca16e9f5c7c6bc2fb2d5c956219f4926b148e511fffdbbde711dc94f1e0468f"}, -] - -[package.dependencies] -certifi = "*" -urllib3 = ">=1.26.11" - -[package.extras] -aiohttp = ["aiohttp (>=3.5)"] -anthropic = ["anthropic (>=0.16)"] -arq = ["arq (>=0.23)"] -asyncpg = ["asyncpg (>=0.23)"] -beam = ["apache-beam (>=2.12)"] -bottle = ["bottle (>=0.12.13)"] -celery = ["celery (>=3)"] -celery-redbeat = ["celery-redbeat (>=2)"] -chalice = ["chalice (>=1.16.0)"] -clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] -django = ["django (>=1.8)"] -falcon = ["falcon (>=1.4)"] -fastapi = ["fastapi (>=0.79.0)"] -flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] -grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] -httpx = ["httpx (>=0.16.0)"] -huey = ["huey (>=2)"] -huggingface-hub = ["huggingface-hub (>=0.22)"] -langchain = ["langchain (>=0.0.210)"] -loguru = ["loguru (>=0.5)"] -openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] -opentelemetry = ["opentelemetry-distro (>=0.35b0)"] -opentelemetry-experimental = ["opentelemetry-instrumentation-aio-pika (==0.46b0)", "opentelemetry-instrumentation-aiohttp-client (==0.46b0)", "opentelemetry-instrumentation-aiopg (==0.46b0)", "opentelemetry-instrumentation-asgi (==0.46b0)", "opentelemetry-instrumentation-asyncio (==0.46b0)", "opentelemetry-instrumentation-asyncpg (==0.46b0)", "opentelemetry-instrumentation-aws-lambda (==0.46b0)", "opentelemetry-instrumentation-boto (==0.46b0)", "opentelemetry-instrumentation-boto3sqs (==0.46b0)", "opentelemetry-instrumentation-botocore (==0.46b0)", "opentelemetry-instrumentation-cassandra (==0.46b0)", "opentelemetry-instrumentation-celery (==0.46b0)", "opentelemetry-instrumentation-confluent-kafka (==0.46b0)", "opentelemetry-instrumentation-dbapi (==0.46b0)", "opentelemetry-instrumentation-django (==0.46b0)", "opentelemetry-instrumentation-elasticsearch (==0.46b0)", "opentelemetry-instrumentation-falcon (==0.46b0)", "opentelemetry-instrumentation-fastapi (==0.46b0)", "opentelemetry-instrumentation-flask (==0.46b0)", "opentelemetry-instrumentation-grpc (==0.46b0)", "opentelemetry-instrumentation-httpx (==0.46b0)", "opentelemetry-instrumentation-jinja2 (==0.46b0)", "opentelemetry-instrumentation-kafka-python (==0.46b0)", "opentelemetry-instrumentation-logging (==0.46b0)", "opentelemetry-instrumentation-mysql (==0.46b0)", "opentelemetry-instrumentation-mysqlclient (==0.46b0)", "opentelemetry-instrumentation-pika (==0.46b0)", "opentelemetry-instrumentation-psycopg (==0.46b0)", "opentelemetry-instrumentation-psycopg2 (==0.46b0)", "opentelemetry-instrumentation-pymemcache (==0.46b0)", "opentelemetry-instrumentation-pymongo (==0.46b0)", "opentelemetry-instrumentation-pymysql (==0.46b0)", "opentelemetry-instrumentation-pyramid (==0.46b0)", "opentelemetry-instrumentation-redis (==0.46b0)", "opentelemetry-instrumentation-remoulade (==0.46b0)", "opentelemetry-instrumentation-requests (==0.46b0)", "opentelemetry-instrumentation-sklearn (==0.46b0)", "opentelemetry-instrumentation-sqlalchemy (==0.46b0)", "opentelemetry-instrumentation-sqlite3 (==0.46b0)", "opentelemetry-instrumentation-starlette (==0.46b0)", "opentelemetry-instrumentation-system-metrics (==0.46b0)", "opentelemetry-instrumentation-threading (==0.46b0)", "opentelemetry-instrumentation-tornado (==0.46b0)", "opentelemetry-instrumentation-tortoiseorm (==0.46b0)", "opentelemetry-instrumentation-urllib (==0.46b0)", "opentelemetry-instrumentation-urllib3 (==0.46b0)", "opentelemetry-instrumentation-wsgi (==0.46b0)"] -pure-eval = ["asttokens", "executing", "pure-eval"] -pymongo = ["pymongo (>=3.1)"] -pyspark = ["pyspark (>=2.4.4)"] -quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] -rq = ["rq (>=0.6)"] -sanic = ["sanic (>=0.8)"] -sqlalchemy = ["sqlalchemy (>=1.2)"] -starlette = ["starlette (>=0.19.1)"] -starlite = ["starlite (>=1.48)"] -tornado = ["tornado (>=6)"] - [[package]] name = "shellingham" version = "1.5.4" @@ -3693,29 +3029,15 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] -[[package]] -name = "tabulate" -version = "0.9.0" -description = "Pretty-print tabular data" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, - {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, -] - -[package.extras] -widechars = ["wcwidth"] - [[package]] name = "tenacity" -version = "8.4.2" +version = "8.5.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, - {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, ] [package.extras] @@ -3954,17 +3276,6 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" -[[package]] -name = "tzdata" -version = "2024.1" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, -] - [[package]] name = "urllib3" version = "2.2.2" @@ -4236,85 +3547,6 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] -[[package]] -name = "wrapt" -version = "1.16.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.6" -files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, -] - [[package]] name = "xmltodict" version = "0.13.0" @@ -4326,123 +3558,6 @@ files = [ {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, ] -[[package]] -name = "xxhash" -version = "3.4.1" -description = "Python binding for xxHash" -optional = false -python-versions = ">=3.7" -files = [ - {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, - {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, - {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, - {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, - {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, - {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, - {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, - {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, - {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, - {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, - {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, - {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, - {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, - {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, - {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, - {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, - {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, - {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, - {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, - {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, - {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, - {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, - {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, - {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, - {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, - {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, - {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, - {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, - {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, - {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, - {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, - {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, - {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, - {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, - {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, - {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, - {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, - {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, - {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, - {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, - {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, - {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, - {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, - {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, -] - [[package]] name = "yarl" version = "1.9.4" @@ -4564,4 +3679,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "340c6eb8b64b10904b917371fb0fff02d4a7e8a8059aa7ecf6d13188ec788f08" +content-hash = "63bbaef69e666b60c001dce67103eedd09741ec3ca7ba8003fcfb6a157e5116d" diff --git a/core-api/pyproject.toml b/core-api/pyproject.toml index ebaf9a6c9..14ade96c7 100644 --- a/core-api/pyproject.toml +++ b/core-api/pyproject.toml @@ -38,8 +38,7 @@ pytest-asyncio = "^0.23.6" pytest-dotenv = "^0.5.2" pytest-mock = "^3.14.0" moto = {extras = ["s3"], version = "^5.0.10"} -jsonlines = "^4.0.0" -deepeval = "^0.21.73" + [build-system] @@ -55,5 +54,4 @@ env_files = [ ] markers = [ "incremental: marks tests as incremental (deselect with '-m \"not incremental\"')", - "ai: marks tests as using a live LLM (deselect with '-m \"not ai\"')" ] \ No newline at end of file diff --git a/core-api/tests/conftest.py b/core-api/tests/conftest.py index 09123ceeb..1f4e55f09 100644 --- a/core-api/tests/conftest.py +++ b/core-api/tests/conftest.py @@ -66,7 +66,7 @@ def create_index(env, es_index): if not es.indices.exists(index=es_index): es.indices.create(index=es_index) yield - es.indices.delete(index=es_index) + es.indices.delete(index=es_index, ignore_unavailable=True) @pytest.fixture() diff --git a/core-api/tests/routes/test_chat.py b/core-api/tests/routes/test_chat.py index 362f424ae..05e608f70 100644 --- a/core-api/tests/routes/test_chat.py +++ b/core-api/tests/routes/test_chat.py @@ -1,27 +1,23 @@ import json -from types import SimpleNamespace from typing import TYPE_CHECKING -from unittest.mock import AsyncMock, MagicMock -from math import exp +from uuid import uuid4 +from jose import jwt +from langchain_elasticsearch import ElasticsearchStore import pytest -from core_api import dependencies, semantic_routes +from core_api import dependencies from core_api.app import app as application from core_api.routes.chat import chat_app from fastapi.testclient import TestClient -from langchain_community.llms.fake import FakeStreamingListLLM -from langchain_core.documents.base import Document -from langchain_core.messages import HumanMessage, SystemMessage -from langchain_core.prompt_values import ChatPromptValue -from langchain_core.runnables import Runnable, RunnableLambda -from langchain_core.runnables.schema import StreamEvent +from langchain_core.language_models.fake_chat_models import GenericFakeChatModel from starlette.websockets import WebSocketDisconnect +from redbox.models.chain import ChainInput from redbox.models.chat import ChatResponse, ChatRoute -from redbox.models.file import ChunkMetadata +from redbox.test.data import RedboxChatTestCase, generate_test_cases, TestData if TYPE_CHECKING: - from collections.abc import Iterable + pass system_chat = {"text": "test", "role": "system"} user_chat = {"text": "test", "role": "user"} @@ -29,152 +25,150 @@ RAG_LLM_RESPONSE = "Based on your documents the answer to your question is 7" UPLOADED_FILE_UUID = "9aa1aa15-dde0-471f-ab27-fd410612025b" -EXPECTED_AVAILABLE_ROUTES = ("chat", "search", "info") - - -def mock_chat_prompt(): - return ChatPromptValue( - messages=[ - SystemMessage(content="You are a helpful AI bot."), - HumanMessage(content="Hello, how are you doing?"), - ] - ) - - -def embedding_model_dim(embedding_model) -> int: - return len(embedding_model.embed_query("foo")) - - -def mock_get_llm(llm_responses): - def wrapped(): - return FakeStreamingListLLM(responses=llm_responses) - - return wrapped +EXPECTED_AVAILABLE_ROUTES = {"search"} + +TEST_CASES = [ + test_case + for generated_cases in [ + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData(0, 0, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat), + TestData(1, 100, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat), + TestData(10, 1200, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat), + ], + test_id="Basic Chat", + ), + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData( + 1, 1000, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat_with_docs + ), + TestData( + 1, 50000, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat_with_docs + ), + TestData( + 1, 200_000, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat_with_docs + ), + ], + test_id="Chat with single doc", + ), + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[uuid4(), uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData( + 2, + 40000, + expected_llm_response=["Map Response"] * 2 + ["Testing Response 1"], + expected_route=ChatRoute.chat_with_docs, + ), + TestData( + 2, + 100_000, + expected_llm_response=["Map Response"] * 2 + ["Testing Response 1"], + expected_route=ChatRoute.chat_with_docs, + ), + TestData( + 4, + 200_000, + expected_llm_response=["Map Response"] * 4 + ["Testing Response 1"], + expected_route=ChatRoute.chat_with_docs, + ), + ], + test_id="Chat with multiple docs", + ), + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData( + 2, + 200_000, + expected_llm_response=["Map Response"] * 2 + ["Testing Response 1"], + expected_route=ChatRoute.chat_with_docs, + ), + ], + test_id="Chat with large doc", + ), + ] + for test_case in generated_cases +] -def mock_parameterised_retriever(alice): - docs = [ - Document( - page_content="some text that doesn't actually matter " * 10, - metadata=ChunkMetadata( - parent_file_uuid=UPLOADED_FILE_UUID, - creator_user_uuid=alice, - index=i, - file_name="test_file", - page_number=1, - token_count=40, - ).model_dump() - | { - "score": 1 / (1 + exp(-i)), - }, - ) - for i in range(12) - ] - return RunnableLambda(lambda _: docs) - - -def mock_all_chunks_retriever(alice): - docs = [ - Document( - page_content="some text that doesn't actually matter ", - metadata=ChunkMetadata( - parent_file_uuid=UPLOADED_FILE_UUID, - creator_user_uuid=alice, - index=i, - file_name="test_file", - page_number=1, - token_count=10, - ).model_dump(), - ) - for i in range(6) - ] - return RunnableLambda(lambda _: docs) +@pytest.fixture(params=TEST_CASES, ids=[t.test_id for t in TEST_CASES]) +def test_case(request): + return request.param -@pytest.fixture(scope="session") -def mock_client(alice): - chat_app.dependency_overrides[dependencies.get_llm] = mock_get_llm([RAG_LLM_RESPONSE] * 32) - chat_app.dependency_overrides[dependencies.get_all_chunks_retriever] = lambda: mock_all_chunks_retriever(alice) - chat_app.dependency_overrides[dependencies.get_parameterised_retriever] = lambda: mock_parameterised_retriever( - alice +@pytest.fixture +def client(test_case: RedboxChatTestCase, embedding_model): + chat_app.dependency_overrides[dependencies.get_embedding_model] = lambda: embedding_model + chat_app.dependency_overrides[dependencies.get_llm] = lambda: GenericFakeChatModel( + messages=iter(test_case.test_data.expected_llm_response) ) yield TestClient(application) chat_app.dependency_overrides = {} -@pytest.fixture() -def mock_streaming_client(): - """ - This client mocks the retrieval pipeline to just produce events for astream_events. - This tests only the streaming functionality as no pipeline is run - """ - events: Iterable[StreamEvent] = [ - StreamEvent( - event="on_chat_model_stream", - name=f"event-{i}", - data={"chunk": SimpleNamespace(content=response_chunk)}, - run_id="run_id", - ) - for i, response_chunk in enumerate(RAG_LLM_RESPONSE.split(" ")) - ] - event_iterable = MagicMock(name="event_iterable") - event_iterable.__aiter__.return_value = events - astream_events = MagicMock(name="astream_events", return_value=event_iterable) - retrieval_chain = AsyncMock(spec=Runnable, name="retrieval_chain") - retrieval_chain.astream_events = astream_events - chat_app.dependency_overrides[semantic_routes.get_routable_chains] = lambda: {"retrieval": retrieval_chain} - yield TestClient(application) - chat_app.dependency_overrides = {} +@pytest.fixture +def uploaded_docs(test_case: RedboxChatTestCase, elasticsearch_store: ElasticsearchStore): + docs_ids = elasticsearch_store.add_documents(test_case.docs) + yield + if docs_ids: + elasticsearch_store.delete(docs_ids) -def test_rag(mock_client, headers): - response = mock_client.post( - "/chat/rag", - headers=headers, - json={ - "message_history": [{"text": "Who put the ram in the rama lama ding dong?", "role": "user"}], - "selected_files": [{"uuid": UPLOADED_FILE_UUID}], - }, - ) - assert response.status_code == 200, response.text - chat_response = ChatResponse.model_validate(response.json()) - assert chat_response.output_text == RAG_LLM_RESPONSE - assert ( - chat_response.route_name == ChatRoute.chat_with_docs - ), f"Expected route [{ChatRoute.chat_with_docs}] received [{chat_response.route_name}]" +@pytest.fixture +def query_headers(test_case: RedboxChatTestCase): + return {"Authorization": f"Bearer {jwt.encode({"user_uuid": str(test_case.query.user_uuid)}, key="nvjkernd")}"} -@pytest.mark.parametrize(("keyword"), EXPECTED_AVAILABLE_ROUTES) -def test_keywords(mock_client, headers, keyword): - """Given a history that should summarise, force retrieval.""" - response = mock_client.post( +def test_rag(test_case: RedboxChatTestCase, client, uploaded_docs, query_headers): + response = client.post( "/chat/rag", - headers=headers, + headers=query_headers, json={ "message_history": [ - {"text": f" @{keyword} Silly question", "role": "user"}, - ], - "selected_files": [{"uuid": UPLOADED_FILE_UUID}], + {"role": message.role, "text": message.text} for message in test_case.query.chat_history + ] + + [{"role": "user", "text": test_case.query.question}], + "selected_files": [{"uuid": str(file_uuid)} for file_uuid in test_case.query.file_uuids], }, ) - assert response.status_code == 200 + assert response.status_code == 200, response.text chat_response = ChatResponse.model_validate(response.json()) - assert chat_response.route_name.startswith( - keyword - ), f"Expected route to match keyword[{keyword}] received [{chat_response.route_name}]" + assert ( + chat_response.output_text == test_case.test_data.expected_llm_response[-1] + ), f"Expected response [{test_case.test_data.expected_llm_response}] received [{chat_response.output_text}]" + assert ( + chat_response.route_name == test_case.test_data.expected_route + ), f"Expected route [{test_case.test_data.expected_route}] received [{chat_response.route_name}]" + returned_document_texts = set([d.page_content for d in chat_response.source_documents]) + test_query_matching_document_texts = set([d.page_content for d in test_case.get_docs_matching_query()]) + unexpected_returned_documents = list( + filter( + lambda d: d.page_content in returned_document_texts - test_query_matching_document_texts, + chat_response.source_documents, + ) + ) + assert len(unexpected_returned_documents) == 0, f"Unexpected source docs in result {unexpected_returned_documents}" -def test_rag_chat_streamed(mock_client, headers): - # Given - message_history = [ - {"text": "What can I do for you?", "role": "system"}, - {"text": "Who put the ram in the rama lama ding dong?", "role": "user"}, - ] - selected_files = [{"uuid": UPLOADED_FILE_UUID}] - with mock_client.websocket_connect("/chat/rag", headers=headers) as websocket: +def test_rag_chat_streamed(test_case: RedboxChatTestCase, client, uploaded_docs, query_headers): + with client.websocket_connect("/chat/rag", headers=query_headers) as websocket: # When - websocket.send_text(json.dumps({"message_history": message_history, "selected_files": selected_files})) + websocket.send_text( + json.dumps( + { + "message_history": [ + {"role": message.role, "text": message.text} for message in test_case.query.chat_history + ] + + [{"role": "user", "text": test_case.query.question}], + "selected_files": [{"uuid": str(file_uuid)} for file_uuid in test_case.query.file_uuids], + } + ) + ) all_text, docs, route_name = [], [], "" while True: @@ -183,7 +177,7 @@ def test_rag_chat_streamed(mock_client, headers): if actual["resource_type"] == "text": all_text.append(actual["data"]) if actual["resource_type"] == "documents": - docs.append(actual["data"]) + docs.extend(actual["data"]) if actual["resource_type"] == "route_name": route_name = actual["data"] except WebSocketDisconnect: @@ -191,16 +185,28 @@ def test_rag_chat_streamed(mock_client, headers): # Then text = "".join(all_text) - assert text == RAG_LLM_RESPONSE - assert route_name == ChatRoute.chat_with_docs + assert ( + text == test_case.test_data.expected_llm_response[-1] + ), f"Expected response [{test_case.test_data.expected_llm_response}] received [{text}]" + assert ( + route_name == test_case.test_data.expected_route + ), f"Expected route [{test_case.test_data.expected_route}] received [{route_name}]" + returned_document_texts = set([d["page_content"] for d in docs]) + test_query_matching_document_texts = set([d.page_content for d in test_case.get_docs_matching_query()]) + unexpected_returned_documents = list( + filter(lambda d: d["page_content"] in returned_document_texts - test_query_matching_document_texts, docs) + ) + assert ( + len(unexpected_returned_documents) == 0 + ), f"Unexpected source docs in result {unexpected_returned_documents}" -def test_available_tools(mock_client, headers): - response = mock_client.get("/chat/tools", headers=headers) +def test_available_tools(client, query_headers): + response = client.get("/chat/tools", headers=query_headers) assert response.status_code == 200 tool_definitions = response.json() assert len(tool_definitions) > 0 - assert set(EXPECTED_AVAILABLE_ROUTES).issubset({item["name"] for item in tool_definitions}) + assert EXPECTED_AVAILABLE_ROUTES == {item["name"] for item in tool_definitions} for tool_definition in tool_definitions: assert "name" in tool_definition assert "description" in tool_definition diff --git a/core-api/tests/test_runnables.py b/core-api/tests/test_runnables.py deleted file mode 100644 index 6e6e3734b..000000000 --- a/core-api/tests/test_runnables.py +++ /dev/null @@ -1,161 +0,0 @@ -import pytest -from core_api.build_chains import ( - build_chat_chain, - build_chat_with_docs_chain, - build_condense_retrieval_chain, - build_retrieval_chain, -) -from core_api.dependencies import get_parameterised_retriever, get_tokeniser - -from redbox.api.runnables import make_chat_prompt_from_messages_runnable -from redbox.models.chain import ChainInput -from redbox.models.chat import ChatRoute -from redbox.models.errors import AIError - - -@pytest.fixture(scope="module", autouse=True) -def mock_embeddings(session_mocker, embedding_model): - session_mocker.patch("core_api.dependencies.get_embedding_model", return_value=embedding_model) - return embedding_model - - -def test_make_chat_prompt_from_messages_runnable(mock_llm): - chain = ( - make_chat_prompt_from_messages_runnable( - system_prompt="Your job is chat.", - question_prompt="{question}\n=========\n Response: ", - input_token_budget=100, - tokeniser=get_tokeniser(), - ) - | mock_llm - ) - - # Handles a normal call - response = chain.invoke( - input={ - "question": "Lorem ipsum dolor sit amet.", - "chat_history": [], - } - ) - - assert response == "<>" - - # Handles a long question - with pytest.raises(AIError): - response = chain.invoke( - input={ - "question": "".join(["Lorem ipsum dolor sit amet. "] * 200), - "chat_history": [], - } - ) - - # Handles a long history - response = chain.invoke( - input={ - "question": "Lorem ipsum dolor sit amet.", - "chat_history": [ - {"text": str(i), "role": "user"} if i % 2 == 0 else {"text": str(i), "role": "ai"} for i in range(100) - ], - } - ) - - assert response == "<>" - - -def test_rag_runnable(mock_llm, chunked_file, env): - retriever = get_parameterised_retriever( - env=env, - ) - - chain = build_retrieval_chain(llm=mock_llm, retriever=retriever, tokeniser=get_tokeniser(), env=env) - - previous_history = [ - {"text": "Lorem ipsum dolor sit amet.", "role": "user"}, - {"text": "Consectetur adipiscing elit.", "role": "ai"}, - {"text": "Donec cursus nunc tortor.", "role": "user"}, - ] - - response = chain.invoke( - input=ChainInput( - question="Who are all these people?", - chat_history=previous_history, - file_uuids=[str(chunked_file.uuid)], - user_uuid=str(chunked_file.creator_user_uuid), - ).dict() - ) - - assert response["response"] == "<>" - assert {str(chunked_file.uuid)} == {chunk.metadata["parent_file_uuid"] for chunk in response["source_documents"]} - - -def test_condense_runnable(mock_llm, chunked_file, env): - retriever = get_parameterised_retriever(env=env) - - chain = build_condense_retrieval_chain(llm=mock_llm, retriever=retriever, tokeniser=get_tokeniser(), env=env) - - previous_history = [ - {"text": "Lorem ipsum dolor sit amet.", "role": "user"}, - {"text": "Consectetur adipiscing elit.", "role": "ai"}, - {"text": "Donec cursus nunc tortor.", "role": "user"}, - ] - - response = chain.invoke( - input=ChainInput( - question="Who are all these people?", - chat_history=previous_history, - file_uuids=[str(chunked_file.uuid)], - user_uuid=str(chunked_file.creator_user_uuid), - ).dict() - ) - assert response["response"] == "<>" - assert response["route_name"].startswith("search") - all_results_file_uuids = {chunk.metadata["parent_file_uuid"] for chunk in response["source_documents"]} - assert { - str(chunked_file.uuid) - } == all_results_file_uuids, f"Expected {str(chunked_file.uuid)} in {all_results_file_uuids}" - - -def test_chat_runnable(mock_llm, chunked_file, env): - chain = build_chat_chain(llm=mock_llm, tokeniser=get_tokeniser(), env=env) - - previous_history = [ - {"text": "Lorem ipsum dolor sit amet.", "role": "user"}, - {"text": "Consectetur adipiscing elit.", "role": "ai"}, - {"text": "Donec cursus nunc tortor.", "role": "user"}, - ] - - response = chain.invoke( - input=ChainInput( - question="Who are all these people?", - chat_history=previous_history, - file_uuids=[str(chunked_file.uuid)], - user_uuid=str(chunked_file.creator_user_uuid), - ).dict() - ) - - assert response["response"] == "<>" - assert response["route_name"] == ChatRoute.chat - - -def test_chat_with_documents_runnable(all_chunks_retriever, mock_llm, chunked_file, env): - chain = build_chat_with_docs_chain( - llm=mock_llm, all_chunks_retriever=all_chunks_retriever, tokeniser=get_tokeniser(), env=env - ) - - previous_history = [ - {"text": "Lorem ipsum dolor sit amet.", "role": "user"}, - {"text": "Consectetur adipiscing elit.", "role": "ai"}, - {"text": "Donec cursus nunc tortor.", "role": "user"}, - ] - - response = chain.invoke( - input=ChainInput( - question="Who are all these people?", - chat_history=previous_history, - file_uuids=[str(chunked_file.uuid)], - user_uuid=str(chunked_file.creator_user_uuid), - ).dict() - ) - - assert response["response"] == "<>" - assert response["route_name"] == ChatRoute.chat_with_docs diff --git a/notebooks/langgraph.ipynb b/notebooks/langgraph.ipynb new file mode 100644 index 000000000..571f68a73 --- /dev/null +++ b/notebooks/langgraph.ipynb @@ -0,0 +1,118 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from redbox.graph.root import get_redbox_graph, run_redbox\n", + "from redbox.graph.chat import get_chat_with_docs_graph\n", + "from redbox.chains import components\n", + "from redbox.models.settings import Settings\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "app = get_redbox_graph()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import Image, display\n", + "from langchain_core.runnables.graph import CurveStyle, MermaidDrawMethod, NodeStyles\n", + "\n", + "display(\n", + " Image(\n", + " app.get_graph().draw_mermaid_png(\n", + " draw_method=MermaidDrawMethod.API,\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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JYluQivOw98P7V87Io43RGDeNmzi50jyGtOwdylXOqP1zYyGifCSwerJNPZrMYK7pmbCGxhaL7jq9nvccre1awEsYW7+Wem46q8EBERBGKu2I4gWajNmwZemb3IN/wCehcyOR3o8pskA/wDIpOoxYb33iRR5QeXH4ucyHbpvPLEGdfyV5On5FJ10Yv5ZnbbX9O1lkREXOgiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiIC0Gbx1ink4s5joe3tRxdharA7OswAlwDT5u0Y4kt36Hme07c3M3fos6Kpom8Kj2Qx2muJ+npaWRpUs/iJXN7alegEjQ9pDg2SJ43a5p2PK4Ag+8FGB4NnCcb7cN9LDfz/5og+apdltIYvMW++SQvr3wAO+05n15iB5gXsILgOvku3HU9OpWD4kTN6M1PnmNHmHeI3f8XRk/wDFbcnCq2VW+cePEGprMHwI4caZy1bKYjQmnsZkqzueC3UxsMcsTttt2uDdwdifMp2ov4k2PWrPfvofok8SbHrVnv30P0SZvD4+0lo3pQionwmMhnuEnAzVersHqjLPyuMgjkgFt0T4iXTRsPM0Rgno4++rDxGk7d7E0rMmqs72k0DJHcssIG5aCdvrX40zeHx9pLRvTNVxJ4N3CmV7nv4caWc9xJLjiYCSfT9it/4k2PWrPfvofok8SbHrVnv30P0SZvD4+0lo3o+7wbOFDnEu4b6Wc49STiYCT/8ApUuyGZoaZgq4+vE19oxiOni62we9regDW/1WDpu47NaPOVg+IzpAGzajz0zPfb3tse/9sbGn/cVtcLpvG6eZIKFURPl2Msz3OkllI8xfI4lzv7SUthU65m/+3/Y1OrTmGlxkVmxceyXJ3pO3tSR78gdyhoYzfryNa0AenqdgXFbhEWmqqa5vKCIixBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQUR4dH3KHEL81g+UxK5tOfa9i/wA1i/uBUz4dH3KHEL81g+UxK5tOfa9i/wA1i/uBBsUREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBER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xOGTJlEM3w4ucWKWOt6squ0bqPD2ny4vJaWzLp7Fdr2BryJH12DZ43a6NzHNIaD+TPw/ByhjM5pnMWc7nc1k8A282CzlLTJnTd67PtO08gdG9k3lDOUDr0PvSDxzrfgzPfElv6JPHOt+DM98SW/okzFfDJkyhd3wd8DY7Warl83isp7vWtQwZSjYibYq2LDOSZjOaMtMbm9OV7XH8a41/Bv0zDozVGmZMhm7VDUN1mTszWLvPYiuN7M94il5eZry+GN/XdocOgA8lSfPcU8FpXEWcrmm5PE4ysA6e7exVmGGIEgAue6MAdSB1PnIWbFrinNGySPHZx8bwHNc3CWyCD5iD2aZivhlcmdyNRQa+0ZXixOHx1XWVKFpIzGo9RGvdlc4lxD2RUXM2G+wIPmA6LGznDK3xVhxOT1PHNonVGGsSnH5DSuYM8scT2tD2mSSuwFr9tnMdG4eQ079ekw8c634Mz3xJb+iTxzrfgzPfElv6JMxicMpkygVbwaNO1cBNQbmtQHIOzcmoYc6bjPdCtcfGI3uZII+Xlc0EFrmuBDiCNttslng46Vk0llcLdnyuSt5O/HlbOes3P8AOTrkfL2U7ZmhoY6MNaGhrQ0AbbbE7zTxzrfgzPfElv6JPHOt+DM98SW/okzFfCuTO5Em8Ephhn0ncRtcvtOsx2Rkjk4u3ZyMcwRgCHs+Qh5JaWHchpPVoUq4faDxnDXSdPT2INh9Os6STtbcvaTSySSOkkke733Oe9zj0A69AB0XPxzrfgzPfElv6JcmauilPLFic7JJ7zDiLEe//mexrR/aQmZrj8qWln8PP9M1b+mP/paymKj+jMNZxNG3Nda2O7kLLrc0TCHCIlrWtZzDzkNY0E+nfbopAuD1FUVYkzHLtBIiIudBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERBRHh0fcocQvzWD5TErm059r2L/ADWL+4FTPh0fcocQvzWD5TErm059r2L/ADWL+4EGxREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERBRHh0fcocQvzWD5TErm059r2L/NYv7gVM+HR9yhxC/NYPlMSubTn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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "\n", + "\n", + "env = Settings()\n", + "chat_graph = get_chat_with_docs_graph(\n", + " llm=components.get_chat_llm(env),\n", + " all_chunks_retriever=components.get_all_chunks_retriever(env),\n", + " tokeniser=components.get_tokeniser(),\n", + " env=env\n", + ")\n", + "display(\n", + " Image(\n", + " chat_graph.get_graph().draw_mermaid_png(\n", + " draw_method=MermaidDrawMethod.API,\n", + " )\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/summarise.ipynb b/notebooks/summarise.ipynb index 4e5155bb2..4f1217071 100644 --- a/notebooks/summarise.ipynb +++ b/notebooks/summarise.ipynb @@ -355,7 +355,7 @@ " @chain\n", " def map_operation(input_dict):\n", " system_map_prompt = env.ai.map_system_prompt\n", - " prompt_template = PromptTemplate.from_template(env.ai.map_question_prompt)\n", + " prompt_template = PromptTemplate.from_template(env.ai.chat_map_question_prompt)\n", "\n", " formatted_map_question_prompt = prompt_template.format(question=input_dict[\"question\"])\n", "\n", diff --git a/redbox-core/.vscode/settings.json b/redbox-core/.vscode/settings.json index dad2768a3..cf3112f71 100644 --- a/redbox-core/.vscode/settings.json +++ b/redbox-core/.vscode/settings.json @@ -10,7 +10,8 @@ "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, "python.testing.pytestArgs": [ - "." + ".", + "-m not ( ai )" ], "python.testing.pytestPath": "venv/bin/python -m pytest" } \ No newline at end of file diff --git a/redbox-core/poetry.lock b/redbox-core/poetry.lock index a45a97977..42029fd46 100644 --- a/redbox-core/poetry.lock +++ b/redbox-core/poetry.lock @@ -140,6 +140,17 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + [[package]] name = "attrs" version = "23.2.0" @@ -371,6 +382,20 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -495,6 +520,136 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "dataclasses-json" +version = "0.6.7" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, + {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "datasets" +version = "2.20.0" +description = "HuggingFace community-driven open-source library of datasets" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "datasets-2.20.0-py3-none-any.whl", hash = "sha256:76ac02e3bdfff824492e20678f0b6b1b6d080515957fe834b00c2ba8d6b18e5e"}, + {file = "datasets-2.20.0.tar.gz", hash = "sha256:3c4dbcd27e0f642b9d41d20ff2efa721a5e04b32b2ca4009e0fc9139e324553f"}, +] + +[package.dependencies] +aiohttp = "*" +dill = ">=0.3.0,<0.3.9" +filelock = "*" +fsspec = {version = ">=2023.1.0,<=2024.5.0", extras = ["http"]} +huggingface-hub = ">=0.21.2" +multiprocess = "*" +numpy = ">=1.17" +packaging = "*" +pandas = "*" +pyarrow = ">=15.0.0" +pyarrow-hotfix = "*" +pyyaml = ">=5.1" +requests = ">=2.32.2" +tqdm = ">=4.66.3" +xxhash = "*" + +[package.extras] +apache-beam = ["apache-beam (>=2.26.0)"] +audio = ["librosa", "soundfile (>=0.12.1)"] +benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] +dev = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"] +jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"] +metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] +quality = ["ruff (>=0.3.0)"] +s3 = ["s3fs"] +tensorflow = ["tensorflow (>=2.6.0)"] +tensorflow-gpu = ["tensorflow (>=2.6.0)"] +tests = ["Pillow (>=9.4.0)", "absl-py", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "jax (>=0.3.14)", "jaxlib (>=0.3.14)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.6.0)", "tiktoken", "torch (>=2.0.0)", "transformers", "typing-extensions (>=4.6.1)", "zstandard"] +torch = ["torch"] +vision = ["Pillow (>=9.4.0)"] + +[[package]] +name = "deepeval" +version = "0.21.73" +description = "The open-source evaluation framework for LLMs." +optional = false +python-versions = "*" +files = [ + {file = "deepeval-0.21.73-py3-none-any.whl", hash = "sha256:e8b52d3a989c9393f77fe1cebb5532df49377badcf2dbfc73d0da2903331ebb0"}, + {file = "deepeval-0.21.73.tar.gz", hash = "sha256:290844565ad7bb36a66b87516f5b1f9820c1e181e4abcff314560a91e5fbe8e9"}, +] + +[package.dependencies] +docx2txt = ">=0.8,<1.0" +grpcio = "1.63.0" +importlib-metadata = ">=6.0.2" +langchain = "*" +langchain-core = "*" +langchain-openai = "*" +opentelemetry-api = "1.24.0" +opentelemetry-exporter-otlp-proto-grpc = "1.24.0" +opentelemetry-sdk = "1.24.0" +portalocker = "*" +protobuf = "4.25.1" +pydantic = "*" +pytest = "*" +pytest-repeat = "*" +pytest-xdist = "*" +ragas = "*" +requests = "*" +rich = "*" +sentry-sdk = "*" +tabulate = "*" +tenacity = ">=8.4.1,<8.5.0" +tqdm = "*" +typer = "*" + +[package.extras] +dev = ["black"] + +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + [[package]] name = "distro" version = "1.9.0" @@ -506,6 +661,16 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "docx2txt" +version = "0.8" +description = "A pure python-based utility to extract text and images from docx files." +optional = false +python-versions = "*" +files = [ + {file = "docx2txt-0.8.tar.gz", hash = "sha256:2c06d98d7cfe2d3947e5760a57d924e3ff07745b379c8737723922e7009236e5"}, +] + [[package]] name = "elastic-transport" version = "8.13.1" @@ -546,6 +711,36 @@ orjson = ["orjson (>=3)"] requests = ["requests (>=2.4.0,!=2.32.2,<3.0.0)"] vectorstore-mmr = ["numpy (>=1)", "simsimd (>=3)"] +[[package]] +name = "execnet" +version = "2.1.1" +description = "execnet: rapid multi-Python deployment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, +] + +[package.extras] +testing = ["hatch", "pre-commit", "pytest", "tox"] + +[[package]] +name = "filelock" +version = "3.15.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] + [[package]] name = "frozenlist" version = "1.4.1" @@ -632,6 +827,64 @@ files = [ {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] +[[package]] +name = "fsspec" +version = "2024.5.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, +] + +[package.dependencies] +aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "googleapis-common-protos" +version = "1.63.2" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, +] + +[package.dependencies] +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + [[package]] name = "greenlet" version = "3.0.3" @@ -703,6 +956,64 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "grpcio" +version = "1.63.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, + {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, + {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, + {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, + {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, + {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, + {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, + {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, + {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, + {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, + {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, + {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, + {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, + {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, + {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, + {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, + {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, + {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, + {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, + {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, + {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.63.0)"] + [[package]] name = "h11" version = "0.14.0" @@ -759,6 +1070,40 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +[[package]] +name = "huggingface-hub" +version = "0.24.3" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.24.3-py3-none-any.whl", hash = "sha256:69ecce486dd6cdad69937ba76779e893c224a670a9d947636c1d5cbd049e44d8"}, + {file = "huggingface_hub-0.24.3.tar.gz", hash = "sha256:bfdc05cc9b64a0e24e8614a44222698799183268f6b68be209aa2df70cff2cde"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + [[package]] name = "idna" version = "3.7" @@ -770,6 +1115,25 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "importlib-metadata" +version = "7.0.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, + {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -809,6 +1173,20 @@ files = [ {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] +[[package]] +name = "jsonlines" +version = "4.0.0" +description = "Library with helpers for the jsonlines file format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55"}, + {file = "jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + [[package]] name = "jsonpatch" version = "1.33" @@ -876,6 +1254,29 @@ requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" +[[package]] +name = "langchain-community" +version = "0.2.10" +description = "Community contributed LangChain integrations." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_community-0.2.10-py3-none-any.whl", hash = "sha256:9f4d1b5ab7f0b0a704f538e26e50fce45a461da6d2bf6b7b636d24f22fbc088a"}, + {file = "langchain_community-0.2.10.tar.gz", hash = "sha256:3a0404bad4bd07d6f86affdb62fb3d080a456c66191754d586a409d9d6024d62"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain = ">=0.2.9,<0.3.0" +langchain-core = ">=0.2.23,<0.3.0" +langsmith = ">=0.1.0,<0.2.0" +numpy = {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""} +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" + [[package]] name = "langchain-core" version = "0.2.24" @@ -943,15 +1344,29 @@ files = [ [package.dependencies] langchain-core = ">=0.2.10,<0.3.0" +[[package]] +name = "langgraph" +version = "0.1.16" +description = "Building stateful, multi-actor applications with LLMs" +optional = false +python-versions = "<4.0,>=3.9.0" +files = [ + {file = "langgraph-0.1.16-py3-none-any.whl", hash = "sha256:ad7fcba28ce81dde7c43b54e7ba098093c3827b84de5183d2e450c1789bb6e60"}, + {file = "langgraph-0.1.16.tar.gz", hash = "sha256:cd90f5691a8e7f4e523fd73e74b2ddd73051cb452ff17195f9cd5141ce1c2095"}, +] + +[package.dependencies] +langchain-core = ">=0.2.22,<0.3" + [[package]] name = "langsmith" -version = "0.1.93" +version = "0.1.94" 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.93-py3-none-any.whl", hash = "sha256:811210b9d5f108f36431bd7b997eb9476a9ecf5a2abd7ddbb606c1cdcf0f43ce"}, - {file = "langsmith-0.1.93.tar.gz", hash = "sha256:285b6ad3a54f50fa8eb97b5f600acc57d0e37e139dd8cf2111a117d0435ba9b4"}, + {file = "langsmith-0.1.94-py3-none-any.whl", hash = "sha256:0d01212086d58699f75814117b026784218042f7859877ce08a248a98d84aa8d"}, + {file = "langsmith-0.1.94.tar.gz", hash = "sha256:e44afcdc9eee6f238f6a87a02bba83111bd5fad376d881ae299834e06d39d712"}, ] [package.dependencies] @@ -962,6 +1377,30 @@ pydantic = [ ] requests = ">=2,<3" +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.5" @@ -1031,6 +1470,36 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "marshmallow" +version = "3.21.3" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "moto" version = "5.0.11" @@ -1174,6 +1643,52 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] +[[package]] +name = "multiprocess" +version = "0.70.16" +description = "better multiprocessing and multithreading in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, + {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37b55f71c07e2d741374998c043b9520b626a8dddc8b3129222ca4f1a06ef67a"}, + {file = "multiprocess-0.70.16-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba8c31889abf4511c7308a8c52bb4a30b9d590e7f58523302ba00237702ca054"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:0dfd078c306e08d46d7a8d06fb120313d87aa43af60d66da43ffff40b44d2f41"}, + {file = "multiprocess-0.70.16-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e7b9d0f307cd9bd50851afaac0dba2cb6c44449efff697df7c7645f7d3f2be3a"}, + {file = "multiprocess-0.70.16-py310-none-any.whl", hash = "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02"}, + {file = "multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a"}, + {file = "multiprocess-0.70.16-py312-none-any.whl", hash = "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e"}, + {file = "multiprocess-0.70.16-py38-none-any.whl", hash = "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435"}, + {file = "multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3"}, + {file = "multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1"}, +] + +[package.dependencies] +dill = ">=0.3.8" + +[[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 = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + [[package]] name = "numpy" version = "1.26.4" @@ -1221,13 +1736,13 @@ files = [ [[package]] name = "openai" -version = "1.36.1" +version = "1.37.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.36.1-py3-none-any.whl", hash = "sha256:d399b9d476dbbc167aceaac6bc6ed0b2e2bb6c9e189c7f7047f822743ae62e64"}, - {file = "openai-1.36.1.tar.gz", hash = "sha256:41be9e0302e95dba8a9374b885c5cb1cec2202816a70b98736fee25a2cadd1f2"}, + {file = "openai-1.37.1-py3-none-any.whl", hash = "sha256:9a6adda0d6ae8fce02d235c5671c399cfa40d6a281b3628914c7ebf244888ee3"}, + {file = "openai-1.37.1.tar.gz", hash = "sha256:faf87206785a6b5d9e34555d6a3242482a6852bc802e453e2a891f68ee04ce55"}, ] [package.dependencies] @@ -1242,6 +1757,99 @@ typing-extensions = ">=4.7,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] +[[package]] +name = "opentelemetry-api" +version = "1.24.0" +description = "OpenTelemetry Python API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_api-1.24.0-py3-none-any.whl", hash = "sha256:0f2c363d98d10d1ce93330015ca7fd3a65f60be64e05e30f557c61de52c80ca2"}, + {file = "opentelemetry_api-1.24.0.tar.gz", hash = "sha256:42719f10ce7b5a9a73b10a4baf620574fb8ad495a9cbe5c18d76b75d8689c67e"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +importlib-metadata = ">=6.0,<=7.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.24.0" +description = "OpenTelemetry Protobuf encoding" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.24.0-py3-none-any.whl", hash = "sha256:e51f2c9735054d598ad2df5d3eca830fecfb5b0bda0a2fa742c9c7718e12f641"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.24.0.tar.gz", hash = "sha256:5d31fa1ff976cacc38be1ec4e3279a3f88435c75b38b1f7a099a1faffc302461"}, +] + +[package.dependencies] +opentelemetry-proto = "1.24.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.24.0" +description = "OpenTelemetry Collector Protobuf over gRPC Exporter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0-py3-none-any.whl", hash = "sha256:f40d62aa30a0a43cc1657428e59fcf82ad5f7ea8fff75de0f9d9cb6f739e0a3b"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.24.0.tar.gz", hash = "sha256:217c6e30634f2c9797999ea9da29f7300479a94a610139b9df17433f915e7baa"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +googleapis-common-protos = ">=1.52,<2.0" +grpcio = ">=1.0.0,<2.0.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.24.0" +opentelemetry-proto = "1.24.0" +opentelemetry-sdk = ">=1.24.0,<1.25.0" + +[package.extras] +test = ["pytest-grpc"] + +[[package]] +name = "opentelemetry-proto" +version = "1.24.0" +description = "OpenTelemetry Python Proto" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_proto-1.24.0-py3-none-any.whl", hash = "sha256:bcb80e1e78a003040db71ccf83f2ad2019273d1e0828089d183b18a1476527ce"}, + {file = "opentelemetry_proto-1.24.0.tar.gz", hash = "sha256:ff551b8ad63c6cabb1845ce217a6709358dfaba0f75ea1fa21a61ceddc78cab8"}, +] + +[package.dependencies] +protobuf = ">=3.19,<5.0" + +[[package]] +name = "opentelemetry-sdk" +version = "1.24.0" +description = "OpenTelemetry Python SDK" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_sdk-1.24.0-py3-none-any.whl", hash = "sha256:fa731e24efe832e98bcd90902085b359dcfef7d9c9c00eb5b9a18587dae3eb59"}, + {file = "opentelemetry_sdk-1.24.0.tar.gz", hash = "sha256:75bc0563affffa827700e0f4f4a68e1e257db0df13372344aebc6f8a64cde2e5"}, +] + +[package.dependencies] +opentelemetry-api = "1.24.0" +opentelemetry-semantic-conventions = "0.45b0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.45b0" +description = "OpenTelemetry Semantic Conventions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_semantic_conventions-0.45b0-py3-none-any.whl", hash = "sha256:a4a6fb9a7bacd9167c082aa4681009e9acdbfa28ffb2387af50c2fef3d30c864"}, + {file = "opentelemetry_semantic_conventions-0.45b0.tar.gz", hash = "sha256:7c84215a44ac846bc4b8e32d5e78935c5c43482e491812a0bb8aaf87e4d92118"}, +] + [[package]] name = "orjson" version = "3.10.6" @@ -1313,6 +1921,75 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + [[package]] name = "pluggy" version = "1.5.0" @@ -1328,6 +2005,94 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "portalocker" +version = "2.10.1" +description = "Wraps the portalocker recipe for easy usage" +optional = false +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, + {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + +[[package]] +name = "protobuf" +version = "4.25.1" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.1-cp310-abi3-win32.whl", hash = "sha256:193f50a6ab78a970c9b4f148e7c750cfde64f59815e86f686c22e26b4fe01ce7"}, + {file = "protobuf-4.25.1-cp310-abi3-win_amd64.whl", hash = "sha256:3497c1af9f2526962f09329fd61a36566305e6c72da2590ae0d7d1322818843b"}, + {file = "protobuf-4.25.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:0bf384e75b92c42830c0a679b0cd4d6e2b36ae0cf3dbb1e1dfdda48a244f4bcd"}, + {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:0f881b589ff449bf0b931a711926e9ddaad3b35089cc039ce1af50b21a4ae8cb"}, + {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ca37bf6a6d0046272c152eea90d2e4ef34593aaa32e8873fc14c16440f22d4b7"}, + {file = "protobuf-4.25.1-cp38-cp38-win32.whl", hash = "sha256:abc0525ae2689a8000837729eef7883b9391cd6aa7950249dcf5a4ede230d5dd"}, + {file = "protobuf-4.25.1-cp38-cp38-win_amd64.whl", hash = "sha256:1484f9e692091450e7edf418c939e15bfc8fc68856e36ce399aed6889dae8bb0"}, + {file = "protobuf-4.25.1-cp39-cp39-win32.whl", hash = "sha256:8bdbeaddaac52d15c6dce38c71b03038ef7772b977847eb6d374fc86636fa510"}, + {file = "protobuf-4.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:becc576b7e6b553d22cbdf418686ee4daa443d7217999125c045ad56322dda10"}, + {file = "protobuf-4.25.1-py3-none-any.whl", hash = "sha256:a19731d5e83ae4737bb2a089605e636077ac001d18781b3cf489b9546c7c80d6"}, + {file = "protobuf-4.25.1.tar.gz", hash = "sha256:57d65074b4f5baa4ab5da1605c02be90ac20c8b40fb137d6a8df9f416b0d0ce2"}, +] + +[[package]] +name = "pyarrow" +version = "17.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, + {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"}, + {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, + {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, + {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] + +[[package]] +name = "pyarrow-hotfix" +version = "0.6" +description = "" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pyarrow_hotfix-0.6-py3-none-any.whl", hash = "sha256:dcc9ae2d220dff0083be6a9aa8e0cdee5182ad358d4931fce825c545e5c89178"}, + {file = "pyarrow_hotfix-0.6.tar.gz", hash = "sha256:79d3e030f7ff890d408a100ac16d6f00b14d44a502d7897cd9fc3e3a534e9945"}, +] + [[package]] name = "pycparser" version = "2.22" @@ -1461,13 +2226,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.3.4" +version = "2.4.0" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.3.4-py3-none-any.whl", hash = "sha256:11ad8bacb68a045f00e4f862c7a718c8a9ec766aa8fd4c32e39a0594b207b53a"}, - {file = "pydantic_settings-2.3.4.tar.gz", hash = "sha256:c5802e3d62b78e82522319bbc9b8f8ffb28ad1c988a99311d04f2a6051fca0a7"}, + {file = "pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315"}, + {file = "pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88"}, ] [package.dependencies] @@ -1475,9 +2240,34 @@ pydantic = ">=2.7.0" python-dotenv = ">=0.21.0" [package.extras] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pysbd" +version = "0.3.4" +description = "pysbd (Python Sentence Boundary Disambiguation) is a rule-based sentence boundary detection that works out-of-the-box across many languages." +optional = false +python-versions = ">=3" +files = [ + {file = "pysbd-0.3.4-py3-none-any.whl", hash = "sha256:cd838939b7b0b185fcf86b0baf6636667dfb6e474743beeff878e9f42e022953"}, +] + [[package]] name = "pytest" version = "8.3.2" @@ -1498,6 +2288,24 @@ pluggy = ">=1.5,<2" [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "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-cov" version = "5.0.0" @@ -1531,6 +2339,40 @@ files = [ pytest = ">=5.0.0" python-dotenv = ">=0.9.1" +[[package]] +name = "pytest-repeat" +version = "0.9.3" +description = "pytest plugin for repeating tests" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest_repeat-0.9.3-py3-none-any.whl", hash = "sha256:26ab2df18226af9d5ce441c858f273121e92ff55f5bb311d25755b8d7abdd8ed"}, + {file = "pytest_repeat-0.9.3.tar.gz", hash = "sha256:ffd3836dfcd67bb270bec648b330e20be37d2966448c4148c4092d1e8aba8185"}, +] + +[package.dependencies] +pytest = "*" + +[[package]] +name = "pytest-xdist" +version = "3.6.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, +] + +[package.dependencies] +execnet = ">=2.1" +pytest = ">=7.0.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1559,6 +2401,40 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -1619,92 +2495,119 @@ files = [ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "ragas" +version = "0.1.11" +description = "" +optional = false +python-versions = "*" +files = [ + {file = "ragas-0.1.11-py3-none-any.whl", hash = "sha256:fda210ffe8e0a4812a67a7067f89742aae6a458db111dff363d8dc73f83ff5d6"}, + {file = "ragas-0.1.11.tar.gz", hash = "sha256:028b11f614b4314def607cf980e6590c6ac491ab036d399e73db2eb1461facc6"}, +] + +[package.dependencies] +appdirs = "*" +datasets = "*" +langchain = "*" +langchain-community = "*" +langchain-core = "*" +langchain-openai = "*" +nest-asyncio = "*" +numpy = "*" +openai = ">1" +pysbd = ">=0.3.4" +tiktoken = "*" + +[package.extras] +all = ["sentence-transformers"] + [[package]] name = "regex" -version = "2024.5.15" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] @@ -1747,6 +2650,24 @@ urllib3 = ">=1.25.10,<3.0" [package.extras] tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"] +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "s3transfer" version = "0.10.2" @@ -1806,6 +2727,67 @@ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodest doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "sentry-sdk" +version = "2.11.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.11.0-py2.py3-none-any.whl", hash = "sha256:d964710e2dbe015d9dc4ff0ad16225d68c3b36936b742a6fe0504565b760a3b7"}, + {file = "sentry_sdk-2.11.0.tar.gz", hash = "sha256:4ca16e9f5c7c6bc2fb2d5c956219f4926b148e511fffdbbde711dc94f1e0468f"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-instrumentation-aio-pika (==0.46b0)", "opentelemetry-instrumentation-aiohttp-client (==0.46b0)", "opentelemetry-instrumentation-aiopg (==0.46b0)", "opentelemetry-instrumentation-asgi (==0.46b0)", "opentelemetry-instrumentation-asyncio (==0.46b0)", "opentelemetry-instrumentation-asyncpg (==0.46b0)", "opentelemetry-instrumentation-aws-lambda (==0.46b0)", "opentelemetry-instrumentation-boto (==0.46b0)", "opentelemetry-instrumentation-boto3sqs (==0.46b0)", "opentelemetry-instrumentation-botocore (==0.46b0)", "opentelemetry-instrumentation-cassandra (==0.46b0)", "opentelemetry-instrumentation-celery (==0.46b0)", "opentelemetry-instrumentation-confluent-kafka (==0.46b0)", "opentelemetry-instrumentation-dbapi (==0.46b0)", "opentelemetry-instrumentation-django (==0.46b0)", "opentelemetry-instrumentation-elasticsearch (==0.46b0)", "opentelemetry-instrumentation-falcon (==0.46b0)", "opentelemetry-instrumentation-fastapi (==0.46b0)", "opentelemetry-instrumentation-flask (==0.46b0)", "opentelemetry-instrumentation-grpc (==0.46b0)", "opentelemetry-instrumentation-httpx (==0.46b0)", "opentelemetry-instrumentation-jinja2 (==0.46b0)", "opentelemetry-instrumentation-kafka-python (==0.46b0)", "opentelemetry-instrumentation-logging (==0.46b0)", "opentelemetry-instrumentation-mysql (==0.46b0)", "opentelemetry-instrumentation-mysqlclient (==0.46b0)", "opentelemetry-instrumentation-pika (==0.46b0)", "opentelemetry-instrumentation-psycopg (==0.46b0)", "opentelemetry-instrumentation-psycopg2 (==0.46b0)", "opentelemetry-instrumentation-pymemcache (==0.46b0)", "opentelemetry-instrumentation-pymongo (==0.46b0)", "opentelemetry-instrumentation-pymysql (==0.46b0)", "opentelemetry-instrumentation-pyramid (==0.46b0)", "opentelemetry-instrumentation-redis (==0.46b0)", "opentelemetry-instrumentation-remoulade (==0.46b0)", "opentelemetry-instrumentation-requests (==0.46b0)", "opentelemetry-instrumentation-sklearn (==0.46b0)", "opentelemetry-instrumentation-sqlalchemy (==0.46b0)", "opentelemetry-instrumentation-sqlite3 (==0.46b0)", "opentelemetry-instrumentation-starlette (==0.46b0)", "opentelemetry-instrumentation-system-metrics (==0.46b0)", "opentelemetry-instrumentation-threading (==0.46b0)", "opentelemetry-instrumentation-tornado (==0.46b0)", "opentelemetry-instrumentation-tortoiseorm (==0.46b0)", "opentelemetry-instrumentation-urllib (==0.46b0)", "opentelemetry-instrumentation-urllib3 (==0.46b0)", "opentelemetry-instrumentation-wsgi (==0.46b0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=6)"] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + [[package]] name = "simsimd" version = "4.4.0" @@ -2030,15 +3012,29 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "tenacity" -version = "8.5.0" +version = "8.4.2" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" files = [ - {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, - {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, + {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, + {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, ] [package.extras] @@ -2117,6 +3113,23 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "typer" +version = "0.12.3" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, + {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + [[package]] name = "typing-extensions" version = "4.12.2" @@ -2128,6 +3141,32 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + [[package]] name = "urllib3" version = "2.2.2" @@ -2162,6 +3201,85 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + [[package]] name = "xmltodict" version = "0.13.0" @@ -2173,6 +3291,123 @@ files = [ {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, ] +[[package]] +name = "xxhash" +version = "3.4.1" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +files = [ + {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"}, + {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"}, + {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"}, + {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"}, + {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"}, + {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"}, + {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, + {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"}, + {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"}, + {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"}, + {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"}, + {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"}, + {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"}, + {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"}, + {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"}, + {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"}, + {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"}, + {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"}, + {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"}, + {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"}, + {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"}, + {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"}, + {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"}, + {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"}, + {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"}, + {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"}, + {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"}, + {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"}, + {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"}, + {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"}, + {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"}, + {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"}, + {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"}, + {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"}, + {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"}, + {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"}, + {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"}, + {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"}, + {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"}, + {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"}, +] + [[package]] name = "yarl" version = "1.9.4" @@ -2276,7 +3511,22 @@ files = [ idna = ">=2.0" multidict = ">=4.0" +[[package]] +name = "zipp" +version = "3.19.2" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, +] + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [metadata] lock-version = "2.0" python-versions = ">=3.12,<3.13" -content-hash = "e86b93db8edbdc76532f4d66edfd45a5cddd7bccb039dd13fde779a7920da59a" +content-hash = "d8fecac962c1bf0ed3316edfdb556d34cecee7f1b7b542878725aacbef696f19" diff --git a/redbox-core/pyproject.toml b/redbox-core/pyproject.toml index 7c665c627..f5c3b609c 100644 --- a/redbox-core/pyproject.toml +++ b/redbox-core/pyproject.toml @@ -14,6 +14,7 @@ readme = "../README.md" python = ">=3.12,<3.13" pydantic = "^2.7.1" elasticsearch = "^8.14.0" +langchain-community = "^0.2.6" langchain = "^0.2.11" langchain_openai = "^0.1.19" tiktoken = "^0.7.0" @@ -22,12 +23,16 @@ pydantic-settings = "^2.3.4" langchain-elasticsearch = "^0.2.2" pytest-dotenv = "^0.5.2" kneed = "^0.8.5" +langgraph = "^0.1.9" [tool.poetry.group.dev.dependencies] pytest = "^8.3.2" moto = "^5.0.10" pytest-cov = "^5.0.0" +pytest-asyncio = "^0.23.6" +jsonlines = "^4.0.0" +deepeval = "^0.21.73" [build-system] requires = ["poetry-core"] @@ -40,4 +45,7 @@ env_files = [ ".env.test", ".env" ] +markers = [ + "ai: marks tests as using a live LLM (deselect with '-m \"not ai\"')" +] diff --git a/redbox-core/redbox/__init__.py b/redbox-core/redbox/__init__.py index 7ef2a9cf4..15481c9b0 100644 --- a/redbox-core/redbox/__init__.py +++ b/redbox-core/redbox/__init__.py @@ -1,3 +1,7 @@ """Redbox is a Python library for working with the Redbox API, data and services.""" +from redbox.app import Redbox + __version__ = "0.3.0" + +__all__ = ["Redbox"] diff --git a/redbox-core/redbox/api/runnables.py b/redbox-core/redbox/api/runnables.py index 2021d8544..de2da5a89 100644 --- a/redbox-core/redbox/api/runnables.py +++ b/redbox-core/redbox/api/runnables.py @@ -1,18 +1,12 @@ -import sys -from functools import partial, reduce from logging import getLogger -from typing import Any from kneed import KneeLocator from langchain_core.documents.base import Document from langchain_core.prompts import ChatPromptTemplate -from langchain_core.runnables import Runnable, RunnableLambda, RunnablePassthrough, chain +from langchain_core.runnables import Runnable, chain from tiktoken import Encoding -from redbox.api.format import reduce_chunks_by_tokens -from redbox.models import ChatResponse from redbox.models.errors import QuestionLengthError -from redbox.transform import map_document_to_source_document logger = getLogger() @@ -55,41 +49,6 @@ def chat_prompt_from_messages(input_dict: dict): return chat_prompt_from_messages -@chain -def map_to_chat_response(input_dict: dict): - """ - Create a ChatResponse at the end of a chain from a dict containing - 'response' a string to use as output_text - 'source_documents' a list of documents to map to source_documents - """ - return ( - RunnablePassthrough.assign( - source_documents=( - RunnableLambda(lambda d: d.get("source_documents", [])) - | RunnableLambda(lambda docs: list(map(map_document_to_source_document, docs))) - ) - ) - | RunnableLambda( - lambda d: ChatResponse( - output_text=d["response"], source_documents=d.get("source_documents", []), route_name=d["route_name"] - ) - ) - ).invoke(input_dict) - - -def resize_documents(max_tokens: int) -> Runnable[list[Document], Any]: - """Gets a file as larger document-sized Chunks, splitting it by max_tokens.""" - n = max_tokens or sys.maxsize - - @chain - def wrapped(chunks_unsorted: list[Document]): - chunks_sorted = sorted(chunks_unsorted, key=lambda doc: doc.metadata["index"]) - reduce_chunk_n = partial(reduce_chunks_by_tokens, max_tokens=n) - return reduce(lambda cs, c: reduce_chunk_n(cs, c), chunks_sorted, []) # type: ignore - - return wrapped - - # TODO: allow for nothing coming back/empty list -- don't error # https://github.com/i-dot-ai/redbox/actions/runs/9944427706/job/27470465428#step:10:7160 diff --git a/redbox-core/redbox/app.py b/redbox-core/redbox/app.py new file mode 100644 index 000000000..7015f7a16 --- /dev/null +++ b/redbox-core/redbox/app.py @@ -0,0 +1,99 @@ +from langgraph.graph import StateGraph +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.vectorstores import VectorStoreRetriever +from tiktoken import Encoding + +from redbox.chains.graph import set_route, set_state_field +from redbox.graph.search import get_search_graph +from redbox.models.chain import ChainState +from redbox.models.chat import ChatRoute +from redbox.models.settings import Settings +from redbox.chains.components import get_all_chunks_retriever, get_parameterised_retriever, get_chat_llm, get_tokeniser +from redbox.graph.chat import get_chat_graph, get_chat_with_docs_graph + + +async def _default_callback(*args, **kwargs): + return None + + +class Redbox: + FINAL_RESPONSE_TAG = "response_flag" + SOURCE_DOCUMENTS_TAG = "source_documents_flag" + ROUTE_NAME_TAG = "route_flag" + + # Non keywords + ROUTABLE_BUILTIIN = [ChatRoute.chat, ChatRoute.chat_with_docs, ChatRoute.error_no_keyword] + + # Keyword routes + ROUTABLE_KEYWORDS = {ChatRoute.search: "Search for an answer to the question in the document"} + + def __init__( + self, + llm: BaseChatModel | None = None, + all_chunks_retriever: VectorStoreRetriever | None = None, + parameterised_retriever: VectorStoreRetriever | None = None, + tokeniser: Encoding | None = None, + env: Settings | None = None, + debug: bool = False, + ): + _env = env or Settings() + _all_chunks_retriever = all_chunks_retriever or get_all_chunks_retriever(_env) + _parameterised_retriever = parameterised_retriever or get_parameterised_retriever(_env) + _llm = llm or get_chat_llm(_env) + _tokeniser = tokeniser or get_tokeniser() + + app = StateGraph(ChainState) + app.set_entry_point("set_route") + + app.add_node("set_route", set_route.with_config(tags=[Redbox.ROUTE_NAME_TAG])) + app.add_conditional_edges( + "set_route", + lambda s: s["route_name"], + {x: x for x in Redbox.ROUTABLE_BUILTIIN + list(Redbox.ROUTABLE_KEYWORDS.keys())}, + ) + + app.add_node( + ChatRoute.search, + get_search_graph( + _llm, _parameterised_retriever.with_config(tags=[Redbox.SOURCE_DOCUMENTS_TAG]), _tokeniser, _env, debug + ), + ) + app.add_node(ChatRoute.chat, get_chat_graph(_llm, _tokeniser, _env, debug)) + app.add_node( + ChatRoute.chat_with_docs, + get_chat_with_docs_graph( + _llm, _all_chunks_retriever.with_config(tags=[Redbox.SOURCE_DOCUMENTS_TAG]), _tokeniser, _env, debug + ), + ) + app.add_node( + ChatRoute.error_no_keyword, + set_state_field("response", env.response_no_such_keyword).with_config(tags=[Redbox.FINAL_RESPONSE_TAG]), + ) + + self.graph = app.compile(debug=debug) + + async def run( + self, + input: ChainState, + response_tokens_callback=_default_callback, + route_name_callback=_default_callback, + documents_callback=_default_callback, + ) -> ChainState: + final_state = None + async for event in self.graph.astream_events(input, version="v2"): + kind = event["event"] + tags = event.get("tags", []) + if kind == "on_chat_model_stream" and Redbox.FINAL_RESPONSE_TAG in tags: + await response_tokens_callback(event["data"]["chunk"].content) + elif kind == "on_chain_end" and Redbox.FINAL_RESPONSE_TAG in tags: + await response_tokens_callback(event["data"]["output"]["response"]) + elif kind == "on_chain_end" and Redbox.ROUTE_NAME_TAG in tags: + await route_name_callback(event["data"]["output"]["route_name"]) + elif kind == "on_retriever_end" and Redbox.SOURCE_DOCUMENTS_TAG in tags: + await documents_callback(event["data"]["output"]) + elif kind == "on_chain_end" and event["name"] == "LangGraph": + final_state = ChainState(**event["data"]["output"]) + return final_state + + def get_available_keywords(self) -> dict[ChatRoute, str]: + return Redbox.ROUTABLE_KEYWORDS diff --git a/redbox-core/redbox/chains/components.py b/redbox-core/redbox/chains/components.py new file mode 100644 index 000000000..4a6d12205 --- /dev/null +++ b/redbox-core/redbox/chains/components.py @@ -0,0 +1,87 @@ +from langchain_elasticsearch import ElasticsearchRetriever +from langchain_core.embeddings import Embeddings, FakeEmbeddings +from langchain_openai import AzureChatOpenAI +from langchain_openai.embeddings import AzureOpenAIEmbeddings, OpenAIEmbeddings +from langchain_core.utils import convert_to_secret_str +from langchain_core.runnables import ConfigurableField +import tiktoken + +from redbox.models.settings import Settings +from redbox.retriever import AllElasticsearchRetriever, ParameterisedElasticsearchRetriever + + +def get_chat_llm(env: Settings): + return AzureChatOpenAI( + api_key=convert_to_secret_str(env.azure_openai_api_key), + azure_endpoint=env.azure_openai_endpoint, + model=env.azure_openai_model, + ) + + +def get_tokeniser() -> tiktoken.Encoding: + return tiktoken.get_encoding("cl100k_base") + + +def get_azure_embeddings(env: Settings): + return AzureOpenAIEmbeddings( + azure_endpoint=env.azure_openai_endpoint, + api_version=env.azure_api_version_embeddings, + model=env.azure_embedding_model, + max_retries=env.embedding_max_retries, + retry_min_seconds=env.embedding_retry_min_seconds, + retry_max_seconds=env.embedding_retry_max_seconds, + ) + + +def get_openai_embeddings(env: Settings): + return OpenAIEmbeddings( + api_key=convert_to_secret_str(env.openai_api_key), + base_url=env.embedding_openai_base_url, + model=env.embedding_openai_model, + chunk_size=env.embedding_max_batch_size, + ) + + +def get_embeddings(env: Settings) -> Embeddings: + if env.embedding_backend == "azure": + return get_azure_embeddings(env) + elif env.embedding_backend == "openai": + return get_openai_embeddings(env) + elif env.embedding_backend == "fake": + return FakeEmbeddings(size=3072) # TODO + else: + raise Exception("No configured embedding model") + + +def get_all_chunks_retriever(env: Settings) -> ElasticsearchRetriever: + return AllElasticsearchRetriever( + es_client=env.elasticsearch_client(), + index_name=f"{env.elastic_root_index}-chunk", + ) + + +def get_parameterised_retriever(env: Settings, embeddings: Embeddings | None = None): + """Creates an Elasticsearch retriever runnable. + + Runnable takes input of a dict keyed to question, file_uuids and user_uuid. + + Runnable returns a list of Chunks. + """ + default_params = { + "size": env.ai.rag_k, + "num_candidates": env.ai.rag_num_candidates, + "match_boost": 1, + "knn_boost": 1, + "similarity_threshold": 0, + } + return ParameterisedElasticsearchRetriever( + es_client=env.elasticsearch_client(), + index_name=f"{env.elastic_root_index}-chunk", + params=default_params, + embedding_model=embeddings or get_embeddings(env), + embedding_field_name=env.embedding_document_field_name, + ).configurable_fields( + params=ConfigurableField( + id="params", name="Retriever parameters", description="A dictionary of parameters to use for the retriever." + ) + ) diff --git a/redbox-core/redbox/chains/graph.py b/redbox-core/redbox/chains/graph.py new file mode 100644 index 000000000..8083ebda0 --- /dev/null +++ b/redbox-core/redbox/chains/graph.py @@ -0,0 +1,133 @@ +import logging +import re +from typing import Any + +from langchain.schema import StrOutputParser +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.runnables import Runnable, RunnableLambda, RunnableParallel, chain +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.vectorstores import VectorStoreRetriever +from tiktoken import Encoding + +from redbox.api.format import format_documents +from redbox.api.runnables import filter_by_elbow +from redbox.models import ChatRoute, Settings +from redbox.models.chain import ChainChatMessage, ChainState +from redbox.models.errors import QuestionLengthError + +log = logging.getLogger() +re_keyword_pattern = re.compile(r"@(\w+)") + + +def build_get_docs(env: Settings, retriever: VectorStoreRetriever): + return RunnableParallel({"documents": retriever}) + + +def build_get_docs_with_filter(env: Settings, retriever: VectorStoreRetriever): + return RunnableParallel({"documents": retriever | filter_by_elbow(env.ai.elbow_filter_enabled)}) + + +@chain +def set_route(state: ChainState): + """ + Choose an approach to chatting based on the current state + """ + # Match keyword + if route_match := re_keyword_pattern.search(state["query"].question): + match = route_match.group()[1:] + try: + if ChatRoute(match): + selected = match + except ValueError: + selected = ChatRoute.error_no_keyword.value + elif len(state["query"].file_uuids) > 0: + selected = ChatRoute.chat_with_docs.value + else: + selected = ChatRoute.chat.value + log.info(f"Based on user query [{selected}] selected") + return {"route_name": selected} + + +def make_chat_prompt_from_messages_runnable( + system_prompt: str, + question_prompt: str, + input_token_budget: int, + tokeniser: Encoding, +): + system_prompt_message = [("system", system_prompt)] + prompts_budget = len(tokeniser.encode(system_prompt)) - len(tokeniser.encode(question_prompt)) + token_budget = input_token_budget - prompts_budget + + @chain + def chat_prompt_from_messages(state: ChainState): + """ + Create a ChatPrompTemplate as part of a chain using 'chat_history'. + Returns the PromptValue using values in the input_dict + """ + log.debug("Setting chat prompt") + chat_history_budget = token_budget - len(tokeniser.encode(state["query"].question)) + + if chat_history_budget <= 0: + raise QuestionLengthError + + truncated_history: list[ChainChatMessage] = [] + for msg in state["query"].chat_history[::-1]: + chat_history_budget -= len(tokeniser.encode(msg["text"])) + if chat_history_budget <= 0: + break + else: + truncated_history.insert(0, msg) + + return ChatPromptTemplate.from_messages( + system_prompt_message + + [(msg["role"], msg["text"]) for msg in truncated_history] + + [("user", question_prompt)] + ).invoke(state["query"].dict() | state.get("prompt_args", {})) + + return chat_prompt_from_messages + + +@chain +def set_prompt_args(state: ChainState): + log.debug("Setting prompt args") + return { + "prompt_args": { + "formatted_documents": format_documents(state.get("documents") or []), + } + } + + +def build_llm_chain( + llm: BaseChatModel, + tokeniser: Encoding, + env: Settings, + system_prompt: str, + question_prompt: str, + final_response_chain=False, +) -> Runnable: + _llm = llm.with_config(tags=["response_flag"]) if final_response_chain else llm + return RunnableParallel( + { + "response": make_chat_prompt_from_messages_runnable( + system_prompt=system_prompt, + question_prompt=question_prompt, + input_token_budget=env.ai.context_window_size - env.llm_max_tokens, + tokeniser=tokeniser, + ) + | _llm + | StrOutputParser(), + } + ) + + +def set_state_field(state_field: str, value: Any): + return RunnableLambda( + lambda _: { + state_field: value, + } + ) + + +def empty_node(state: ChainState): + log.info(f"Empty Node: {state}") + return None diff --git a/redbox-core/redbox/graph/__init__.py b/redbox-core/redbox/graph/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/redbox-core/redbox/graph/chat.py b/redbox-core/redbox/graph/chat.py new file mode 100644 index 000000000..f17fd1d4f --- /dev/null +++ b/redbox-core/redbox/graph/chat.py @@ -0,0 +1,172 @@ +import logging +from langgraph.graph import StateGraph, START +from langgraph.constants import Send +from langgraph.graph.graph import CompiledGraph +from langchain_core.runnables import chain, RunnableLambda, Runnable +from langchain_core.documents import Document +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.output_parsers import StrOutputParser +from langchain_core.vectorstores import VectorStoreRetriever +from langchain_text_splitters import TextSplitter, TokenTextSplitter +from tiktoken import Encoding + +from redbox.api.format import format_documents +from redbox.models.chain import ChainState, ChatMapReduceState +from redbox.models.chat import ChatRoute +from redbox.chains.graph import ( + set_prompt_args, + build_llm_chain, + make_chat_prompt_from_messages_runnable, + build_get_docs, + set_state_field, +) +from redbox.models.settings import Settings + +log = logging.getLogger() + + +@chain +def to_map_step(state: ChatMapReduceState): + """ + Map each doc in the state to an execution of the llm map step which will create an answer + per current document + """ + return [ + Send( + "llm_map", + ChatMapReduceState( + query=state["query"], documents=[doc], route_name=state["route_name"], prompt_args=state["prompt_args"] + ), + ) + for doc in state["documents"] + ] + + +def build_reduce_docs_step(splitter: TextSplitter): + return RunnableLambda( + lambda state: [ + Document(page_content=s) for s in splitter.split_text(format_documents(state["intermediate_docs"])) + ] + ) | RunnableLambda(lambda docs: {"documents": docs}) + + +def get_chat_graph(llm: BaseChatModel, tokeniser: Encoding, env: Settings, debug: bool = False) -> CompiledGraph: + app = StateGraph(ChainState) + app.set_entry_point("set_chat_prompt_args") + + app.add_node("set_chat_prompt_args", set_prompt_args) + app.add_edge("set_chat_prompt_args", "llm") + + app.add_node( + "llm", + build_llm_chain( + llm, tokeniser, env, env.ai.chat_system_prompt, env.ai.chat_question_prompt, final_response_chain=True + ), + ) + + return app.compile(debug=debug) + + +@chain +def set_chat_method(state: ChainState): + """ + Choose an approach to chatting based on the current state + """ + log.debug("Selecting chat method") + number_of_docs = len(state["documents"]) + if number_of_docs == 0: + selected_tool = ChatRoute.chat + elif number_of_docs == 1: + selected_tool = ChatRoute.chat_with_docs + else: + selected_tool = ChatRoute.chat_with_docs_map_reduce + log.info(f"Selected: {selected_tool} for execution") + return {"route_name": selected_tool} + + +def build_llm_map_chain( + llm: BaseChatModel, tokeniser: Encoding, env: Settings, system_prompt: str, question_prompt: str +) -> Runnable: + return ( + make_chat_prompt_from_messages_runnable( + system_prompt=system_prompt, + question_prompt=question_prompt, + input_token_budget=env.ai.context_window_size - env.llm_max_tokens, + tokeniser=tokeniser, + ) + | llm + | StrOutputParser() + | RunnableLambda(lambda s: {"intermediate_docs": [Document(page_content=s)]}) + ) + + +def get_chat_with_docs_graph( + llm: BaseChatModel, + all_chunks_retriever: VectorStoreRetriever, + tokeniser: Encoding, + env: Settings, + debug: bool = False, +) -> CompiledGraph: + app = StateGraph(ChainState) + + app.add_node("get_chat_docs", build_get_docs(env, all_chunks_retriever)) + app.add_node("set_chat_prompt_args", set_prompt_args) + app.add_node("set_chat_method", set_chat_method) + + app.add_node("no_docs_available", set_state_field("response", env.response_no_doc_available)) + app.add_node( + "llm", + build_llm_chain( + llm, + tokeniser, + env, + env.ai.chat_with_docs_system_prompt, + env.ai.chat_with_docs_question_prompt, + final_response_chain=True, + ), + ) + app.add_node(ChatRoute.chat_with_docs_map_reduce, get_chat_with_docs_map_reduce_graph(llm, tokeniser, env, debug)) + app.add_node("clear_documents", set_state_field("documents", [])) + + app.add_edge(START, "get_chat_docs") + app.add_edge("get_chat_docs", "set_chat_prompt_args") + app.add_edge("set_chat_prompt_args", "set_chat_method") + app.add_conditional_edges( + "set_chat_method", + lambda state: state["route_name"], + { + ChatRoute.chat: "no_docs_available", + ChatRoute.chat_with_docs: "llm", + ChatRoute.chat_with_docs_map_reduce: ChatRoute.chat_with_docs_map_reduce, + }, + ) + app.add_edge(ChatRoute.chat_with_docs_map_reduce, "set_chat_prompt_args") + + # Remove docs so we don't provide citations for chat (using whole doc so irrelevant anyway) + app.add_edge("llm", "clear_documents") + + return app.compile(debug=debug) + + +def get_chat_with_docs_map_reduce_graph( + llm: BaseChatModel, tokeniser: Encoding, env: Settings, debug: bool = False +) -> CompiledGraph: + app = StateGraph(ChatMapReduceState) + + app.add_node( + "llm_map", build_llm_map_chain(llm, tokeniser, env, env.ai.map_system_prompt, env.ai.chat_map_question_prompt) + ) + app.add_node( + "reduce", + build_reduce_docs_step( + TokenTextSplitter( + model_name="gpt-4", + chunk_size=env.worker_ingest_largest_chunk_size, + chunk_overlap=env.worker_ingest_largest_chunk_overlap, + ) + ), + ) + + app.add_conditional_edges(START, to_map_step, then="reduce") + + return app.compile(debug=debug) diff --git a/redbox-core/redbox/graph/search.py b/redbox-core/redbox/graph/search.py new file mode 100644 index 000000000..7c2fba2c4 --- /dev/null +++ b/redbox-core/redbox/graph/search.py @@ -0,0 +1,52 @@ +from langgraph.graph import StateGraph, START +from langgraph.graph.graph import CompiledGraph +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.vectorstores import VectorStoreRetriever +from tiktoken import Encoding + +from redbox.chains.graph import build_get_docs_with_filter, build_llm_chain, set_prompt_args +from redbox.models.chain import ChainInput, ChainState +from redbox.models.settings import Settings + + +def get_search_graph( + llm: BaseChatModel, retriever: VectorStoreRetriever, tokeniser: Encoding, env: Settings, debug: bool = False +) -> CompiledGraph: + app = StateGraph(ChainState) + + app.add_node("get_docs", build_get_docs_with_filter(env, retriever)) + app.add_node("set_prompt_args", set_prompt_args) + + app.add_node( + "condense", build_llm_chain(llm, tokeniser, env, env.ai.condense_system_prompt, env.ai.condense_question_prompt) + ) + app.add_node( + "map_condense_to_question", + lambda s: { + "query": ChainInput( + question=s["response"], + file_uuids=s["query"].file_uuids, + user_uuid=s["query"].user_uuid, + chat_history=[], + ) + }, + ) + app.add_node( + "llm", + build_llm_chain( + llm, + tokeniser, + env, + env.ai.retrieval_system_prompt, + env.ai.retrieval_question_prompt, + final_response_chain=True, + ), + ) + + app.add_edge(START, "get_docs") + app.add_edge("get_docs", "set_prompt_args") + app.add_edge("set_prompt_args", "condense") + app.add_edge("condense", "map_condense_to_question") + app.add_edge("map_condense_to_question", "llm") + + return app.compile(debug=debug) diff --git a/redbox-core/redbox/models/chain.py b/redbox-core/redbox/models/chain.py index eb2a27e9d..bc9ea851a 100644 --- a/redbox-core/redbox/models/chain.py +++ b/redbox-core/redbox/models/chain.py @@ -5,9 +5,12 @@ used in conjunction with langchain this is the tidiest boxing of pydantic v1 we can do """ -from typing import TypedDict, Literal +from typing import TypedDict, Literal, Annotated, Required, NotRequired from uuid import UUID +from operator import add + from langchain_core.pydantic_v1 import BaseModel, Field +from langchain_core.documents import Document class ChainChatMessage(TypedDict): @@ -20,3 +23,15 @@ class ChainInput(BaseModel): file_uuids: list[UUID] = Field(description="List of files to process") user_uuid: UUID = Field(description="User the chain in executing for") chat_history: list[ChainChatMessage] = Field(description="All previous messages in chat (excluding question)") + + +class ChainState(TypedDict): + query: Required[ChainInput] + documents: NotRequired[list[Document]] + response: NotRequired[str | None] + route_name: NotRequired[str | None] + prompt_args: NotRequired[dict[str, str]] + + +class ChatMapReduceState(ChainState): + intermediate_docs: Annotated[NotRequired[list[Document]], add] diff --git a/redbox-core/redbox/models/chat.py b/redbox-core/redbox/models/chat.py index 85fdd98bb..428daedcf 100644 --- a/redbox-core/redbox/models/chat.py +++ b/redbox-core/redbox/models/chat.py @@ -64,16 +64,11 @@ class SourceDocuments(BaseModel): class ChatRoute(StrEnum): - info = "info" - ability = "ability" - coach = "coach" - gratitude = "gratitude" search = "search" - summarise = "summarise" - map_reduce_summarise = "summarise/documents/large" chat = "chat" chat_with_docs = "chat/documents" chat_with_docs_map_reduce = "chat/documents/large" + error_no_keyword = "error/no-keyword" class ChatResponse(BaseModel): diff --git a/redbox-core/redbox/models/settings.py b/redbox-core/redbox/models/settings.py index daf9c6763..ab6620d69 100644 --- a/redbox-core/redbox/models/settings.py +++ b/redbox-core/redbox/models/settings.py @@ -7,7 +7,6 @@ from pydantic import BaseModel, computed_field from pydantic_settings import BaseSettings, SettingsConfigDict -logging.basicConfig(level=logging.INFO) log = logging.getLogger() @@ -87,11 +86,10 @@ SUMMARISATION_QUESTION_PROMPT = "Question: {question}. \n\n Documents: \n\n {documents} \n\n Answer: " -MAP_QUESTION_PROMPT = "Question: {question}. " +CHAT_MAP_QUESTION_PROMPT = "Question: {question}. \n Documents: \n {formatted_documents} \n\n Answer: " -MAP_DOCUMENT_PROMPT = "\n\n Documents: \n\n {documents} \n\n Answer: " -REDUCE_QUESTION_PROMPT = "Question: {question}. \n\n Documents: \n\n {summaries} \n\n Answer: " +REDUCE_QUESTION_PROMPT = "Question: {question}. \n\n Documents: \n\n {formatted_documents} \n\n Answer: " CONDENSE_QUESTION_PROMPT = "{question}\n=========\n Standalone question: " @@ -121,8 +119,7 @@ class AISettings(BaseModel): summarisation_question_prompt: str = SUMMARISATION_QUESTION_PROMPT map_max_concurrency: int = 128 map_system_prompt: str = MAP_SYSTEM_PROMPT - map_question_prompt: str = MAP_QUESTION_PROMPT - map_document_prompt: str = MAP_DOCUMENT_PROMPT + chat_map_question_prompt: str = CHAT_MAP_QUESTION_PROMPT reduce_system_prompt: str = REDUCE_SYSTEM_PROMPT reduce_question_prompt: str = REDUCE_QUESTION_PROMPT @@ -172,7 +169,7 @@ class Settings(BaseSettings): azure_embedding_model: str = "text-embedding-3-large" llm_max_tokens: int = 1024 - embedding_backend: Literal["azure", "openai"] = "azure" + embedding_backend: Literal["azure", "openai", "fake"] = "azure" embedding_max_retries: int = 10 embedding_retry_min_seconds: int = 10 embedding_retry_max_seconds: int = 120 @@ -217,6 +214,10 @@ class Settings(BaseSettings): worker_ingest_largest_chunk_size: int = 96000 worker_ingest_largest_chunk_overlap: int = 0 + response_no_doc_available: str = "No available data for selected files. They may need to be removed and added again" + response_max_content_exceeded: str = "Max content exceeded. Try smaller or fewer documents" + response_no_such_keyword: str = "That keyword isn't recognised" + redis_host: str = "redis" redis_port: int = 6379 diff --git a/redbox-core/redbox/retriever/queries.py b/redbox-core/redbox/retriever/queries.py index 8b1caf9a1..98bcc206c 100644 --- a/redbox-core/redbox/retriever/queries.py +++ b/redbox-core/redbox/retriever/queries.py @@ -3,15 +3,10 @@ from langchain_core.embeddings.embeddings import Embeddings +from redbox.models.chain import ChainState from redbox.models.file import ChunkResolution -class ESQuery(TypedDict): - question: str - file_uuids: list[UUID] - user_uuid: UUID - - class ESParams(TypedDict): size: int num_candidates: int @@ -59,7 +54,7 @@ def make_query_filter(user_uuid: UUID, file_uuids: list[UUID], chunk_resolution: def get_all( chunk_resolution: ChunkResolution | None, - query: ESQuery, + state: ChainState, ) -> dict[str, Any]: """ Returns a parameterised elastic query that will return everything it matches. @@ -67,7 +62,7 @@ def get_all( As it's used in summarisation, it excludes embeddings. """ - query_filter = make_query_filter(query["user_uuid"], query["file_uuids"], chunk_resolution) + query_filter = make_query_filter(state["query"].user_uuid, state["query"].file_uuids, chunk_resolution) return { "_source": {"excludes": ["*embedding"]}, "query": {"bool": {"must": {"match_all": {}}, "filter": query_filter}}, @@ -79,11 +74,11 @@ def get_some( params: ESParams, embedding_field_name: str, chunk_resolution: ChunkResolution | None, - query: ESQuery, + state: ChainState, ) -> dict[str, Any]: - vector = embedding_model.embed_query(query["question"]) + vector = embedding_model.embed_query(state["query"].question) - query_filter = make_query_filter(query["user_uuid"], query["file_uuids"], chunk_resolution) + query_filter = make_query_filter(state["query"].user_uuid, state["query"].file_uuids, chunk_resolution) return { "size": params["size"], @@ -93,7 +88,7 @@ def get_some( { "match": { "text": { - "query": query["question"], + "query": state["query"].question, "boost": params["match_boost"], } } diff --git a/redbox-core/redbox/test/__init__.py b/redbox-core/redbox/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/redbox-core/redbox/test/data.py b/redbox-core/redbox/test/data.py new file mode 100644 index 000000000..0adf96e40 --- /dev/null +++ b/redbox-core/redbox/test/data.py @@ -0,0 +1,99 @@ +from dataclasses import dataclass, field +import datetime +import logging +from typing import Tuple +from uuid import UUID + +from langchain_core.documents import Document + +from redbox.models.chain import ChainInput +from redbox.models.chat import ChatRoute +from redbox.models.file import ChunkMetadata, ChunkResolution + +log = logging.getLogger() + + +def generate_docs( + parent_file_uuid: UUID, + creator_user_uuid: UUID, + file_name: str = "test_data.pdf", + page_numbers: list[int] = [1, 2, 3, 4], + total_tokens=6000, + number_of_docs: int = 10, + chunk_resolution=ChunkResolution.normal, +): + for i in range(number_of_docs): + yield Document( + page_content=f"Document {i} text", + metadata=ChunkMetadata( + parent_file_uuid=parent_file_uuid, + creator_user_uuid=creator_user_uuid, + index=i, + file_name=file_name, + page_number=page_numbers[int(i / number_of_docs) * len(page_numbers)], + created_datetime=datetime.datetime.now(datetime.UTC), + token_count=int(total_tokens / number_of_docs), + chunk_resolution=chunk_resolution, + ).model_dump(), + ) + + +@dataclass +class TestData: + number_of_docs: int + tokens_in_all_docs: int + chunk_resolution: ChunkResolution = ChunkResolution.largest + expected_llm_response: list[str] = field(default_factory=list) + expected_route: ChatRoute | None = None + + +class RedboxChatTestCase: + def __init__( + self, + test_id: str, + query: ChainInput, + test_data: TestData, + docs_user_uuid_override: UUID | None = None, + docs_file_uuids_override: list[UUID] | None = None, + ): + # Use separate file_uuids if specified else match the query + all_file_uuids = docs_file_uuids_override if docs_file_uuids_override else [id for id in query.file_uuids] + # Use separate user uuid if specific else match the query + docs_user_uuid = docs_user_uuid_override if docs_user_uuid_override else query.user_uuid + + if ( + test_data.expected_llm_response is not None + and len(test_data.expected_llm_response) < test_data.number_of_docs + ): + log.warning( + "Number of configured LLM responses might be less than number of docs. For Map-Reduce actions this will give a Generator Error!" + ) + + file_generators = [ + generate_docs( + parent_file_uuid=file_uuid, + creator_user_uuid=docs_user_uuid, + total_tokens=int(test_data.tokens_in_all_docs / len(all_file_uuids)), + number_of_docs=int(test_data.number_of_docs / len(all_file_uuids)), + chunk_resolution=test_data.chunk_resolution, + ) + for file_uuid in all_file_uuids + ] + self.query = query + self.docs = [doc for generator in file_generators for doc in generator] + self.test_data = test_data + self.test_id = test_id + + def get_docs_matching_query(self): + return [ + doc + for doc in self.docs + if doc.metadata["parent_file_uuid"] in set(self.query.file_uuids) + and doc.metadata["creator_user_uuid"] == self.query.user_uuid + ] + + +def generate_test_cases(query: ChainInput, test_data: list[TestData], test_id: str): + return [ + RedboxChatTestCase(test_id=f"{test_id}-{i}", query=query, test_data=data) for i, data in enumerate(test_data) + ] diff --git a/redbox-core/tests/conftest.py b/redbox-core/tests/conftest.py index 07e919cdb..93f8ef020 100644 --- a/redbox-core/tests/conftest.py +++ b/redbox-core/tests/conftest.py @@ -10,14 +10,14 @@ from collections.abc import Generator -from langchain_core.documents.base import Document from langchain_core.embeddings.fake import FakeEmbeddings from langchain_core.runnables import ConfigurableField from langchain_elasticsearch import ElasticsearchStore from redbox.retriever import AllElasticsearchRetriever, ParameterisedElasticsearchRetriever -from tests.retriever.data import ALL_CHUNKS_RETRIEVER_DOCUMENTS, PARAMETERISED_RETRIEVER_DOCUMENTS +from redbox.test.data import RedboxChatTestCase +from tests.retriever.data import ALL_CHUNKS_RETRIEVER_CASES, PARAMETERISED_RETRIEVER_CASES @pytest.fixture(scope="session") @@ -184,26 +184,27 @@ def file(s3_client, file_pdf_path: Path, alice, env) -> File: return File(key=file_name, bucket=env.bucket_name, creator_user_uuid=alice) -@pytest.fixture(params=ALL_CHUNKS_RETRIEVER_DOCUMENTS) +@pytest.fixture(params=ALL_CHUNKS_RETRIEVER_CASES) def stored_file_all_chunks( request, elasticsearch_client, es_index, embedding_model_dim -) -> Generator[list[Document], None, None]: +) -> Generator[RedboxChatTestCase, None, None]: + test_case: RedboxChatTestCase = request.param store = ElasticsearchStore( index_name=es_index, es_connection=elasticsearch_client, query_field="text", embedding=FakeEmbeddings(size=embedding_model_dim), ) - documents = list(map(Document.parse_obj, request.param)) - doc_ids = store.add_documents(documents) - yield documents + doc_ids = store.add_documents(test_case.docs) + yield test_case store.delete(doc_ids) -@pytest.fixture(params=PARAMETERISED_RETRIEVER_DOCUMENTS) +@pytest.fixture(params=PARAMETERISED_RETRIEVER_CASES) def stored_file_parameterised( request, elasticsearch_client, es_index, embedding_model, env: Settings -) -> Generator[list[Document], None, None]: +) -> Generator[RedboxChatTestCase, None, None]: + test_case: RedboxChatTestCase = request.param store = ElasticsearchStore( index_name=es_index, es_connection=elasticsearch_client, @@ -211,9 +212,8 @@ def stored_file_parameterised( vector_query_field=env.embedding_document_field_name, embedding=embedding_model, ) - documents = list(map(Document.parse_obj, request.param)) - doc_ids = store.add_documents(documents) - yield documents + doc_ids = store.add_documents(test_case.docs) + yield test_case store.delete(doc_ids) diff --git a/redbox-core/tests/graph/__init__.py b/redbox-core/tests/graph/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/redbox-core/tests/graph/test_app.py b/redbox-core/tests/graph/test_app.py new file mode 100644 index 000000000..bd16a7784 --- /dev/null +++ b/redbox-core/tests/graph/test_app.py @@ -0,0 +1,207 @@ +from uuid import uuid4 +import pytest +from langchain_core.language_models.fake_chat_models import GenericFakeChatModel +from langchain_core.runnables import RunnableLambda +import tiktoken + +from redbox.models.chain import ChainInput, ChainState +from redbox import Redbox +from redbox.models.chat import ChatRoute +from redbox.models.settings import Settings +from redbox.test.data import TestData, RedboxChatTestCase, generate_test_cases + + +LANGGRAPH_DEBUG = False + +test_env = Settings() + +TEST_CASES = [ + test_case + for generated_cases in [ + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData(0, 0, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat), + TestData(1, 100, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat), + TestData(10, 1200, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat), + ], + test_id="Basic Chat", + ), + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData( + 1, 1000, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat_with_docs + ), + TestData( + 1, 50000, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat_with_docs + ), + TestData( + 1, 200_000, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat_with_docs + ), + ], + test_id="Chat with single doc", + ), + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[uuid4(), uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData( + 2, + 40000, + expected_llm_response=["Map Step Response"] * 2 + ["Testing Response 1"], + expected_route=ChatRoute.chat_with_docs, + ), + TestData( + 2, + 100_000, + expected_llm_response=["Map Step Response"] * 2 + ["Testing Response 1"], + expected_route=ChatRoute.chat_with_docs, + ), + TestData( + 2, + 200_000, + expected_llm_response=["Map Step Response"] * 2 + ["Testing Response 1"], + expected_route=ChatRoute.chat_with_docs, + ), + ], + test_id="Chat with multiple docs", + ), + generate_test_cases( + query=ChainInput(question="What is AI?", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData( + 1, 200_000, expected_llm_response=["Testing Response 1"], expected_route=ChatRoute.chat_with_docs + ), + ], + test_id="Chat with large doc", + ), + generate_test_cases( + query=ChainInput(question="@search What is AI?", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[ + TestData( + 1, + 10000, + expected_llm_response=["Condense response", "The cake is a lie"], + expected_route=ChatRoute.search, + ), + TestData( + 5, + 10000, + expected_llm_response=["Condense response", "The cake is a lie"], + expected_route=ChatRoute.search, + ), + ], + test_id="Search", + ), + generate_test_cases( + query=ChainInput( + question="@nosuchkeyword What is AI?", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[] + ), + test_data=[ + TestData( + 2, + 200_000, + expected_llm_response=[test_env.response_no_such_keyword], + expected_route=ChatRoute.error_no_keyword, + ), + ], + test_id="No Such Keyword", + ), + ] + for test_case in generated_cases +] + + +@pytest.fixture(scope="session") +def env(): + return Settings() + + +@pytest.fixture(scope="session") +def tokeniser(): + return tiktoken.get_encoding("cl100k_base") + + +def all_chunks_retriever(docs): + def mock_retrieve(query): + return docs + + return RunnableLambda(mock_retrieve) + + +def parameterised_retriever(docs): + def mock_retrieve(query): + return docs + + return RunnableLambda(mock_retrieve) + + +@pytest.mark.asyncio +@pytest.mark.parametrize(("test_case"), TEST_CASES, ids=[t.test_id for t in TEST_CASES]) +async def test_chat(test_case: RedboxChatTestCase, env, tokeniser): + app = Redbox( + llm=GenericFakeChatModel(messages=iter(test_case.test_data.expected_llm_response)), + all_chunks_retriever=all_chunks_retriever(test_case.docs), + parameterised_retriever=parameterised_retriever(test_case.docs), + tokeniser=tokeniser, + env=env, + debug=LANGGRAPH_DEBUG, + ) + response = await app.run( + input=ChainState(query=test_case.query), + ) + final_state = ChainState(response) + assert ( + final_state["response"] == test_case.test_data.expected_llm_response[-1] + ), f"Expected LLM response: '{test_case.test_data.expected_llm_response[-1]}'. Received '{final_state["response"]}'" + assert ( + final_state["route_name"] == test_case.test_data.expected_route + ), f"Expected Route: '{ test_case.test_data.expected_route}'. Received '{final_state["route_name"]}'" + + +@pytest.mark.asyncio +@pytest.mark.parametrize(("test_case"), TEST_CASES, ids=[t.test_id for t in TEST_CASES]) +async def test_streaming(test_case: RedboxChatTestCase, env, tokeniser): + app = Redbox( + llm=GenericFakeChatModel(messages=iter(test_case.test_data.expected_llm_response)), + all_chunks_retriever=all_chunks_retriever(test_case.docs), + parameterised_retriever=parameterised_retriever(test_case.docs), + tokeniser=tokeniser, + env=env, + debug=LANGGRAPH_DEBUG, + ) + + token_events = [] + + async def streaming_response_handler(tokens: str): + token_events.append(tokens) + + response = await app.run( + input=ChainState(query=test_case.query), response_tokens_callback=streaming_response_handler + ) + final_state = ChainState(response) + + # Bit of a bodge to retain the ability to check that the LLM streaming is working in most cases + if not final_state["route_name"].startswith("error"): + assert len(token_events) > 1, f"Expected tokens as a stream. Received: {token_events}" + llm_response = "".join(token_events) + assert ( + final_state["response"] == llm_response + ), f"Expected LLM response: '{llm_response}'. Received '{final_state["response"]}'" + assert ( + final_state["route_name"] == test_case.test_data.expected_route + ), f"Expected Route: '{ test_case.test_data.expected_route}'. Received '{final_state["route_name"]}'" + + +def get_available_keywords(): + app = Redbox( + llm=GenericFakeChatModel(messages=iter([])), + all_chunks_retriever=all_chunks_retriever([]), + parameterised_retriever=parameterised_retriever([]), + tokeniser=tokeniser, + env=env, + debug=LANGGRAPH_DEBUG, + ) + keywords = {ChatRoute.search} + + assert keywords == set(app.get_available_keywords().keys()) diff --git a/redbox-core/tests/retriever/data.py b/redbox-core/tests/retriever/data.py index 6e331d1d1..010b08852 100644 --- a/redbox-core/tests/retriever/data.py +++ b/redbox-core/tests/retriever/data.py @@ -1,139 +1,30 @@ -from langchain_core.documents.base import Document +from uuid import uuid4 -ALL_CHUNKS_RETRIEVER_DOCUMENTS = [ - [ - Document( - page_content="ABC", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 1, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "largest", - }, - ), - Document( - page_content="DEF", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 2, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "largest", - }, - ), - Document( - page_content="GHI", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 3, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "largest", - }, - ), - Document( - page_content="JKL", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 4, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "largest", - }, - ), + +from redbox.models.chain import ChainInput +from redbox.models.file import ChunkResolution +from redbox.test.data import TestData, generate_test_cases + +ALL_CHUNKS_RETRIEVER_CASES = [ + test_case + for generator in [ + generate_test_cases( + query=ChainInput(question="Irrelevant Question", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[TestData(8, 8000)], + test_id="Successful Path", + ) ] + for test_case in generator ] -PARAMETERISED_RETRIEVER_DOCUMENTS = [ - [ - Document( - page_content="ABC", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 1, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "normal", - }, - ), - Document( - page_content="DEF", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 2, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "normal", - }, - ), - Document( - page_content="GHI", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 3, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "normal", - }, - ), - Document( - page_content="JKL", - metadata={ - "parent_file_uuid": "abcd", - "creator_user_uuid": "xabcd", - "index": 4, - "page_number": 1, - "languages": ["en"], - "link_texts": [], - "link_urls": [], - "links": [], - "created_datetime": "2024-06-01T12:00:00Z", - "token_count": 12, - "chunk_resolution": "normal", - }, - ), +PARAMETERISED_RETRIEVER_CASES = [ + test_case + for generator in [ + generate_test_cases( + query=ChainInput(question="Irrelevant Question", file_uuids=[uuid4()], user_uuid=uuid4(), chat_history=[]), + test_data=[TestData(8, 8000, ChunkResolution.normal)], + test_id="Successful Path", + ) ] + for test_case in generator ] diff --git a/redbox-core/tests/retriever/test_all_chunks.py b/redbox-core/tests/retriever/test_all_chunks.py index febf4c275..12ecc8191 100644 --- a/redbox-core/tests/retriever/test_all_chunks.py +++ b/redbox-core/tests/retriever/test_all_chunks.py @@ -1,18 +1,13 @@ -from langchain_core.documents.base import Document - +from redbox.models.chain import ChainState from redbox.retriever import AllElasticsearchRetriever +from redbox.test.data import RedboxChatTestCase + +def test_all_chunks_retriever( + all_chunks_retriever: AllElasticsearchRetriever, stored_file_all_chunks: RedboxChatTestCase +): + result = all_chunks_retriever.invoke(ChainState(query=stored_file_all_chunks.query)) -def test_all_chunks_retriever(all_chunks_retriever: AllElasticsearchRetriever, stored_file_all_chunks: list[Document]): - result = all_chunks_retriever.invoke( - { - "question": "is this real?", - "file_uuids": [stored_file_all_chunks[0].metadata["parent_file_uuid"]], - "user_uuid": stored_file_all_chunks[0].metadata["creator_user_uuid"], - } - ) - assert len(result) == len(stored_file_all_chunks) - assert {c.page_content for c in result} == {c.page_content for c in stored_file_all_chunks} - assert {c.metadata["parent_file_uuid"] for c in result} == { - str(c.metadata["parent_file_uuid"]) for c in stored_file_all_chunks - } + assert len(result) == len(stored_file_all_chunks.get_docs_matching_query()) + assert {c.page_content for c in result} | {c.page_content for c in stored_file_all_chunks.docs} + assert {c.metadata["parent_file_uuid"] for c in result} == set(map(str, stored_file_all_chunks.query.file_uuids)) diff --git a/redbox-core/tests/retriever/test_parameterised.py b/redbox-core/tests/retriever/test_parameterised.py index c5d7e4c11..ad6b5924f 100644 --- a/redbox-core/tests/retriever/test_parameterised.py +++ b/redbox-core/tests/retriever/test_parameterised.py @@ -1,7 +1,8 @@ import pytest -from langchain_core.documents.base import Document +from redbox.models.chain import ChainState from redbox.retriever import ParameterisedElasticsearchRetriever +from redbox.test.data import RedboxChatTestCase test_chain_parameters = ( { @@ -9,14 +10,14 @@ "num_candidates": 100, "match_boost": 1, "knn_boost": 2, - "similarity_threshold": 0.7, + "similarity_threshold": 0, }, { "size": 2, "num_candidates": 100, "match_boost": 1, "knn_boost": 2, - "similarity_threshold": 0.7, + "similarity_threshold": 0, }, ) @@ -25,13 +26,9 @@ def test_parameterised_retriever( chain_params, parameterised_retriever: ParameterisedElasticsearchRetriever, - stored_file_parameterised: list[Document], + stored_file_parameterised: RedboxChatTestCase, ): result = parameterised_retriever.with_config(configurable={"params": chain_params}).invoke( - { - "question": "is this real?", - "file_uuids": [stored_file_parameterised[0].metadata["parent_file_uuid"]], - "user_uuid": stored_file_parameterised[0].metadata["creator_user_uuid"], - } + ChainState(query=stored_file_parameterised.query) ) assert len(result) == chain_params["size"], result diff --git a/core-api/tests/test_ai.py b/redbox-core/tests/test_ai.py similarity index 95% rename from core-api/tests/test_ai.py rename to redbox-core/tests/test_ai.py index f759e8ada..7cd93c97a 100644 --- a/core-api/tests/test_ai.py +++ b/redbox-core/tests/test_ai.py @@ -22,9 +22,9 @@ from elasticsearch.helpers import bulk, scan from pydantic import BaseModel, Field -from core_api.build_chains import build_retrieval_chain -from core_api.dependencies import get_llm, get_parameterised_retriever, get_tokeniser -from redbox.models.chain import ChainInput +from redbox.chains.components import get_chat_llm, get_parameterised_retriever, get_tokeniser +from redbox.graph.search import get_search_graph +from redbox.models.chain import ChainInput, ChainState if TYPE_CHECKING: from collections.abc import Callable, Generator @@ -93,7 +93,7 @@ def ai_experiment_data() -> ExperimentData: @pytest.fixture(scope="session") def llm(env: Settings) -> ChatLiteLLM: - return get_llm(env) + return get_chat_llm(env) @pytest.fixture(scope="session") @@ -124,7 +124,7 @@ async def a_generate(self, prompt: str) -> str: def get_model_name(self): return "Custom LiteLLM Model" - return ChatLiteLLMDeepEval(model=get_llm(env)) + return ChatLiteLLMDeepEval(model=get_chat_llm(env)) @pytest.fixture(scope="session") @@ -188,7 +188,7 @@ def make_test_case( retriever = get_parameterised_retriever(env=env) - rag_chain = build_retrieval_chain( + rag_chain = get_search_graph( llm=llm, retriever=retriever, tokeniser=get_tokeniser(), @@ -201,13 +201,16 @@ def _make_test_case( for case in experiment.test_cases: if case.input == prompt: return case - chain_input = ChainInput( - question=prompt, - file_uuids=[], - user_uuid=str(user_uuid), - chat_history=[], + answer: ChainState = rag_chain.invoke( + input=ChainState( + query=ChainInput( + question=prompt, + file_uuids=[], + user_uuid=str(user_uuid), + chat_history=[], + ) + ) ) - answer = rag_chain.invoke(input=chain_input.model_dump(mode="json")) return LLMTestCase( input=prompt, diff --git a/worker/poetry.lock b/worker/poetry.lock index a24813458..58ea16baa 100644 --- a/worker/poetry.lock +++ b/worker/poetry.lock @@ -653,13 +653,13 @@ crt = ["awscrt (==0.20.11)"] [[package]] name = "botocore-stubs" -version = "1.34.145" +version = "1.34.150" description = "Type annotations and code completion for botocore" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "botocore_stubs-1.34.145-py3-none-any.whl", hash = "sha256:4c579734492713c142773c7405cf62b466dfaf5f05371b7510d3cd308b0ba6a5"}, - {file = "botocore_stubs-1.34.145.tar.gz", hash = "sha256:69bcfc0c81eee294e681dc8049b7ca2a47a8f0510b88c05710f07dba6d0785c7"}, + {file = "botocore_stubs-1.34.150-py3-none-any.whl", hash = "sha256:5f3d9eca8a7173e450c903ee28b934a7152ab5c2da2bfe71f72f4a9e89ef4923"}, + {file = "botocore_stubs-1.34.150.tar.gz", hash = "sha256:e2308ec1f983f7c93fc0e42c1b60f91c75746bcb564a9cb8240c742fd7d6483a"}, ] [package.dependencies] @@ -1246,13 +1246,13 @@ files = [ [[package]] name = "fast-depends" -version = "2.4.6" +version = "2.4.7" description = "FastDepends - extracted and cleared from HTTP domain logic FastAPI Dependency Injection System. Async and sync are both supported." optional = false python-versions = ">=3.8" files = [ - {file = "fast_depends-2.4.6-py3-none-any.whl", hash = "sha256:50d0ba61450920173c498c08c01ec22fa22aa62c4e82bf409df9f5b9f677a31c"}, - {file = "fast_depends-2.4.6.tar.gz", hash = "sha256:724a5068c3f955e02121a953428349ef34c8a2fadd65f073e94c94d54cec4554"}, + {file = "fast_depends-2.4.7-py3-none-any.whl", hash = "sha256:ae7c138673639cfe00836b60107395c910cc1595036074c85c2505177f7a24fc"}, + {file = "fast_depends-2.4.7.tar.gz", hash = "sha256:44464a7807131df92aeb12ad511a027ef385e000f4ec15a427ae4ea458a112ce"}, ] [package.dependencies] @@ -1803,13 +1803,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.24.0" +version = "0.24.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.0-py3-none-any.whl", hash = "sha256:7ad92edefb93d8145c061f6df8d99df2ff85f8379ba5fac8a95aca0642afa5d7"}, - {file = "huggingface_hub-0.24.0.tar.gz", hash = "sha256:6c7092736b577d89d57b3cdfea026f1b0dc2234ae783fa0d59caf1bf7d52dfa7"}, + {file = "huggingface_hub-0.24.3-py3-none-any.whl", hash = "sha256:69ecce486dd6cdad69937ba76779e893c224a670a9d947636c1d5cbd049e44d8"}, + {file = "huggingface_hub-0.24.3.tar.gz", hash = "sha256:bfdc05cc9b64a0e24e8614a44222698799183268f6b68be209aa2df70cff2cde"}, ] [package.dependencies] @@ -2202,13 +2202,13 @@ six = "*" [[package]] name = "langsmith" -version = "0.1.93" +version = "0.1.94" 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.93-py3-none-any.whl", hash = "sha256:811210b9d5f108f36431bd7b997eb9476a9ecf5a2abd7ddbb606c1cdcf0f43ce"}, - {file = "langsmith-0.1.93.tar.gz", hash = "sha256:285b6ad3a54f50fa8eb97b5f600acc57d0e37e139dd8cf2111a117d0435ba9b4"}, + {file = "langsmith-0.1.94-py3-none-any.whl", hash = "sha256:0d01212086d58699f75814117b026784218042f7859877ce08a248a98d84aa8d"}, + {file = "langsmith-0.1.94.tar.gz", hash = "sha256:e44afcdc9eee6f238f6a87a02bba83111bd5fad376d881ae299834e06d39d712"}, ] [package.dependencies] @@ -2772,24 +2772,24 @@ files = [ [[package]] name = "mypy-boto3-dynamodb" -version = "1.34.131" -description = "Type annotations for boto3.DynamoDB 1.34.131 service generated with mypy-boto3-builder 7.24.0" +version = "1.34.148" +description = "Type annotations for boto3.DynamoDB 1.34.148 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_dynamodb-1.34.131-py3-none-any.whl", hash = "sha256:62e4fd85c621561f145828de14752a51380182d492cb039043d7f46bef872c34"}, - {file = "mypy_boto3_dynamodb-1.34.131.tar.gz", hash = "sha256:d23c857568ae7c8c8fc1fbd96709a1dd00c140f917d74e09423fd44677097abf"}, + {file = "mypy_boto3_dynamodb-1.34.148-py3-none-any.whl", hash = "sha256:f1a7aabff5c6e926b9b272df87251c9d6dfceb4c1fb159fb5a2df52062cd7e87"}, + {file = "mypy_boto3_dynamodb-1.34.148.tar.gz", hash = "sha256:c85489b92cbbbe4f6997070372022df914d4cb8eb707fdc73aa18ce6ba25c578"}, ] [[package]] name = "mypy-boto3-ec2" -version = "1.34.145" -description = "Type annotations for boto3.EC2 1.34.145 service generated with mypy-boto3-builder 7.25.0" +version = "1.34.149" +description = "Type annotations for boto3.EC2 1.34.149 service generated with mypy-boto3-builder 7.25.0" optional = false python-versions = ">=3.8" files = [ - {file = "mypy_boto3_ec2-1.34.145-py3-none-any.whl", hash = "sha256:d6a200a341e65b584cc9af9861e8a331dc85d19a5316d9d0637d192824ec9375"}, - {file = "mypy_boto3_ec2-1.34.145.tar.gz", hash = "sha256:f676e9382ca2ad1e419804a2759779018d7f0006ac86bd602479855073fafc79"}, + {file = "mypy_boto3_ec2-1.34.149-py3-none-any.whl", hash = "sha256:9f5b13d7ffcb7fb1d57688a728bcefbeb12ab74f2047ee5a4577b8064f7a3fe3"}, + {file = "mypy_boto3_ec2-1.34.149.tar.gz", hash = "sha256:034f8d160535f5cf77fe35c95588454790cd2709f656274604bc36f76406211f"}, ] [[package]] @@ -3072,7 +3072,6 @@ description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_aarch64.whl", hash = "sha256:98103729cc5226e13ca319a10bbf9433bbbd44ef64fe72f45f067cacc14b8d27"}, {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, ] @@ -3203,13 +3202,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.36.1" +version = "1.37.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.36.1-py3-none-any.whl", hash = "sha256:d399b9d476dbbc167aceaac6bc6ed0b2e2bb6c9e189c7f7047f822743ae62e64"}, - {file = "openai-1.36.1.tar.gz", hash = "sha256:41be9e0302e95dba8a9374b885c5cb1cec2202816a70b98736fee25a2cadd1f2"}, + {file = "openai-1.37.1-py3-none-any.whl", hash = "sha256:9a6adda0d6ae8fce02d235c5671c399cfa40d6a281b3628914c7ebf244888ee3"}, + {file = "openai-1.37.1.tar.gz", hash = "sha256:faf87206785a6b5d9e34555d6a3242482a6852bc802e453e2a891f68ee04ce55"}, ] [package.dependencies] @@ -3991,13 +3990,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.3.4" +version = "2.4.0" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.3.4-py3-none-any.whl", hash = "sha256:11ad8bacb68a045f00e4f862c7a718c8a9ec766aa8fd4c32e39a0594b207b53a"}, - {file = "pydantic_settings-2.3.4.tar.gz", hash = "sha256:c5802e3d62b78e82522319bbc9b8f8ffb28ad1c988a99311d04f2a6051fca0a7"}, + {file = "pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315"}, + {file = "pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88"}, ] [package.dependencies] @@ -4005,6 +4004,7 @@ pydantic = ">=2.7.0" python-dotenv = ">=0.21.0" [package.extras] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] @@ -4394,104 +4394,104 @@ files = [ [[package]] name = "rapidfuzz" -version = "3.9.4" +version = "3.9.5" description = "rapid fuzzy string matching" optional = false python-versions = ">=3.8" files = [ - {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9b9793c19bdf38656c8eaefbcf4549d798572dadd70581379e666035c9df781"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:015b5080b999404fe06ec2cb4f40b0be62f0710c926ab41e82dfbc28e80675b4"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc5ceca9c1e1663f3e6c23fb89a311f69b7615a40ddd7645e3435bf3082688a"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1424e238bc3f20e1759db1e0afb48a988a9ece183724bef91ea2a291c0b92a95"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed01378f605aa1f449bee82cd9c83772883120d6483e90aa6c5a4ce95dc5c3aa"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb26d412271e5a76cdee1c2d6bf9881310665d3fe43b882d0ed24edfcb891a84"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f37e9e1f17be193c41a31c864ad4cd3ebd2b40780db11cd5c04abf2bcf4201b"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d070ec5cf96b927c4dc5133c598c7ff6db3b833b363b2919b13417f1002560bc"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:10e61bb7bc807968cef09a0e32ce253711a2d450a4dce7841d21d45330ffdb24"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:31a2fc60bb2c7face4140010a7aeeafed18b4f9cdfa495cc644a68a8c60d1ff7"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fbebf1791a71a2e89f5c12b78abddc018354d5859e305ec3372fdae14f80a826"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aee9fc9e3bb488d040afc590c0a7904597bf4ccd50d1491c3f4a5e7e67e6cd2c"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-win32.whl", hash = "sha256:005a02688a51c7d2451a2d41c79d737aa326ff54167211b78a383fc2aace2c2c"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:3a2e75e41ee3274754d3b2163cc6c82cd95b892a85ab031f57112e09da36455f"}, - {file = "rapidfuzz-3.9.4-cp310-cp310-win_arm64.whl", hash = "sha256:2c99d355f37f2b289e978e761f2f8efeedc2b14f4751d9ff7ee344a9a5ca98d9"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:07141aa6099e39d48637ce72a25b893fc1e433c50b3e837c75d8edf99e0c63e1"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db1664eaff5d7d0f2542dd9c25d272478deaf2c8412e4ad93770e2e2d828e175"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc01a223f6605737bec3202e94dcb1a449b6c76d46082cfc4aa980f2a60fd40e"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1869c42e73e2a8910b479be204fa736418741b63ea2325f9cc583c30f2ded41a"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62ea7007941fb2795fff305ac858f3521ec694c829d5126e8f52a3e92ae75526"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:698e992436bf7f0afc750690c301215a36ff952a6dcd62882ec13b9a1ebf7a39"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b76f611935f15a209d3730c360c56b6df8911a9e81e6a38022efbfb96e433bab"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129627d730db2e11f76169344a032f4e3883d34f20829419916df31d6d1338b1"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:90a82143c14e9a14b723a118c9ef8d1bbc0c5a16b1ac622a1e6c916caff44dd8"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ded58612fe3b0e0d06e935eaeaf5a9fd27da8ba9ed3e2596307f40351923bf72"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f16f5d1c4f02fab18366f2d703391fcdbd87c944ea10736ca1dc3d70d8bd2d8b"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26aa7eece23e0df55fb75fbc2a8fb678322e07c77d1fd0e9540496e6e2b5f03e"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-win32.whl", hash = "sha256:f187a9c3b940ce1ee324710626daf72c05599946bd6748abe9e289f1daa9a077"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d8e9130fe5d7c9182990b366ad78fd632f744097e753e08ace573877d67c32f8"}, - {file = "rapidfuzz-3.9.4-cp311-cp311-win_arm64.whl", hash = "sha256:40419e98b10cd6a00ce26e4837a67362f658fc3cd7a71bd8bd25c99f7ee8fea5"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b5d5072b548db1b313a07d62d88fe0b037bd2783c16607c647e01b070f6cf9e5"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf5bcf22e1f0fd273354462631d443ef78d677f7d2fc292de2aec72ae1473e66"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c8fc973adde8ed52810f590410e03fb6f0b541bbaeb04c38d77e63442b2df4c"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2464bb120f135293e9a712e342c43695d3d83168907df05f8c4ead1612310c7"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d9d58689aca22057cf1a5851677b8a3ccc9b535ca008c7ed06dc6e1899f7844"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167e745f98baa0f3034c13583e6302fb69249a01239f1483d68c27abb841e0a1"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0bf0663b4b6da1507869722420ea9356b6195aa907228d6201303e69837af9"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd6ac61b74fdb9e23f04d5f068e6cf554f47e77228ca28aa2347a6ca8903972f"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:60ff67c690acecf381759c16cb06c878328fe2361ddf77b25d0e434ea48a29da"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cb934363380c60f3a57d14af94325125cd8cded9822611a9f78220444034e36e"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe833493fb5cc5682c823ea3e2f7066b07612ee8f61ecdf03e1268f262106cdd"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2797fb847d89e04040d281cb1902cbeffbc4b5131a5c53fc0db490fd76b2a547"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-win32.whl", hash = "sha256:52e3d89377744dae68ed7c84ad0ddd3f5e891c82d48d26423b9e066fc835cc7c"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:c76da20481c906e08400ee9be230f9e611d5931a33707d9df40337c2655c84b5"}, - {file = "rapidfuzz-3.9.4-cp312-cp312-win_arm64.whl", hash = "sha256:f2d2846f3980445864c7e8b8818a29707fcaff2f0261159ef6b7bd27ba139296"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:355fc4a268ffa07bab88d9adee173783ec8d20136059e028d2a9135c623c44e6"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4d81a78f90269190b568a8353d4ea86015289c36d7e525cd4d43176c88eff429"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e618625ffc4660b26dc8e56225f8b966d5842fa190e70c60db6cd393e25b86e"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b712336ad6f2bacdbc9f1452556e8942269ef71f60a9e6883ef1726b52d9228a"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc1ee19fdad05770c897e793836c002344524301501d71ef2e832847425707"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1950f8597890c0c707cb7e0416c62a1cf03dcdb0384bc0b2dbda7e05efe738ec"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a6c35f272ec9c430568dc8c1c30cb873f6bc96be2c79795e0bce6db4e0e101d"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1df0f9e9239132a231c86ae4f545ec2b55409fa44470692fcfb36b1bd00157ad"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d2c51955329bfccf99ae26f63d5928bf5be9fcfcd9f458f6847fd4b7e2b8986c"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:3c522f462d9fc504f2ea8d82e44aa580e60566acc754422c829ad75c752fbf8d"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:d8a52fc50ded60d81117d7647f262c529659fb21d23e14ebfd0b35efa4f1b83d"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:04dbdfb0f0bfd3f99cf1e9e24fadc6ded2736d7933f32f1151b0f2abb38f9a25"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-win32.whl", hash = "sha256:4968c8bd1df84b42f382549e6226710ad3476f976389839168db3e68fd373298"}, - {file = "rapidfuzz-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:3fe4545f89f8d6c27b6bbbabfe40839624873c08bd6700f63ac36970a179f8f5"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f256c8fb8f3125574c8c0c919ab0a1f75d7cba4d053dda2e762dcc36357969d"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fdc09cf6e9d8eac3ce48a4615b3a3ee332ea84ac9657dbbefef913b13e632f"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d395d46b80063d3b5d13c0af43d2c2cedf3ab48c6a0c2aeec715aa5455b0c632"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fa714fb96ce9e70c37e64c83b62fe8307030081a0bfae74a76fac7ba0f91715"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc1a0f29f9119be7a8d3c720f1d2068317ae532e39e4f7f948607c3a6de8396"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6022674aa1747d6300f699cd7c54d7dae89bfe1f84556de699c4ac5df0838082"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb72e5f9762fd469701a7e12e94b924af9004954f8c739f925cb19c00862e38"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad04ae301129f0eb5b350a333accd375ce155a0c1cec85ab0ec01f770214e2e4"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f46a22506f17c0433e349f2d1dc11907c393d9b3601b91d4e334fa9a439a6a4d"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:01b42a8728c36011718da409aa86b84984396bf0ca3bfb6e62624f2014f6022c"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e590d5d5443cf56f83a51d3c4867bd1f6be8ef8cfcc44279522bcef3845b2a51"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c72078b5fdce34ba5753f9299ae304e282420e6455e043ad08e4488ca13a2b0"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-win32.whl", hash = "sha256:f75639277304e9b75e6a7b3c07042d2264e16740a11e449645689ed28e9c2124"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:e81e27e8c32a1e1278a4bb1ce31401bfaa8c2cc697a053b985a6f8d013df83ec"}, - {file = "rapidfuzz-3.9.4-cp39-cp39-win_arm64.whl", hash = "sha256:15bc397ee9a3ed1210b629b9f5f1da809244adc51ce620c504138c6e7095b7bd"}, - {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:20488ade4e1ddba3cfad04f400da7a9c1b91eff5b7bd3d1c50b385d78b587f4f"}, - {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e61b03509b1a6eb31bc5582694f6df837d340535da7eba7bedb8ae42a2fcd0b9"}, - {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:098d231d4e51644d421a641f4a5f2f151f856f53c252b03516e01389b2bfef99"}, - {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17ab8b7d10fde8dd763ad428aa961c0f30a1b44426e675186af8903b5d134fb0"}, - {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e272df61bee0a056a3daf99f9b1bd82cf73ace7d668894788139c868fdf37d6f"}, - {file = "rapidfuzz-3.9.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d6481e099ff8c4edda85b8b9b5174c200540fd23c8f38120016c765a86fa01f5"}, - {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ad61676e9bdae677d577fe80ec1c2cea1d150c86be647e652551dcfe505b1113"}, - {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:af65020c0dd48d0d8ae405e7e69b9d8ae306eb9b6249ca8bf511a13f465fad85"}, - {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d38b4e026fcd580e0bda6c0ae941e0e9a52c6bc66cdce0b8b0da61e1959f5f8"}, - {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f74ed072c2b9dc6743fb19994319d443a4330b0e64aeba0aa9105406c7c5b9c2"}, - {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee5f6b8321f90615c184bd8a4c676e9becda69b8e4e451a90923db719d6857c"}, - {file = "rapidfuzz-3.9.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3a555e3c841d6efa350f862204bb0a3fea0c006b8acc9b152b374fa36518a1c6"}, - {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0772150d37bf018110351c01d032bf9ab25127b966a29830faa8ad69b7e2f651"}, - {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:addcdd3c3deef1bd54075bd7aba0a6ea9f1d01764a08620074b7a7b1e5447cb9"}, - {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fe86b82b776554add8f900b6af202b74eb5efe8f25acdb8680a5c977608727f"}, - {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0fc91ac59f4414d8542454dfd6287a154b8e6f1256718c898f695bdbb993467"}, - {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a944e546a296a5fdcaabb537b01459f1b14d66f74e584cb2a91448bffadc3c1"}, - {file = "rapidfuzz-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fb96ba96d58c668a17a06b5b5e8340fedc26188e87b0d229d38104556f30cd8"}, - {file = "rapidfuzz-3.9.4.tar.gz", hash = "sha256:366bf8947b84e37f2f4cf31aaf5f37c39f620d8c0eddb8b633e6ba0129ca4a0a"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7659058863d84a2c36c5a76c28bc8713d33eab03e677e67260d9e1cca43fc3bb"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:802a018776bd3cb7c5d23ba38ebbb1663a9f742be1d58e73b62d8c7cace6e607"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da71e8fdb0d1a21f4b58b2c84bcbc2b89a472c073c5f7bdb9339f4cb3122c0e3"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9433cb12731167b358fbcff9828d2294429986a03222031f6d14308eb643c77"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e33e1d185206730b916b3e7d9bce1941c65b2a1488cdd0457ae21be385a7912"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:758719e9613c47a274768f1926460955223fe0a03e7eda264f2b78b1b97a4743"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7981cc6240d01d4480795d758ea2ee748257771f68127d630045e58fe1b5545a"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b6cdca86120c3f9aa069f8d4e1c5422e92f833d705d719a2ba7082412f4c933b"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ffa533acb1a9dcb6e26c4467fdc1347995fb168ec9f794b97545f6b72dee733c"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:13eeaeb0d5fe00fa99336f73fb5ab65c46109c7121cf87659b9601908b8b6178"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d7b1922b1403ccb3583218e8cd931b08e04c5442ca03dbaf6ea4fcf574ee2b24"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b0189f691cea4dc9fe074ea6b97da30a91d0882fa69724b4b34b51d2c1983473"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-win32.whl", hash = "sha256:72e466e5de12a327a09ed6d0116f024759b5146b335645c32241da84134a7f34"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:345011cfcafaa3674c46673baad67d2394eb58285530d8333e65c3c9a143b4f4"}, + {file = "rapidfuzz-3.9.5-cp310-cp310-win_arm64.whl", hash = "sha256:5dc19c8222475e4f7f528b94d2fa28e7979355c5cf7c6e73902d2abb2be96522"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c741972d64031535cfd76d89cf47259e590e822353be57ec2f5d56758c98296"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7452d079800cf70a7314f73044f03cbcbd90a651d9dec39443d2a8a2b63ab53"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f06f163a0341bad162e972590b73e17f9cea2ed8ee27b193875ccbc3dd6eca2f"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:529e2cf441746bd492f6c36a38bf9fa6a418df95b9c003f8e92a55d8a979bd9c"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9811a741aa1350ad36689d675ded8b34e423e68b396bd30bff751a9c582f586e"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e36c4640a789b8c922b69a548968939d1c0433fa7aac83cb08e1334d4e5d7de"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53fb2f32f14c921d2f673c5b7cd58d4cc626c574a28c0791f283880d8e57022c"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:031806eb035a6f09f4ff23b9d971d50b30b5e93aa3ee620c920bee1dc32827e7"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f6dbe1df0b9334e3cf07445d810c81734ae23d137b5efc69e1d676ff55691351"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:24345826b50aafcea26e2e4be5c103d96fe9d7fc549ac9190641300290958f3b"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bfd3b66ee1f0ebb40c672a7a7e5bda00fb763fa9bca082058084175151f8e685"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a6f1df5b0e602e94199cccb5e241bbc2319644003e34f077741ebf48aea7ed1a"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-win32.whl", hash = "sha256:f080d6709f51a8335e73826b96af9b4e3657631eca6c69e1ac501868dcc84b7f"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:bf9ed6988da6a2c1f8df367cb5d6be26a3d8543646c8eba79741ac9e764fbc59"}, + {file = "rapidfuzz-3.9.5-cp311-cp311-win_arm64.whl", hash = "sha256:599714790dfac0a23a473134e6677d0a103690a4e21ba189cfc826e322cdc8d5"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9729852038fb2de096e249899f8a9bee90fb1f92e10b6ccc539d5bb798c703bc"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9dc39435476fb3b3b3c24ab2c08c726056b2b487aa7ee450aee698b808c808ac"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6ceea632b0eb97dac54411c29feb190054e91fd0571f585b56e4a9159c55ab0"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cadd66e6ef9901909dc1b11db91048f1bf4613ba7d773386f922e28b1e1df4da"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63e34fb3586431589a5e1cd7fc61c6f057576c6c6804c1c673bac3de0516dee7"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:181073256faec68e6b8ab3329a36cfa1360f7906aa70d9aee4a39cb70889f73f"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8419c18bbbd67058ca1312f35acda2e4e4592650f105cfd166569a2ebccd01f1"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:191d1057cca56641f7b919fe712cb7e48cd226342e097a78136127f8bde32caa"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fe5a11eefd0ae90d32d9ff706a894498b4efb4b0c263ad9d1e6401050863504d"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b024d9d69bb83e125adee4162991f2764f16acc3fb1ed0f0fc1ad5aeb7e394"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d5a34b8388ae99bdbd5a3646f45ac318f4c870105bdbe42a2f4c85e5b347761"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e09abc0d397019bba61c8e6dfe2ec863d4dfb1762f51c9197ce0af5d5fd9adb"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-win32.whl", hash = "sha256:e3c4be3057472c79ba6f4eab35daa9f12908cb697c472d05fbbd47949a87aec6"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:0d9fdb74df87018dd4146f3d00df9fca2c27f060936a9e8d3015e7bfb9cb69e4"}, + {file = "rapidfuzz-3.9.5-cp312-cp312-win_arm64.whl", hash = "sha256:491d3d425b5fe3f61f3b9a70abfd498ce9139d94956db7a8551e537e017c0e57"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:518dec750a30f115ba1299ef2547cf468a69f310581a030c8a875257de747c5f"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:252dc3d1c3d613b8db1b59d13381937e420c99f8a351ffa0e78c2f54746e107f"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd17688b75b6fa983e8586cad30f36eb9736b860946cc8b633b9442c9481831"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8032492021b0aa55a623d6f6e739a5d4aaabc32af379c2a5656bf1e9e178bf1"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73362eb1c3d02f32e4c7f0d77eb284e9a13f278cff224f71e8f60e2aff5b6a5d"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a42d1f7b8988f50013e703ed27b5e216ef8a725b2f4ac53754ad0476020b26f4"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4f2e985172bb76c9179e11fb67d9c9ecbee4933740eca2977797094df02498d"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e943c5cbd10e15369be1f371ef303cb413c1008f64d93bd13762ea06ca84d59"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:0d34b0e8e29f80cb2ac8afe8fb7b01a542b136ffbf7e2b9983d11bce49398f68"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:62b8f9f58e9dffaa86fef84db2705457a58e191a962124f2b815026ba79d9aba"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ebf682bdb0f01b6b1f9a9ffe918aa3ac84fbdadb998ffbfcd5f9b12bd280170f"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3ed0c17e5b6fdd2ac3230bdefa908579971377c36aa4a2f132700fa8145040db"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-win32.whl", hash = "sha256:ac460d89b9759e37eef23fed05184179654882a241f6b2363df194f8940cc55f"}, + {file = "rapidfuzz-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:cf9aceb4227fd09f9a20e505f78487b2089d6420ce232d288522ea0a78b986b9"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14587df847d0d50bd10cde0a198b5d64eedb7484c72b825f5c2ead6e6ff16eee"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd94d952299ec73ea63a0fa4b699a2750785b6bb82aa56fd886d9023b86f90ab"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:733bf3d7876bf6d8167e6436f99d6ea16a218ec2c8eb9da6048f20b9cc8733e2"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb28f2b7173ed3678b4630b0c8b21503087d1cd082bae200dc2519ca38b26686"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a4c8a2c5ae4b133fec6b5db1af9a4126ffa6eca18a558fe5b6ab8e330d3d78"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5feb75e905281e5c669e21c98d594acc3b222a8694d9342f17df988766d83748"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d047b01637a31d9bf776b66438f574fd1db856ad14cf296c1f48bb6bef8a5aff"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9e0a656274ac75ec24499a06c0bc5eee67bcd8276c6061da7c05d549f1b1a61"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:16c982dd3cdd33cf4aac91027a263a081d1a8050dc33a27470367a391a8d1576"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:9a0c878d0980508e90e973a9cbfb591acc370085f2301c6aacadbd8362d52a36"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1d9bcfec5efd55b6268328cccd12956d833582d8da6385231a5c6c6201a1156a"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8171fc6e4645e636161a9ef5b44b20605adbefe23cd990b68d72cae0b9c12509"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-win32.whl", hash = "sha256:35088e759b083398ab3c4154517476e116653b7403604677af9a894179f1042f"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:6d8cc7e6e5c6fbcacdfe3cf7a86b60dcaf216216d86e6879ff52d488e5b11e27"}, + {file = "rapidfuzz-3.9.5-cp39-cp39-win_arm64.whl", hash = "sha256:506547889f18db0acca787ffb9f287757cbfe9f0fadddd4e07c64ce0bd924e13"}, + {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f4e0122603af2119579e9f94e172c6e460860fdcdb713164332c1951c13df999"}, + {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e46cd486289d1d8e3dab779c725f5dde77b286185d32e7b874bfc3d161e3a927"}, + {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e2c0c8bbe4f4525009e3ad9b94a39cdff5d6378233e754d0b13c29cdfaa75fc"}, + {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb47513a17c935f6ee606dcae0ea9d20a3fb0fe9ca597758472ea08be62dc54"}, + {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:976ed1105a76935b6a4d2bbc7d577be1b97b43997bcec2f29a0ab48ff6f5d6b1"}, + {file = "rapidfuzz-3.9.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9cf2028edb9ccd21d1d5aaacef2fe3e14bee4343df1c2c0f7373ef6e81013bef"}, + {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:926701c8e61319ee2e4888619143f58ddcc0e3e886668269b8e053f2d68c1e92"}, + {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:99eaa8dd8a44664813e0bef014775993ef75a134a863bc54cd855a60622203fd"}, + {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7508ef727ef4891141dd3ac7a39a2327384ece070521ac9c58f06c27d57c72d5"}, + {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f33d05db5bba1d076446c51347a6d93ff24d8f9d01b0b8b15ca8ec8b1ef382"}, + {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7252666b85c931d51a59d5308bb6827a67434917ef510747d3ce7e88ec17e7f2"}, + {file = "rapidfuzz-3.9.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d26f7299e2872d18fb7df1bc043e53aa94fc5a4a2a6a9537ad8707579fcb1668"}, + {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2b17ecc17322b659962234799e90054e420911b8ca510a7869c2f4419f9f3ecb"}, + {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3e037b9ec621dec0157d81566e7d47a91405e379335cf8f4ed3c20d61db91d8"}, + {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c4d1ba2647c8d2a82313c4dde332de750c936b94f016308339e762c2e5e53d"}, + {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:876e663b11d9067e1096ea76a2de87227c7b513aff2b60667b20417da74183e4"}, + {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adee55488490375c1604b878fbc1eb1a51fe5e6f5bd05047df2f8c6505a48728"}, + {file = "rapidfuzz-3.9.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:abb1ac683671000bd4ec215a494aba687d75a198db72188408154a19ea313ff4"}, + {file = "rapidfuzz-3.9.5.tar.gz", hash = "sha256:257f2406a671371bafd99a2a2c57f991783446bc2176b93a83d1d833e35d36df"}, ] [package.extras] @@ -4507,19 +4507,16 @@ files = [] develop = false [package.dependencies] -boto3 = "^1.34.136" +boto3 = "^1.34.150" elasticsearch = "^8.14.0" kneed = "^0.8.5" -langchain = "^0.2.6" +langchain = "^0.2.11" langchain-elasticsearch = "^0.2.2" -langchain_openai = "^0.1.9" +langchain_openai = "^0.1.19" pydantic = "^2.7.1" pydantic-settings = "^2.3.4" pytest-dotenv = "^0.5.2" tiktoken = "^0.7.0" -torch = "2.2.2" -unstructured = {version = "<0.14.9", extras = ["all-docs"]} -unstructured-inference = "^0.7.36" [package.source] type = "git" @@ -4530,105 +4527,105 @@ subdirectory = "redbox-core" [[package]] name = "redis" -version = "5.0.7" +version = "5.0.8" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, - {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, + {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, + {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, ] [package.extras] -hiredis = ["hiredis (>=1.0.0)"] +hiredis = ["hiredis (>1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] [[package]] name = "regex" -version = "2024.5.15" +version = "2024.7.24" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, - {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, - {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, - {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, - {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, - {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, - {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, - {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, - {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, - {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, - {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, - {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, - {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, - {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, - {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, - {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, - {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, - {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, - {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, - {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, - {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, - {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, - {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, - {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, - {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, - {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, - {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, ] [[package]] @@ -5244,13 +5241,13 @@ blobfile = ["blobfile (>=2)"] [[package]] name = "timm" -version = "1.0.7" +version = "1.0.8" description = "PyTorch Image Models" optional = false python-versions = ">=3.8" files = [ - {file = "timm-1.0.7-py3-none-any.whl", hash = "sha256:942ced65b47b5ec12b8df07eb8ee929f1bb310402155b28931ab7a85ecc1cef2"}, - {file = "timm-1.0.7.tar.gz", hash = "sha256:d1d26d906b5e188d7e7d536a6a0999568bb184f884f9a334c48d46fc6dc166c8"}, + {file = "timm-1.0.8-py3-none-any.whl", hash = "sha256:2e4cf9e2224616fdb08e5f7a2972bd20e05f750236ea1f8dd53f3f326ceaee83"}, + {file = "timm-1.0.8.tar.gz", hash = "sha256:f54a579f1cc39c43d99a4b03603e39c4cee87d4f0a08aba9c22e19064b30bf95"}, ] [package.dependencies] @@ -5498,19 +5495,19 @@ telegram = ["requests"] [[package]] name = "transformers" -version = "4.42.4" +version = "4.43.3" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = false python-versions = ">=3.8.0" files = [ - {file = "transformers-4.42.4-py3-none-any.whl", hash = "sha256:6d59061392d0f1da312af29c962df9017ff3c0108c681a56d1bc981004d16d24"}, - {file = "transformers-4.42.4.tar.gz", hash = "sha256:f956e25e24df851f650cb2c158b6f4352dfae9d702f04c113ed24fc36ce7ae2d"}, + {file = "transformers-4.43.3-py3-none-any.whl", hash = "sha256:6552beada5d826c25ff9b79139d237ab9050c6ea96b73d7fd2f8a8ba23ee76a4"}, + {file = "transformers-4.43.3.tar.gz", hash = "sha256:820c5b192bb1bf47250802901a8f0bf581e06b8fded89179d4ef08a1e903ee1c"}, ] [package.dependencies] filelock = "*" huggingface-hub = ">=0.23.2,<1.0" -numpy = ">=1.17,<2.0" +numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" @@ -5522,14 +5519,14 @@ tqdm = ">=4.27" [package.extras] accelerate = ["accelerate (>=0.21.0)"] agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] -all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] benchmark = ["optimum-benchmark (>=0.2.0)"] codecarbon = ["codecarbon (==1.2.0)"] deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] @@ -5552,15 +5549,15 @@ sigopt = ["sigopt"] sklearn = ["scikit-learn"] speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] -tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] -tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] +tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm (<=0.9.16)"] tokenizers = ["tokenizers (>=0.19,<0.20)"] torch = ["accelerate (>=0.21.0)", "torch"] torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17,<2.0)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow (>=10.0.1,<=15.0)"] @@ -5759,13 +5756,13 @@ xlsx = ["networkx", "openpyxl", "pandas", "xlrd"] [[package]] name = "unstructured-client" -version = "0.24.1" +version = "0.25.0" description = "Python Client SDK for Unstructured API" optional = false python-versions = ">=3.8" files = [ - {file = "unstructured-client-0.24.1.tar.gz", hash = "sha256:1bd82a532497783dd77b30ed4e56837d6abfae8cc6d61442acac0bcacbd568c8"}, - {file = "unstructured_client-0.24.1-py3-none-any.whl", hash = "sha256:044dab0c3079f908f6adf7088ad44f0e17476b47e2b04e0de608134a482bd0e3"}, + {file = "unstructured-client-0.25.0.tar.gz", hash = "sha256:01d716b1423f6d2829a7121e1ff1f27ebcc77657615f6d13e6d0fb98e52a988c"}, + {file = "unstructured_client-0.25.0-py3-none-any.whl", hash = "sha256:04263164d5cc041dff2979e36d2fe216e0a1e95c465f9c9b29ae605091e924a0"}, ] [package.dependencies]